Я работаю над простым веб-приложением, которое позволяет пользователю настраивать свою гитару. Я настоящий новичок в обработке сигналов, поэтому не судите слишком сильно, если мой вопрос неуместен.
Итак, мне удалось получить основную частоту, используя алгоритм FFT, и в этот момент приложение как-то работает. Тем не менее, есть место для улучшений, сейчас я отправляю необработанные pcm алгоритму FFT, но я подумал, что, возможно, существуют некоторые до / после алгоритмы / фильтры, которые могут улучшить обнаружение. Можете ли вы предложить любой?
Моя главная проблема заключается в том, что, когда он обнаруживает определенную частоту, он показывает эту частоту в течение 1-2 секунд, а затем переходит на другие случайные частоты и возвращается снова и так далее, даже если звук непрерывный.
Я также интересуюсь любым другим типом оптимизации, если у кого-то есть опыт с такими вещами.
источник
Шаг не совпадает с частотным интервалом пиковой величины FFT. Пек является человеческим психоакустическим явлением. Звук основного тона может иметь отсутствующий или очень слабый фундаментальный (часто встречающийся в некоторых звуках голоса, пианино и гитары) и / или множество мощных обертонов в своем спектре, которые подавляют частоту основного тона (но все же могут быть услышаны человеком как нота основного тона) , Таким образом, любой детектор пиковой частоты БПФ (даже с некоторыми окнами и интерполяцией) не будет надежным методом оценки основного тона.
Этот вопрос о переполнении стека включает в себя список некоторых альтернативных методов оценки высоты тона, которые могут привести к лучшим результатам.
ДОБАВЛЕНО: Если вы делаете это для гитарных звуков, обратите внимание, что самые низкие гитарные струны могут фактически давать слегка негармоничные обертоны, что делает оценку высоты тона еще более сложной, поскольку человеческое ухо может слышать частоту тона, более тесно связанную с подмножками обертонов , а не к фактической основной частоте колебаний струны.
ДОБАВЛЕНО № 2: об этом так часто спрашивают, что я написал более длинное сообщение в блоге на эту тему: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html
источник
Я провел много лет, исследуя определение высоты тона полифонической музыки - например, обнаружение нот гитарного соло в записи mp3. Я также написал раздел в Википедии, в котором дается краткое описание процесса (см. Подраздел «Обнаружение подачи» в ссылке ниже).
Когда на пианино нажимается одна клавиша, мы слышим не одну частоту звуковых колебаний, а совокупность множества звуковых колебаний, возникающих на разных математически связанных частотах. Элементы этой совокупности колебаний на разных частотах называются гармониками или частями. Например, если мы нажмем среднюю клавишу C на фортепиано, отдельные частоты гармоник композита начнутся с 261,6 Гц в качестве основной частоты, 523 Гц будет 2-й гармоникой, 785 Гц будет 3-й гармоникой, 1046 Гц будет 4-я гармоника и т. д. Более поздние гармоники представляют собой целые кратные основной частоты, 261,6 Гц (например: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).
Я использую модифицированное логарифмическое преобразование DFT, чтобы сначала обнаружить возможные гармоники путем поиска частот с пиковыми уровнями (см. Диаграмму ниже). Из-за способа, которым я собираю данные для моего модифицированного Log DFT, мне не нужно применять функцию Windowing к сигналу, а также добавлять и перекрывать друг друга . И я создал DFT так, чтобы его частотные каналы были логарифмически расположены, чтобы выровнять частоты, на которых гармоники создаются нотами на гитаре, саксофоне и т. Д.
Уйдя в отставку, я решил выпустить исходный код для моего механизма определения высоты звука в бесплатном демонстрационном приложении под названием PitchScope Player . PitchScope Player доступен в Интернете, и вы можете загрузить исполняемый файл для Windows, чтобы увидеть мой алгоритм в работе над выбранным вами mp3-файлом. Приведенная ниже ссылка на GitHub.com приведет вас к моему полному исходному коду, где вы сможете увидеть, как я обнаруживаю гармоники с помощью пользовательского логарифмического преобразования DFT, а затем искать частичные (гармоники), частоты которых удовлетворяют правильному целочисленному соотношению, которое определяет ' подача'.
Мой алгоритм обнаружения высоты тона на самом деле представляет собой двухэтапный процесс: a) Сначала определяется ScalePitch (ScalePitch имеет 12 возможных значений высоты тона: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) и после определения ScalePitch вычисляется октава путем изучения всех гармоник для 4 возможных нот октавы-кандидата. Алгоритм предназначен для обнаружения наиболее доминирующего тона (музыкальной ноты) в любой данный момент времени в полифоническом файле MP3. Это обычно соответствует нотам инструментального соло. Те, кто интересуется исходным кодом C ++ для моего алгоритма 2 Stage Pitch Detection, могут захотеть начать с функции Estimate_ScalePitch () в файле SPitchCalc.cpp на GitHub.com.
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
Ниже приведено изображение логарифмического ДПФ (созданного моим программным обеспечением C ++) в течение 3 секунд гитарного соло на полифонической записи в формате mp3. Это показывает, как гармоники появляются для отдельных нот на гитаре, играя соло. Для каждой ноты в этом логарифмическом ДПФ мы можем видеть его множественные гармоники, проходящие вертикально, потому что каждая гармоника будет иметь одинаковую временную ширину. После того, как октава ноты определена, тогда мы знаем частоту Основного.
Диаграмма ниже демонстрирует алгоритм определения октавы, который я разработал, чтобы выбрать правильную ноту октавы-кандидата (то есть, правильную фундаментальную) после определения ScalePitch для этой ноты. Желающим увидеть этот метод в C ++ следует обратиться к функции Calc_Best_Octave_Candidate () внутри файла с именем FundCandidCalcer.cpp, который содержится в моем исходном коде на GitHub.
источник