好記性,不如爛筆頭!讀源碼,做總結。 http://kaldi-asr.org http://kaldi-asr.org/doc/classkaldi_1_1MelBanks.html#a28c12e3d92fbb958fadef3b3688ac5be
本文重點總結一下,MelBanks() VtlnWarpMelFreq() : 通過改變濾波器頻率密度,實現對某個頻段的信號加強。
本文使用Mel頻率計算公式 : mel_frequency = 1127.0 * ln(1.0 + frequency / 700.0) (還有一個計算公式為 2595.0 * lg(1.0 + frequency / 700.0), 計算結果只有細微差別)
圖一
高低通截止頻率:low_freq = 40, high_freq = 7800 ; 濾波器個數: num_mel_bins = 23 ; vtln_low = 1000, vtln_high = 5000,frame_length = 14 (ms), sample_frequency = 16000
=> fft_bin_width = 62.5, mel_freq_delta = 114.6333, window_length_padded = 256
不做彎折(para_warp = 1.0)
生成在梅爾頻域等頻帶寬度的23個濾波器,相當於在在圖一中y軸等距,那么在x軸上(現實頻域)的效果就是越靠后的濾波器現實頻帶越寬,由於濾波器上點是根據現實頻率等距跳動,所以最后效果就是約往后的濾波器上點越多,這些點的取值范圍都是(0,1)
圖二
彎折(para_warp = 2.0 > 1.0)
濾波器越往后,梅爾頻域帶寬越寬,那么現實頻域這種帶寬增長就更猛了,相較於para_warp=1.0,靠前濾波器,頻帶寬度變窄,點變少,靠后濾波器,頻帶寬度變寬,點變多。(應該具體值分的更細一些的。。。。。)
圖三
彎折(para_warp = 0.5 < 1.0)
相較於para_warp=1.0,靠前濾波器,頻帶寬度變寬,點變多,靠后濾波器,頻帶寬度變窄,點變少。(應該具體值分的更細一些的。。。。。)
圖四
VtlnWarpMelFreq()功能
參數列表:vtln_low_cutoff, vtln_high_cutoff, low_freq, high_freq, vtln_warp_factor, freq
vtln_low_cutoff = 3000
vtln_high_cutoff = 6000
low_freq = 1000
high_freq = 7000
注:圖五、圖六,橘色的直線為 y = x
para_warp > 1
圖五
拐點:low_freq、vtln_low(第二段,第三段的斜率有點接近,在這幅圖里看不出區別,尷尬。。)、vtln_high、high_freq
para_warp < 1
圖六
拐點:low_freq、vtln_low、vtln_high、high_freq(第三段,第四段的斜率有點接近,在這幅圖里也看不出區別,尷尬。。)
總結:當warp > 1 , 加強的實際是 vtln_high < freq < high_freq 部分,warp < 1 , 加強的是low_freq < freq < vtln_low 部分