Алгоритм определения основной частоты из потенциальных гармоник
Я пытаюсь извлечь основную частоту из источника звука. может быть, кто-то поет 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 ответа
Я перефразировал вопрос и дал ответ здесь: как взять набор чисел типа {301,102,99,202,198,103} и выбросить ~100?
Я рассмотрел несколько подходов, и это значительно более кратко, чем все остальное, что я нашел. Я проверил это, и это работает очень хорошо.
Cepstum (или Cepstral analysis) и Harmonic Product Spectrum - это два хорошо изученных алгоритма, которые оценивают частоту возбудителя по серии обертонов.
Если последовательности обертонов должным образом разнесены, то для оценки периода разнесения частот может быть полезен Cepstrum (FFT журнала пиков FFT), который затем можно использовать для оценки частоты.
Гармонический Спектр Продукта в основном сравнивает спектральные пики с n-ой множественной копией самих себя, децимируя спектр с помощью нескольких низких целочисленных соотношений и перекрывая их.
Вы можете перейти по следующей ссылке для статьи о распознавании речи.
Статья: Параметр распределения точки фазового пространства для распознавания речи (для полного текста необходима подписка)