Советы по улучшению определения высоты тона


21

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

Итак, мне удалось получить основную частоту, используя алгоритм FFT, и в этот момент приложение как-то работает. Тем не менее, есть место для улучшений, сейчас я отправляю необработанные pcm алгоритму FFT, но я подумал, что, возможно, существуют некоторые до / после алгоритмы / фильтры, которые могут улучшить обнаружение. Можете ли вы предложить любой?

Моя главная проблема заключается в том, что, когда он обнаруживает определенную частоту, он показывает эту частоту в течение 1-2 секунд, а затем переходит на другие случайные частоты и возвращается снова и так далее, даже если звук непрерывный.

Я также интересуюсь любым другим типом оптимизации, если у кого-то есть опыт с такими вещами.

Ответы:


20

Я предполагаю, что другие частоты, которые он получает, являются гармониками основного? Как будто вы играете на 100 Гц, а вместо этого выдает 200 Гц или 300 Гц? Во-первых, вы должны ограничить пространство поиска частотами, которые могут быть на гитаре. Найдите самый высокий фундаментальный уровень, который вам может понадобиться, и ограничьте его.

Автокорреляция будет работать лучше, чем БПФ, при поиске фундаментального сигнала , если фундаментальный сигнал имеет меньшую амплитуду, чем гармоники (или вообще отсутствует, но это не проблема для гитары):

введите описание изображения здесь

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

Кроме того, вы должны обрабатывать свой сигнал перед применением FFT. Вы просто умножаете его на оконную функцию , которая сужает начало и конец сигнала, чтобы сделать частотный спектр чище. Тогда вы получите высокие узкие шипы для частотных компонентов вместо широких.

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

Вот мой пример кода Python для всего этого .


Это то, что я искал, очень хороший ответ, спасибо!
Валентин Раду

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

@JasonR, учитывая тот факт, что он предназначен для работы в среде, в которой вероятность создания мощного мешающего тона очень мала, вы предлагаете, чтобы лучше не использовать окно Хэмминга?
Валентин Раду

1
Я могу подтвердить, что использование окна Хэмминга приблизило меня к моей цели сохранения стабильных показаний. Прямо сейчас, когда я играю на А4, большую часть времени я получаю 440 Гц, и очень редко я получаю близкое чтение, например, 650 Гц или около того. Я предполагаю, что это гармоники? Кроме того, я не мог не заметить, что для более высокой частоты приложение работает безупречно, а для более низкой оно начинает давать сбой. Возможно, потому, что я использую FTT для обнаружения частотного бина с максимальной амплитудой и для более низких частот, что не всегда является фундаментальным?
Валентин Раду

1
@mindnoise: 660 Гц не является гармоникой 440 Гц, но это гармоника 220 Гц, или идеальная пятая выше 440. Может ли быть другая резонирующая струна или искажение или что-то еще? Намного проще выяснить подобные проблемы, если вы можете нарисовать БПФ и посмотреть на него. Да, низкие частоты могут быть отфильтрованы и уменьшены относительно более высоких, либо механическими эффектами, либо вашей аналоговой схемой.
эндолит

12

Шаг не совпадает с частотным интервалом пиковой величины FFT. Пек является человеческим психоакустическим явлением. Звук основного тона может иметь отсутствующий или очень слабый фундаментальный (часто встречающийся в некоторых звуках голоса, пианино и гитары) и / или множество мощных обертонов в своем спектре, которые подавляют частоту основного тона (но все же могут быть услышаны человеком как нота основного тона) , Таким образом, любой детектор пиковой частоты БПФ (даже с некоторыми окнами и интерполяцией) не будет надежным методом оценки основного тона.

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

ДОБАВЛЕНО: Если вы делаете это для гитарных звуков, обратите внимание, что самые низкие гитарные струны могут фактически давать слегка негармоничные обертоны, что делает оценку высоты тона еще более сложной, поскольку человеческое ухо может слышать частоту тона, более тесно связанную с подмножками обертонов , а не к фактической основной частоте колебаний струны.

ДОБАВЛЕНО № 2: об этом так часто спрашивают, что я написал более длинное сообщение в блоге на эту тему: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


только что посетил (и прокомментировал) блог, на который вы только что ссылались.
Роберт Бристоу-Джонсон

5

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

введите описание изображения здесь


Джеймс, ваш детектор высоты тона DFT обнаруживает ноты с отсутствующим (или слабым) фундаментальным сигналом?
Роберт Бристоу-Джонсон

Да, мой 2-ступенчатый алгоритм обнаружения высоты тона будет обнаруживать ноты, даже если сигнал имеет «отсутствующий (или слабый) фундаментальный» - это большая сила этого двухэтапного процесса. Фундаментальный определяется на втором этапе, когда обнаружение октавы выполняется для временных интервалов, которые вы видите для заметок на логарифмической диаграмме ДПФ. Поскольку эта функция определения высоты звука работает в условиях путаницы полифонического mp3-сигнала, она обнаруживает ноты, в которых отсутствует много гармоник, включая фундаментальную. Я только что добавил к этому ответу вторую диаграмму, которая объясняет мой алгоритм обнаружения октав.
Джеймс Пол Миллард
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.