Хорошо, есть куча вопросов по этому поводу и много материалов для чтения в Google, но я почему-то не могу это понять. Я хочу получить основную частоту отрезка речи. Предполагается, что основные шаги будут следующими:
- взять БПФ оконного сигнала
- преобразовать БПФ из прямоугольных в полярные координаты (чтобы вы могли получить величину)
- отбросить информацию о фазе
- возьмите квадрат, затем натуральный логарифм каждой ячейки величины
- возьмите еще одно БПФ (или некоторые источники говорят, возьмите обратное БПФ?)
Вот как я реализовал это в AS3:
var signal:Vector.<Number> = my1024PointSignal; // an audio signal 1024 samples long
var imx:Vector.<Number> = new Vector.<Number>(signal.length); // 1024 point vector to hold imaginary part of fft
hammingWindow(signal); // window it
zeroFill(imx); // fill imx with zeros
FFT(signal, imx); // convert signal into real and imaginary components of fft
toPolar(signal, imx); // convert fft to polar coordinates
// square each bin, and take the log of each bin, discard phase
for (var i:int = 0, l:int = signal.length; i < l; i++) {
signal[i] = Math.log(Math.pow(signal[i], 2));
imx[i] = 0;
}
FFT(signal, imx); // or maybe inverseFFT(signal, imx), i don't know
Теперь, когда я делаю это и заканчиваю БПФ, когда я рисую его, ячейки оказываются в обратном порядке? Я также вижу больший пик на второй гармонике, чем на основной. Когда я делаю это и использую обратное БПФ, я получаю звуковой сигнал, который выглядит отраженным вокруг N / 2, и снова кажется, что пики перевернуты. К тому же все это довольно шумно. Что я делаю неправильно?