Как выполнить кепстр для определения высоты звука

Хорошо, есть куча вопросов по этому поводу и много материалов для чтения в 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, и снова кажется, что пики перевернуты. К тому же все это довольно шумно. Что я делаю неправильно?


person Rob Allsopp    schedule 09.12.2014    source источник


Ответы (1)


Для Cepstrum я всегда использовал следующие шаги:

  1. Применение окон Хэмминга в сигнале (1024 или 2048 точек)
  2. Применить БПФ
  3. Получите величину
  4. используйте только значения первой половины
  5. Преобразовать в логарифмический масштаб
  6. Применить IFFT
  7. Найдите пик

Уравнение для кепстра:

 IFFT(log(abs(FFT(s))))

Может быть, вы видите отражение, потому что не прошли четвертый шаг (4)

Разница между окончанием ОБПФ и завершением БПФ?

Разница заключается в представлении масштаба, если вы закончите использовать БПФ, вам нужно извлечь только реальную информацию, для обоих приведенных ниже уравнений вы получите одинаковую форму:

IFFT(log(abs(FFT(s)))) == real(FFT(log(abs(FFT(s)))))

Пример сюжета из кепстра:

Для IFFT(log(abs(FFT(s)))):

введите описание изображения здесь

Для real(FFT(log(abs(FFT(s))))):

введите описание изображения здесь

Это пример кепстра из 4096 точек синуса на 440 Гц с дискретизацией на 44100 Гц.

person ederwander    schedule 09.12.2014
comment
Знаете ли вы, в чем разница между окончанием ОБПФ и завершением БПФ? - person Rob Allsopp; 10.12.2014
comment
извините за долгий пробел, раньше не видел вашего комментария. Загляните в редакцию. - person ederwander; 21.02.2015