Как создать банк треугольных (Mel) фильтров, используемый в MFCC для распознавания речи в MATLAB?
Хотя могут быть доступны встроенные функции, мне нужно создать собственный банк треугольных фильтров. Ниже мой код для этого. Я получаю значения NaN в моем HMatrix (filterbank). Это связано с "одинаковыми" значениями в моем FreqArray, которые использовались при создании матрицы. Мне нужна помощь в следующих вопросах:
- Зная, верна ли выбранная мной частота дискретизации 44100 Гц или нет?
- Как выбрать нижнюю частоту =300 Гц и верхнюю частоту =8000 Гц для расчета матрицы фильтров Mel Bank?
- Как выбрать подходящий размер кадра (frame_length) и количество фильтров mel (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
Код основан на приведенном ниже уравнении:
Основные части вывода вышеприведенного кода приведены ниже для справки.
Для справки я использовал следующий сайт:
Заранее спасибо!
1 ответ
Зная, верна ли выбранная мной частота дискретизации 44100 Гц или нет?
Эта частота в порядке. Речь в любом случае ниже 16 кГц, поэтому 16 кГц является более частым выбором. В сообщении блога, которое вы использовали для справки, это 16 кГц.
Как выбрать нижнюю частоту =300 Гц и верхнюю частоту =8000 Гц для расчета матрицы фильтров Mel Bank?
Этот диапазон не самый лучший, но подходит для большинства приложений. Для высококачественного звука диапазон составляет от 20 Гц до 7600 Гц.
Как выбрать подходящий размер кадра (frame_length) и количество фильтров mel (no_of_coeffs)?
Размер кадра для речи обычно составляет около 25 миллисекунд, это оптимальное значение для обеспечения стационарности в пределах одного кадра и разрешения для речи с нормальной скоростью. Для частоты дискретизации 44100 кГц это заканчивается примерно 1128 (44100 * 0,025) элементами в кадре, а не 256, как вы выбрали. Если вы хотите иметь степень 2, то вам нужно 2048 элементов в кадре. Это был бы заказ FFT тоже.
Количество фильтров расплава может составлять 15-40, 20 - это хорошее значение, используемое во многих системах, оно оказалось полезным в эксперименте.
Лучше прочитать существующую реализацию, есть много конкретных вещей, которые вы не получите из учебника, хорошая - VoiceBox.