matlab處理語音信號(1)-短時處理

語音信號是一個非穩態的、時變的信號。

短時,是指10ms-30ms,在短時分析中,將語音信號分爲一段一段地來分析其特徵參數,其中每一段稱爲一"幀",幀長一般取10~30 ms。這樣,對於整體的語音信號來講,每一幀特徵參數組成了特徵參數時間序列。

1、讀入wav數據

輸入參數wavFilename是指以.wav爲擴展名的音頻文件名稱。

輸出參數:y是數字化的音頻信號;fs是採樣頻率;nbits是每個樣點在編碼時的二進制位數(比特數)

function frameTime=frame2time(frameNum,framelen,inc,fs)
% 分幀後計算每幀對應的時間
frameTime=(((1:frameNum)-1)*inc+framelen/2)/fs;

2、分幁

產生重疊:在兩個不重疊的幀之間插一些幀來提取特徵參數,這就形成了相鄰幀之間有重疊部分, 

設讀入語音文件的數據存放在y中,y長爲N,採樣頻率爲f,取每幀長爲wlen,後一幀對前一幀的位移量(簡稱爲幀移)用inc表示

 

輸入參數: x是語音信號;win是幀長或窗函數,若爲窗函數,幀長便取窗函數長;inc是幀移。

輸出參數:f是分幀後的數組,將爲幀數×幀長。f x L

function f=enframe(x,win,inc)

nx=length(x(:));            % 取數據長度
nwin=length(win);           % 取窗長
if (nwin == 1)              % 判斷窗長是否爲1,若爲1,即表示沒有設窗函數
   len = win;               % 是,幀長=win
else
   len = nwin;              % 否,幀長=窗長
end
if (nargin < 3)             % 如果只有兩個參數,設幀inc=幀長
   inc = len;
end
nf = fix((nx-len+inc)/inc); % 計算幀數
f=zeros(nf,len);            % 初始化
indf= inc*(0:(nf-1)).';     % 設置每幀在x中的位移量位置
inds = (1:len);             % 每幀數據對應1:len
f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));   % 對數據分幀
if (nwin > 1)               % 若參數中包括窗函數,把每幀乘以窗函數
    w = win(:)';            % 把win轉成行數據
    f = f .* w(ones(nf,1),:);  % 乘窗函數
end

常用三種窗函數

 

 

3、時域分析

能量:

 應用:

平均幅度

 應用:

平均過零率

短時平均過零率表示一幀語音中語音信號波形穿過橫軸(零電平)的次數

 應用:

在實際計算短時平均過零率參數時,需要十分注意的一個問題是,如果輸入信號中包含漂移,即信號在通往AD轉換器前就有一個直流分量,使AD轉換後繼續帶有這個直流分量。因爲直流分量的存在影響了短時平均過零率的正確估算,所以建議在語音信號處理前先消除直
流分量。



頻域:

stft 短時傅里葉變換

function d=stftms(x,win,nfft,inc)
if length(win)==1          % 判斷有否設置窗函數
    wlen=win;              % 否,設幀長
    win=hanning(wlen);     % 設置窗函數
else
    wlen=length(win);      % 設幀長
end
x=x(:); win=win(:);        % 把x和win都變爲列數組
s = length(x);             % 計算x的長度

c = 1;
d = zeros((1+nfft/2),1+fix((s-wlen)/inc));   % 初始化輸出數組
 
for b = 0:inc:(s-wlen)           % 設置循環
  u = win.*x((b+1):(b+wlen));    % 取來一幀數據加窗
  t = fft(u,nfft);               % 進行傅里葉變換
  d(:,c) = t(1:(1+nfft/2));      % 取1到1+nfft/2之間的譜值
  c = c+1;                       % 改變幀數,求取下一幀
end;

短時功率譜密度 

function [Pxx] = pwelch_2(x, nwind, noverlap, w_nwind, w_noverlap, nfft)
% 計算短時功率譜密度函數
% x是信號,nwind是每幀長度,noverlap是每幀重疊的樣點數
% w_nwind是每段的窗函數,或相應的段長,
% w_noverlap是每段之間的重疊的樣點數,nfft是FFT的長度

x=x(:);
inc=nwind-noverlap;       % 計算幀移
X=enframe(x,nwind,inc)';  % 分幀
frameNum=size(X,2);       % 計算幀數
%用pwelch函數對每幀計算功率譜密度函數
for k=1 : frameNum
    Pxx(:,k)=pwelch(X(:,k),w_nwind,w_noverlap,nfft);
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章