Существуют ли другие способы реализации Guitar Tuner, кроме FFT?

Я хочу сделать точный гитарный тюнер, это обычно делается многими путем вычисления БПФ и получения пика. Но это малоприменимо по нескольким причинам:

  • Дискретная точность дает недостаточное разрешение для настройки бас-гитары.
  • Большое время и сложность вычислений при попытке увеличить размер буфера (и/или частоту дискретизации). Вводит видимую задержку (лаг).
  • Большая часть частотного диапазона, в котором сосредоточена вся точность БПФ, не используется. Все, что выше 1-2 кГц, не подходит для настройки музыкальных инструментов.

Должен быть более простой способ для сигналов, имеющих одночастотную синусоидальную форму. Учитывая достаточно маленький буфер (скажем, 256 сэмплов с частотой дискретизации 96 кГц), как вы можете измерить базовую (lowese) частоту?

Простыми словами: Как найти частоту F, чтобы разность "синусоидального сигнала частоты F" и "фактически записанного сигнала" давала минимальную ошибку. strong>, чем для любой частоты, кроме F ? (поэтому мы можем однозначно заключить, что синусоида частоты F является наилучшей аппроксимацией записанного звукового буфера).

PS. Что угодно, только не с помощью БПФ!


person xakepp35    schedule 23.10.2018    source источник
comment
это может дать вам пищу для размышлений mlesniak.com /post/2018/09/13/go-guitar-/-visualize-sound ... немного касательной к моим гитарным нотам Show HN: Guitar Dashboard — обозреватель теории музыки с открытым исходным кодом для гитаристов — news.ycombinator.com/item?id=17987657 исходная статья по адресу guitardashboard.com   -  person Scott Stensland    schedule 24.10.2018
comment
@ScottStensland Этот упрощенный пример SDL просто отображает форму волны (во временной области), это бесполезно, потому что сегодня люди используют библиотеки более высокого уровня для рисования диаграмм \ графиков (с функциями автомасштабирования / суммирования /... и т. д.) и не писать сами основы - это было написано миллион раз раньше. Это было просто оффтоповое замечание, но я упомянул, что это бесполезно, в первую очередь потому, что я не хочу это рисовать! Ни во временной области, ни в частотной)) Я хочу найти какую-то базовую частоту F проигрываемой в данный момент ноты с хорошим разрешением на низких частотах.   -  person xakepp35    schedule 24.10.2018
comment
Волновые формы гитарных нот не имеют синусоидальной формы, очень часто даже близкой к ней. Таким образом, простой пик FFT не является работоспособным методом.   -  person hotpaw2    schedule 27.10.2018
comment
@hotpaw2 Форма волны всей ноты не синусоидальна, но мы не требуем ее во всей ее полноте: лучше убрать атаку, релиз и дополнительные обертоны, такие как звук щипка. Что самое примечательное - большая часть энергии ноты сосредоточена в сустейне. И это почти чистый синусоидальный (резонансный) материал: струна резонирует на одной частоте, которая зависит исключительно от ее натяжения и длины.   -  person xakepp35    schedule 27.10.2018
comment
Обратите внимание, что 256 сэмплов (при 96k) любой ноты более чем на 3-ю ниже Concert-A составляют менее одного полного цикла, что ниже 1-го бина любого DFT или метода, подобного Герцелю. Таким образом, вам понадобится оценщик неполных циклов для 256.   -  person hotpaw2    schedule 28.10.2018
comment
@ hotpaw2 Как-то так.. Я до сих пор понятия не имею, как реализовать своего рода тюнер в реальном времени, основанный не на каком-то буфере. Лучшая идея, которая у меня есть на данный момент, это детектор пересечения нуля, который просто подсчитывает выборки, прошедшие с момента последнего события пересечения нуля. Любое смещение постоянного тока немедленно испортит его.   -  person xakepp35    schedule 30.10.2018


Ответы (1)


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

  • Полосовой фильтр вокруг основной частоты тона, на который вы хотите настроиться. Пример 82,41 Гц для нижней струны E на гитаре.
  • Рассмотрим окно последних N отсчетов. Установите значение ex 100 мс, чтобы обновлять оценку основного тона 10 раз в секунду.
  • Выполните обнаружение пересечения нуля с пороговым значением T. Например, T может быть установлено на 10% от пика сигнала. Подсчитайте периоды между каждым пересечением нуля, соберите их в массив.
  • Возьмите медиану периодов, чтобы получить оценку подачи

Вы также можете вычислить квантили периодов, чтобы оценить, насколько надежен метод. Если они дают сильно отличающиеся от медианы цифры, значит, метод не работает.

Подход можно расширить путем вычисления автокорреляции пересечений нуля, как описано в https://www.cycfi.com/2018/03/fast-and-efficient-pitch-detection-bitstream-autocorrelation/

person Jon Nordby    schedule 02.12.2018
comment
Спасибо за ваши усилия, но ответ очень запутан для меня. Не могу понять, какая ожидаемая частота. И на что такое оконное разделение.. И какой фильтр использовать? - person xakepp35; 02.12.2018
comment
Я обновил объяснение сейчас, возможно, оно более понятно - person Jon Nordby; 02.12.2018