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

аюсь извлечь основную частоту из источника звука. может быть, кто-то поет 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 и т. д. ... хотя некоторые могут отсутствовать.

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

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

 DarenW18 янв. 2011 г., 18:02
Этот вопрос охватывает ту же почву:stackoverflow.com/q/4583950/10468 Но с «кепстральным» в названии, кто-то, не знакомый с этим термином, может не признать этот вопрос актуальным. Это действительно говорит "обнаружение подачи", все же.
 Paul R17 янв. 2011 г., 20:00
Возможно, вы захотите использовать автокорреляционный или кепстральный анализ.
 P i17 янв. 2011 г., 19:47
по некоторым причинам намного сложнее обнаружить гитарные тоны, чем спетые. Хотя, возможно, это потому, что я перехватываю первые несколько кадров заметки; 32 х 256 байт = 8 Кб, так что это примерно первая 1/5 сек. так что, думаю, записке нужно время, чтобы стабилизироваться ...
 P i17 янв. 2011 г., 19:49
Я вставил маркер, потому что в какой-то момент я хотел бы вытащить полный тон и повторить процесс заново для каждого тона, пока ничего не будет обнаружено. Таким образом, я мог поймать полную полифонию.
 mtrw19 янв. 2011 г., 23:28
Вы говорите: «У меня есть ощущение, что это всегда будет либо фундаментальная, либо первая гармоника, обладающая наибольшей силой». Я бы переосмыслил это предположение. Я знаю, что в речи часто отсутствует основа, и я слышал (простите за каламбур), что 2-я гармоника (то есть вдвое больше основной) часто отсутствует в человеческом пении. У вас есть куча репрезентативных спектров, на которые вы смотрели, чтобы заставить вас думать иначе?hotpaw2Предположение о кепстральном анализе кажется лучшим способом добраться до одного или двух фундаментальных элементов, тогда вы можете попытаться уточнить его.

Ответы на вопрос(3)

Решение Вопроса

Как взять набор чисел типа {301,102,99,202,198,103} и выбросить ~ 100?

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

рошо изученных алгоритма, которые оценивают частоту возбудителя по серии обертонов.

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

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

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