為了分析讀入資料,通常進行分幀處理。在分幀中,往往設定在相鄰兩幀之間有一部分重疊,如下圖所示:
設語音檔案的資料存放在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...
語音增強演算法研究系列筆記 語音頻號加窗分幀處理
幀移參考鏈結 語音頻號屬於一種非平穩時變訊號,其產生過程與發聲器官地運動緊密相關,而發聲器官地狀態速率相對聲音振動地速率來說慢很多,因此語音頻號可以視為短時平穩訊號,因此,對其進行加窗分幀可將語音頻號視為乙個平穩訊號,更便於進行分析 對於語音頻號來說,幀長需要滿足兩個條件 從巨集觀上講,它必須足夠短...