Алгоритм определения основной частоты из потенциальных гармоник - PullRequest
16 голосов
/ 17 января 2011

Я пытаюсь извлечь основную частоту из источника звука. Может быть, кто-то поет A3 в микрофон, поэтому я хочу, чтобы обнаружение ~ 110 Гц

мой подход:

  • FFT 1024 поплавков
  • используйте фазу каждого бина, чтобы точно определить его точную частоту
  • определить пики (обычно 50 или около того)
  • закажите их сначала самым громким

(Пик [0] .power = 1063.343750, .freq = 2032.715088
(Пик [1] ​​.power = 1047.764893, .freq = 3070.605225
(Пик [2] .power = 1014.986877, .freq = 5925.878418
(Пик [3] .power = 1011.707825, .freq = 6963.769043
(Пик [4] .power = 1009.152954, .freq = 4022.363037
(Пик [5] .power = 995.199585, .freq = 4974.120605
(Пик [6] .power = 987.243713, .freq = 8087.792480
(Пик [7] .power = 533.514832, .freq = 908.691833

  • (MARKER1) начните с самого громкого и сопоставьте его со всеми оставшимися пиками, поэтому, если бы у меня было N пиков, у меня будет N-1 пиковых пар
  • проверить каждую пиковую пару на гармоничность; то есть, насколько это близко к некоторой дроби a / b, то есть можем ли мы найти a / b с b <20, для которого | peakA.freq / peakB.freq - a / b | <0,01 (это соответствует гармоникам до 20-го) </li>
  • теперь у нас есть уточненный список пиков, которые считаются гармоничными друг другу

    Harmonic PeakPair: (0,1) = 2/3, ошибка: 0,00468 => f0 @ 1019.946289
    Harmonic PeakPair: (0,2) = 1/3, ошибка: 0,00969 => f0 @ 2004.003906
    Harmonic PeakPair: (0,3) = 2/7, ошибка: 0,00618 => f0 @ 1005,590820
    Harmonic PeakPair: (0,4) = 1/2, ошибка: 0,00535 => f0 @ 2021,948242
    Harmonic PeakPair: (0,5) = 2/5, ошибка: 0,00866 => f0 @ 1005,590820
    Harmonic PeakPair: (0,6) = 1/4, ошибка: 0,00133 => f0 @ 2027,331543
    Harmonic PeakPair: (0,7) = 9/4, ошибка: 0,01303 => f0 @ 226,515106

Мой вопрос: как я могу разработать алгоритм, который будет правильно идентифицировать вышеупомянутый фундаментальный как ~ 1000 Гц?

Ни в коем случае не гарантируется, что при ~ 1000 будет более высокая концентрация значений, чем при ~ 2000 или ~ 3000 и т. Д., Даже не гарантируется, что будет какая-либо запись ~ 1000. у нас может быть ~ 5000 x одна запись, ~ 4000 x три записи, ~ 3000 x 2 записи и пара фиктивных значений, плавающих вокруг, как 226 в приведенном выше списке.

Полагаю, я могу повторить процедуру снова, отсекая предложенные основы, которые не «гармоничны» с остальной частью списка. это, по крайней мере, избавило бы от поддельных значений ...

может быть, я даже не задаю правильный вопрос. Может быть, весь этот подход отстой. Но я думаю, что имеет смысл выбрать самый сильный пик и извлечь набор гармоник, связанных с этим пиком.

в теории, которая должна генерировать нагрузку отношений, скажем, если исходный самый сильный пик был третьей гармоникой, то этот набор пиков должен содержать 3/1 3/2 3/3 3/4 3/5 3/6 3 / 7 и т.д ... хотя некоторые могут отсутствовать.

реально у меня есть ощущение, что это всегда будет либо фундаментальная, либо первая гармоника, обладающая наибольшей силой. но я не знаю, могу ли я положиться на это ...

так много факторов, это заставляет мою голову плавать. Заранее извиняюсь за такой грязный вопрос. Надеюсь, я смогу привести в порядок посмертно.

Ответы [ 3 ]

8 голосов
/ 19 января 2011

Cepstum (или Cepstral анализ) и Harmonic Product Spectrum - это два хорошо изученных алгоритма, которые оценивают частоту возбудителя по серии обертонов.

Если последовательности обертонов разнесены соответствующим образом, то для оценки периода разнесения частот может быть полезен Cepstrum (FFT журнала пиков FFT), который затем можно использовать для оценки частоты.

Гармонический спектр продуктов в основном сравнивает спектральные пики с n-ю множественными копиями самих себя, децимируя спектр с помощью нескольких низких целочисленных соотношений и перекрывая их.

2 голосов
/ 21 ноября 2011

Вы можете перейти по следующей ссылке для статьи о распознавании речи.

Статья: Параметр распределения точек в фазовом пространстве для распознавания речи (для полного текста необходима подписка)

1 голос
/ 01 февраля 2011

Я перефразировал вопрос и дал ответ здесь: Как взять набор чисел типа {301,102,99,202,198,103} и выбросить ~ 100?

Я посмотрелна нескольких подходах, и это значительно более кратко, чем все остальное, что я нашел.Я проверил это, и оно работает очень хорошо.

...