好记性,不如烂笔头!读源码,做总结。 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 部分