2014-12-09 9 views
0

Хорошо, здесь есть множество вопросов, и много материала для чтения на google, но я почему-то не могу это понять. Я хочу получить основную частоту сегмента речи. Основные шаги должны быть:Как выполнить кепструм для определения высоты тона

  • взять БПФ оконного сигнала
  • преобразование FFT от прямоугольного до полярных координат (так что вы можете получить величину)
  • отбрасывать информацию о фазе
  • взять квадрат, то натуральный логарифм каждого бина величины
  • взять другой FFT (или некоторые источники говорят, взять обратный FFT?)

Вот как я реализовал это в 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 

Теперь, когда я делаю это и конец, принимая FFT, когда я сюжет его бины, как представляется, в обратном порядке? Я также вижу больший пик на второй гармонике, чем на фундаментальной. Когда я делаю это и беру обратный БПФ, я получаю звуковой сигнал, который выглядит отраженным вокруг N/2, и снова пики кажутся обратными. Все это тоже довольно шумно. Что я делаю не так?

ответ

0

Для кепстре я всегда использовал для этого шаги:

  1. Применить кривляется окна в сигнале (1024 или 2048 точек)
  2. Применить FFT
  3. Получить величину
  4. использование только первая половина ЗНАЧЕНИЯ
  5. Преобразовать в логарифмической шкале
  6. Применить IFFT
  7. Найти Пик

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

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

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

Разницы между оканчивающимся на IFFT и заканчивается БПФ?

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

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

пример Участок от кепстре:

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

enter image description here

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

enter image description here

Это является Кепстр пример из синуса 4096 точек в 440Hz пробы 44100Гц

+0

Вы знаете, в чем разница между окончание с IFFT и заканчивая БПФ? –

+0

Извините за длинный пробел, раньше не видел вашего комментария. Посмотрите в редактировании. – ederwander

 Смежные вопросы

  • Нет связанных вопросов^_^