Автокорреляционная эвристика для тюнера - PullRequest
2 голосов
/ 20 сентября 2011

Я реализовал простую процедуру автокорреляции для некоторых аудиосэмплов со скоростью 44100,0 с размером блока 2048.

Общая формула, которой я придерживаюсь, выглядит следующим образом:

r[k] = a[k] * b[k] = ∑ a[n] • b[n + k]

и я реализовал его в виде вложенного цикла методом грубой силы следующим образом:

for k = 0 to N-1 do 
    for n = 0 to N-1 do
        if (n+k) < N 
            then r[k] := r[k] + a(n)a(n+k)
    else
        break;
    end for n; 
end for k;

Я ищу максимальную величину в r и определяю, сколько она отсчетов, и вычисляю частоту.

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

Расчеты методом грубой силы немного медленны - есть ли известный, более быстрый способ их выполнения?

Иногда тюнер не настолько точен, как это необходимо.Какой тип эвристики я могу применить здесь, чтобы помочь уточнить результаты?

Иногда OCTAVE неверен - есть ли способ немного точнее отточить правильную октаву?

Ответы [ 3 ]

4 голосов
/ 21 сентября 2011

Эффективный способ сделать автокорреляцию с БПФ:

  • БПФ сигнал временной области
  • преобразование комплексного выхода БПФ в амплитуду и нулевую фазу (то есть спектр мощности)
  • принять обратное БПФ

Это работает, потому что автокорреляция во временной области эквивалентна спектру мощности в частотной области.

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

0 голосов
/ 22 сентября 2011

Один простой способ улучшить этот метод автокорреляции "грубой силой" - это ограничить диапазон k и искать только лаги (или периоды основного тона) вблизи предыдущего среднего периода, скажем, сначала в пределах + -0,5 полутона. Если вы не нашли корреляцию, найдите немного более широкий диапазон, скажем, в пределах одной трети, затем найдите более широкий диапазон, но в пределах ожидаемого диапазона частот настраиваемого инструмента.

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

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

0 голосов
/ 20 сентября 2011

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

Допустим, у вас есть пик 0,9 в выборке 5 и соседних выборках 0,1 и 0,8. Фактический пик, вероятно, находится где-то между образцом 5 и образцом 6.

(0.1 * 4 + 0.9 * 5 + 0.8 * 6) / (0.1 + 0.9 + 0.8) = 5.39
...