БПФ для определения высоты тона - PullRequest
1 голос
/ 27 июня 2011

Я недавно использовал FFT для обнаружения высоты тона, и я заметил, что, хотя ноты правильные (например, C, D # и т. Д.), Есть много нот, которые находятся в неправильной октаве (например, E2 относится к категории E3, C3 относится к категории C4, всегда на октаву вверх).

Почему это так?Мой алгоритм заключается в том, что после расчета бункеров БПФ, я получаю бин с наибольшей интенсивностью и вычисляю, какая это частота.

Любая помощь в этом?Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 ноября 2012

две мысли: -

  1. если ваш вход и ваш алгоритм всегда точно на 1 октаву от того, что вы ожидаете, то разве вы не можете просто признать, что вы откалиброваны таким образом и всегда вычесть октаву?

  2. когда вы берете гитарную струну, вы всегда получаете гармонику (2-я гармоника) ровно на одну октаву выше, которая очень громкая - примерно такая же громкая, как и у естественной (1-я гармоника). затем вы получаете 1 октаву на 7 полутонов выше (3-я гармоника), но октавная гармоника действительно заметна.

1 голос
/ 27 июня 2011

Звучит как гармоника для меня.Указанный вопрос Грега, кажется, находится на правильном пути.

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

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

Я знаю, что гитарные тюнеры делают некоторые из этих вещей, и все же время от времени ошибаются.Это грязный бизнес:)

Говоря о живой выборке, в зависимости от вашего источника выборки, есть много аномалий, которые могут дать вам неожиданные результаты:

  • Обертоны взвук
  • неслышимые звуки в звуке

Они будут отображаться в ваших данных, но вы, вероятно, не сможете их услышать.И если вы пытаетесь сопоставить несколько тонов или аккордов, ваша работа будет еще более сложной.

0 голосов
/ 10 сентября 2016

Octave Detection может быть очень сложным, особенно для полифонического сигнала, в котором отсутствуют основные гармоники и / или другие гармоники .Предполагая, что вы правильно определяете «высоту тона», а не только «гармоники» (см. Ссылку на Википедию ниже), вы можете использовать разработанный мной алгоритм определения октавы.

Чтобы выполнить определение высоты тона для PitchScope Player,Я выбрал двухэтапный алгоритм, который работает следующим образом: a) Сначала определяется нота ScalePitch - «ScalePitch» имеет 12 возможных значений высоты тона: {E, F, F #, G, G #, A, A #, B,C, C #, D, D #}.И после того, как ScalePitch и Time-Width ноты определены, б) тогда октава (фундаментальная) этой ноты рассчитывается путем изучения ВСЕХ гармоник 4 возможных нот октавы-кандидата.

Полный исходный код C ++ и исполняемый файл для моего приложения PitchScope Player для определения высоты звука находятся на GitHub (ссылка ниже), и вы можете скомпилировать и просмотреть его, чтобы увидеть, как работает мой алгоритм обнаружения октавы.

Вы хотели бы сосредоточиться на функции FundCandidCalcer :: Calc_Best_Octave_Candidate () в файле FundCandidCalcer.cpp, чтобы увидеть этот алгоритм в C ++.Диаграмма ниже также дает приблизительное представление о том, как рассчитать октаву.

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

https://github.com/CreativeDetectors/PitchScope_Player

На диаграмме ниже показан алгоритм обнаружения октав, который я разработал длявыберите правильную ноту Октавы-Кандидата (то есть правильную Фундаментальную), как только будет определен ScalePitch для этой ноты.

enter image description here

0 голосов
/ 24 ноября 2012

Решая, в какую октаву поместить высоту тона, попробуйте добавить в каждый сегмент некоторую долю объема звука, который присутствует в 3 раза большей частоте (например, добавить к сегменту 440 Гц долю амплитуды сегмента 1320 Гц).В большинстве устройств A440, вероятно, будет иметь важные компоненты на частотах 880 Гц, 1320 Гц, 1760 Гц, 2200 Гц, 2640 Гц и т. Д. A880, скорее всего, будет иметь 880 Гц, 1760 Гц и 2640 Гц, но не будет иметь значительного компонента 1320 Гц (ни 2220 Гц для этогоиметь значение).Поэтому, если ваш код пытается решить, является ли нота А440 или А880, рассмотрение блока третьей гармоники (или других нечетных гармоник) может дать полезную подсказку.

...