Дело в том, что для распознавания необходим весь спектр, поэтому алгоритм Гёрцеля не подходит.
По поводу изменения частоты дискретизации. Для сравнения результатов в MATLAB построено два спектра:
– первый (чёрный) – исходный вариант, ДПФ на 348 точки;
– второй (красный) – после передискретизации, БПФ на 512 точек.
Графики построены в координатах частота – амплитуда.
Вот из-за такой разницы алгоритм распознавания ухудшается (значительно увеличивается расстояние даже между одинаковыми словами (примерно в три раза)). Если возможно, применялось бы БПФ.
Вот пример кода из MATLAB:
y = audioread('1.wav');
N = length(y);
T = 30; %Число кадров
K = ceil(2*N/(T+1)); %Число отсчётов в кадре
Fs = 8000; %Частота дискретизации
%Желаемые параметры сигнала
Kwant = 512;
Nwant = Kwant/2 * (T+1); %Длина всего сигнала, чтобы число отсчётов в кадре было 512
Fswant= Nwant/N * Fs;
%Интерполируем
Y = interp1(1:N, y, 1:N/Nwant:N, 'linear');
frame1 = y(1:K);
fft_frame1 = abs(fft(frame1));
frame1Y = Y(1:Kwant);
fft_frame1Y = abs(fft(frame1Y));
fky = 1:Fs/K:Fs;
fkY = 1:Fswant/Kwant:Fswant;
fft_frame1y = zeros(size(frame1Y));
fft_frame1y(1:K) = fft_frame1;
plot(fkY, fft_frame1Y,'r', fkY,fft_frame1y,'k');
xlabel 'частота, Гц'