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

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

мой подход:

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

(Peak [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
(Peak [7] .power = 533.514832, .freq = 908.691833

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

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

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

16
задан P i 17 January 2011 в 18:42
поделиться