MATLAB實現語音頻號分幀

2021-10-25 07:04:02 字數 1515 閱讀 3623

為了分析讀入資料,通常進行分幀處理。在分幀中,往往設定在相鄰兩幀之間有一部分重疊,如下圖所示:

設語音檔案的資料存放在y中,y的長度為n,取樣頻率為fs,取每幀長為wlen,後一幀對前一幀的位移量用inc表示,相鄰兩幀之間的重疊部分overlap=wlen-inc。

f=enframe(x,win,inc)
x是資料,win是窗函式,inc是後一幀對前一幀的位移量

function f=

enframe

(x,win,inc)

nx=length(x

(:))

;% 取資料長度

nwin=

length

(win)

;% 取窗長

if(nwin ==1)

% 判斷窗長是否為1,若為1,即表示沒有設窗函式

len = win;

% 是,幀長=win

else

len = nwin;

% 否,幀長=窗長

endif

(nargin <3)

% 如果只有兩個引數,設幀inc=幀長

inc = len;

endnf =

fix(

(nx-len+inc)

/inc)

;% 計算幀數

f=zeros

(nf,len)

;% 初始化

indf= inc*(0

:(nf-1)

).';

% 設定每幀在x中的位移量位置

inds =(1

:len)

;% 每幀資料對應1

:lenf(

:)=x

(indf(:

,ones(1

,len))+

inds

(ones

(nf,1)

,:))

;% 對資料分幀

if(nwin >1)

% 若引數中包括窗函式,把每幀乘以窗函式

w =win(

:)';

% 把win轉成行資料

f = f .*w

(ones

(nf,1)

,:);

% 乘窗函式

% 分幀後計算每幀對應的時間

frametime=((

(1:framenum)-1

)*inc+framelen/2)

/fs;

語音頻號處理中怎麼理解分幀?

那麼一幀有多長呢?幀長要滿足兩個條件 從巨集觀上看,它必須足夠短來保證幀內訊號是平穩的。前面說過,口型的變化是導致訊號不平穩的原因,所以在一幀的期間內口型不能有明顯變化,即一幀的長度應當小於乙個音素的長度。正常語速下,音素的持續時間大約是 50 200 毫秒,所以幀長一般取為小於 50 毫秒。從微觀...

MATLAB實現語音頻號短時傅利葉變換

function d stftms x,win,nfft,inc iflength win 1 判斷有否設定窗函式 wlen win 否,設幀長 win hanning wlen 設定窗函式 else wlen length win 設幀長 endx x win win 把x和win都變為列陣列 s...

語音增強演算法研究系列筆記 語音頻號加窗分幀處理

幀移參考鏈結 語音頻號屬於一種非平穩時變訊號,其產生過程與發聲器官地運動緊密相關,而發聲器官地狀態速率相對聲音振動地速率來說慢很多,因此語音頻號可以視為短時平穩訊號,因此,對其進行加窗分幀可將語音頻號視為乙個平穩訊號,更便於進行分析 對於語音頻號來說,幀長需要滿足兩個條件 從巨集觀上講,它必須足夠短...