Надежный алгоритм для хроматического инструментального тюнера?

Кто знает самый надежный алгоритм для хроматического инструментального тюнера?

Я пытаюсь написать тюнер инструмента. Я пробовал следующие два алгоритма:

  • FFT, чтобы создать периодограмму приветствия, а затем определить пиковую частоту

  • Простая автокорреляция (http://en.wikipedia.org/wiki/Autocorrelation)

Я столкнулся со следующими основными проблемами:

  • Точность 1: в БПФ фиксируется связь между выборкой, длиной записи и размером ячейки. Это означает, что мне нужно записать 1-2 секунды данных, чтобы получить точность в несколько центов. Это не совсем то, что я бы назвал в реальном времени.

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

  • Надежность: в случае гитары я вижу много обертонов. Некоторые обертоны на самом деле сильнее основного тона, создаваемого струной. Я не мог найти надежный способ выбора правильной строки.

Тем не менее, любой дешевый электронный тюнер работает более надежно, чем моя реализация. Как реализованы эти тюнеры?

Ответ 1

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

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