Я пытаюсь извлечь основную частоту из источника звука. Может быть, кто-то поет 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 и т.д ... хотя некоторые могут отсутствовать.
реально у меня есть ощущение, что это всегда будет либо фундаментальная, либо первая гармоника, обладающая наибольшей силой. но я не знаю, могу ли я положиться на это ...
так много факторов, это заставляет мою голову плавать. Заранее извиняюсь за такой грязный вопрос. Надеюсь, я смогу привести в порядок посмертно.