Алгоритм определения основной частоты от потенциальных гармоник

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

мой подход:

  • FFT 1024 floats
  • используйте фазу каждого бункера для точного определения его точной частоты.
  • определить пики (обычно 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-го).
  • теперь у нас есть уточненный список пиков, которые считаются гармоническими друг с другом

    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 и т.д., Хотя некоторые могут отсутствовать.

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

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

Ответы

Ответ 2

A Cepstum (или Cepstral analysis) и спектр гармонических продуктов представляют собой два хорошо изученных алгоритма, которые оценивают частоту возбудителя из обертонного ряда.

Если последовательности обертонов расположены соответственно друг от друга, то кепстр (БПФ журнала БПФ-пиков) может быть полезен при оценке периода интервала частот, который затем может использоваться для оценки частоты.

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