【问题标题】:How to create a Triangular (Mel) Filter Bank used in MFCC for speech recognition in MATLAB?如何在 MFCC 中创建用于在 MATLAB 中进行语音识别的三角(Mel)滤波器组?
【发布时间】:2017-08-01 09:45:01
【问题描述】:

虽然可能有可用的内置函数,但我需要创建自己的三角滤波器组。下面是我的代码。我在我的 HMatrix (filterbank) 中得到 NaN 值。这是由于创建矩阵时使用的 FreqArray 中的“相同”值。我在以下问题上需要帮助:

  1. 知道我选择的44100Hz的采样频率是否正确?
  2. 如何选择低频=300Hz和高频=8000Hz来计算梅尔滤波器组矩阵?
  3. 如何选择合适的帧大小(frame_length)和梅尔滤波器数量(no_of_coeffs)?

函数 TriFilterBank() 抽动 %--------------------------初始化------ --------% fs=44100; %frequency at which I have sampled my recorded samples frame_length=256; %How to choose an appropriate frame-size? low_freq=300; %lower frequency for calculation of mel frequency filter bank (I'm unable to choose a correct one, and find the criteria for choosing it) high_freq=8000; %upper frequency for calculation of mel frequency filter bank (I'm unable to choose a correct one, and find the criteria for choosing it) % I have also tried with (fs/2)=22050Hz, but nno good results no_of_coeffs=20; % This is no. of Mel-Filter banks to create. how to choose a approriate value for this for speech processing applications? %--------------------------------------------------PRE-PROCESSING FOR MEL FILTER BANK CREATION-----------------------------------------------% low_linear=2595*log10(1+(low_freq/700)); high_linear=2595*log10(1+(high_freq/700)); band_length=(high_linear-low_linear)/(no_of_coeffs+1); MelArray(no_of_coeffs+2,1)=zeros(); %to store mel frequencies to calculate mel frequency filter bank LinearArray(no_of_coeffs+2,1)=zeros(); %to store linear frequencies to calculate mel frequency filter bank FreqArray(no_of_coeffs+2,1)=zeros(); %to store frequency array to calculate mel frequency filter bank %{ THIS ARRAY MAY HAVE WRONG VALUES DUE TO SELECTION of WRONG PARAMETERS LIKE low_freq, high_freq, frame_length (frame-size), no_of_coeffs (no. of filter banks). THIS IS MAJOR REASON BEHIND GENERATION OF NaN values in HMatrix %} HMatrix(no_of_coeffs,frame_length)=zeros(); %Hmk Matrix/ Filter Bank I'M VERY DOUBTFUL OF THE VALUES GENERATED BY THIS FILTER BANK MelArray(1)=low_linear; MelArray(no_of_coeffs+2)=high_linear; LinearArray(1)=low_freq; LinearArray(no_of_coeffs+2)=high_freq; FreqArray(1)=floor((int32(frame_length)+1)*LinearArray(1)/fs); FreqArray(no_of_coeffs+2)=floor((int32(frame_length)+1)*LinearArray(no_of_coeffs+2)/fs); for m=1:no_of_coeffs MelArray(m+1)=MelArray(m)+band_length; LinearArray(m+1)=700*((power( 10,MelArray(m+1)/2595))-1); FreqArray(m+1)=floor((int32(frame_length)+1)*LinearArray(m+1)/fs); %The values generated here seem to be doubtful, hence maybe an incorrect filter bank end % THE MOST DOUBTFUL/WRONG PART i.e. MEL FREQUENCY FILTER BANK MATRIX CREATION %---------------------------------------------------------PROBABLE ERRONEOUS PART------------------------------------------------------------% % I'M GETTING NaN values in this matrix probably due to choosing incorrect parameters for like upper freq, lower freq, frame-size, no.of filter banks, sampling frequency etc. % In FreqArray I'm getting two same values, hence it's satisfying none of the below conditions and generating a NaN value. for k=1:frame_length for m=1:no_of_coeffs if(k<FreqArray(m)) HMatrix(m,k)=0; elseif (FreqArray(m)<=k && k<=FreqArray(m+1)) HMatrix(m,k)=(k-FreqArray(m))/(FreqArray(m+1)-FreqArray(m)); elseif(FreqArray(m+1)<=k && k<=FreqArray(m+2)) HMatrix(m,k)=(FreqArray(m+2)-k)/(FreqArray(m+2)-FreqArray(m+1)); elseif (k>FreqArray(m+2)) HMatrix(m,k)=0; end end end %--------------------------------------------------------------------------------------------------------------------------------------------% save('TriFilterBank'); toc end

代码基于以下等式:

以上代码输出的主要部分如下所示,以供参考。

作为参考,我使用了以下网站:

http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/

提前致谢!

【问题讨论】:

    标签: matlab speech-recognition mfcc filter-bank


    【解决方案1】:

    知道我选择的44100Hz的采样频率是否正确吗?

    这个频率很好。无论如何,语音都低于 16khz,因此 16kHz 是更常见的选择。在您用作参考的博文中,它是 16kHz。

    如何选择低频=300Hz和高频=8000Hz来计算梅尔滤波器组矩阵?

    这个范围不是最好的,但对于大多数应用来说都可以。对于高质量的声音,范围是 20Hz 到 7600Hz。

    如何选择合适的帧大小(frame_length)和mel过滤器数量(no_of_coeffs)?

    语音的帧大小通常在 25 毫秒左右,它是提供一帧内的平稳性和正常速率语音的分辨率的最佳值。对于 44100 kHz 采样率,这以帧中大约 1128 (44100 * 0.025) 个元素结束,而不是您选择的 256 个元素。如果你想要 2 的幂,那么你需要 2048 个元素在一帧中。这也是 FFT 顺序。

    mel 过滤器的数量可以是 15-40,20 是一个很好的值,在许多系统中使用,它在实验中发现是有用的。

    最好阅读现有的实现,有很多具体的东西你不会从教程中得到,一个好的是VoiceBox

    【讨论】:

    • 非常感谢您的帮助。我会试试这个,然后回复你!
    猜你喜欢
    • 2019-05-05
    • 2017-03-04
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2013-04-22
    • 2020-06-11
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多