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

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

мой подход:

БПФ 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-го)

Теперь у нас есть уточненный список пиков, которые считаются гармоничными друг с другом

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)

Ваш ответ на вопрос