Автокорреляция в аудиоанализе

11

Я читаю об автокорреляции , но я не уверен, что точно понимаю, как это работает и какой результат я должен ожидать. Правильно ли я считаю, что должен вводить свой сигнал в функцию переменного тока и иметь скользящее окно ввода. Каждое окно (например, из 1024 выборок) будет выводить коэффициент от -1 до 1. Знак просто указывает, является ли линия восходящей или нисходящей, а значение указывает, насколько сильна корреляция. Для простоты, допустим, у меня нет перекрытия, и просто каждый раз перемещаем окно 1024 сэмпла. Получу ли я 43 коэффициента в выборке 44100, и мне нужно сохранить их все?

Допустим, я выполняю это для 200-секундного сигнала, давая мне 8600 коэффициентов. Как бы я использовал эти коэффициенты, чтобы обнаружить повторение и, в свою очередь, темп? Должен ли я создать какую-то нейронную сеть, чтобы сгруппировать их, или это перебор?

Спасибо за любую помощь.

XSL
источник
4
Предположим, что вашими сэмплами являются . Не могли бы вы сказать нам, что возвращает ваша функция переменного тока? Возможные ответы: «Возвращает » или «Возвращает числа где "или" Возвращает числа где ". Все три предложенных ответа совместимы с понятием автокорреляции. x [ 1 ] , x [ 2 ] , , x [ 1024 ] 1024 i = 1 ( x [ i ] ) 2 1024 R [ k ] R [ k ] = 1024 - k i = 1 x [ i ] x [ i + k ] 1024 R [ k1024Икс[1],Икс[2],...,Икс[1024]Σязнак равно11024(Икс[я])21024р[К]р[К]знак равноΣязнак равно11024-КИкс[я]Икс[я+К]1024R [ k ] = 1024 - k i = 1 x [ i ] x [ i + k ] + k i = 1 x [ 1024 - k + i ] x [ i ]р[К]р[К]знак равноΣязнак равно11024-КИкс[я]Икс[я+К]+Σязнак равно1КИкс[1024-К+я]Икс[я]
Дилип Сарвейт
Эй, Дилип, спасибо за помощь. Я еще не реализовал функцию AC, я просто пытаюсь сначала разобраться в теории. Первое уравнение выглядит наиболее простым, но нужно ли предварительно нормализовать данные?
XSL
1
Вот пример: gist.github.com/255291#L62
эндолиты

Ответы:

23

Идея автокорреляции состоит в том, чтобы обеспечить меру сходства между сигналом и самим собой при данном запаздывании. Есть несколько способов приблизиться к нему, но для целей определения высоты тона / темпа вы можете рассматривать его как процедуру поиска. Другими словами, вы проходите шаг за шагом по сигналу и выполняете корреляцию между вашим опорным окном и запаздывающим окном. Корреляция в «лаг 0» будет глобальным максимумом, потому что вы сравниваете ссылку на дословную копию самого себя. По мере продвижения вперед корреляция обязательно будет уменьшаться, но в случае периодического сигнала в какой-то момент он снова начнет увеличиваться, а затем достигнет локального максимума. Расстояние между "лагом 0" и первым пиком дает вам оценку вашего шага / темпа. Как я

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

freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))

Эффект будет заключаться в уменьшении количества шума в сигнале (который не связан с самим собой) относительно периодических компонентов (которые по определению аналогичны самим себе). Повторение автокорреляции (т. Е. Умножения с сопряжением) перед выполнением обратного преобразования уменьшит шум еще больше. Рассмотрим пример синусоидальной волны, смешанной с белым шумом. На следующем графике показана синусоида 440 Гц, та же синусоида, «искаженная» шумом, циклическая автокорреляция шумовой волны и двойная циклическая автокорреляция:

автокорреляция

Обратите внимание, как первый пик обоих автокорреляционных сигналов расположен точно в конце первого цикла исходного сигнала. Это пик, который вы ищете, чтобы определить периодичность (в данном случае высоту звука). Первый сигнал автокорреляции все еще немного «волнистый», поэтому для обнаружения пиков потребуется какое-то сглаживание. Автокорреляция дважды в частотной области выполняет то же самое (и относительно быстро). Обратите внимание, что под «волнистой» я имею в виду то, как выглядит сигнал при увеличении, а не провал, который происходит в центре графика. Вторая половина циклической автокорреляции всегда будет зеркальным отображением первой половины, поэтому такой тип «провала» является типичным. Просто для ясности об алгоритме, вот как будет выглядеть код:

freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)

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

Конечно, есть много тонких вариаций этой идеи, и я не буду вдаваться во все из них здесь. Наиболее полный охват, который я видел (в контексте обнаружения основного тона), касается цифровой обработки речевых сигналов Рабинера и Шафера.


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

Автокорреляция брейка

Для справки вот соответствующее аудио:

Конечно, прямо посередине есть хороший всплеск, соответствующий точке цикла, но это произошло из-за обработки довольно длинного сегмента. Вдобавок ко всему, если бы это не была точная копия (например, если бы были инструменты с ним), этот шип не был бы таким чистым. Автокорреляция определенно будет полезна при обнаружении темпа, но, вероятно, ее будет недостаточно для сложного исходного материала. Например, даже если вы обнаружите всплеск, как вы узнаете, будет ли это полная мера, или четвертная нота, половина ноты или что-то еще? В этом случае достаточно ясно, что это полная мера, но это не всегда так. Я бы посоветовал поиграть с использованием AC на более простых сигналах, пока не прояснится внутренняя работа, а затем задать еще один вопрос об определении темпа в целом (так как это «больше»).

специалист по обработке данных
источник
2
Подожди, это автокорреляция самого аудиосигнала? Это, конечно, не очень полезно для определения темпа всего, кроме цифровых петель. Автокорреляция некоторых среднеквадратичных огибающих должна работать намного лучше в целом, предпочтительно для нескольких частотных полос отдельно.
оставил около
1
Автокорреляция STFT во временном направлении работает довольно хорошо, пока музыка имеет какой- то ритм. По сути, это то же самое, что запуск автокорреляции множества полос частот и последующее их суммирование.
эндолит
2
@leftroundabout Право, есть множество вещей, которые нужно сделать для определения темпа (предварительная, постобработка), кроме самой автокорреляции. В основном я отвечаю на первое предложение вопроса ОП (то есть «как работает автокорреляция»), а затем предлагаю ему задать еще один вопрос об обнаружении темпа, поскольку будут задействованы другие процессы.
Datageist
@endolith что ты имеешь ввиду здесь Autocorrelation of the STFT in the time direction? Конкретно часть направления времени
popctrl
1
@popctrl Значение для расчета автокорреляции каждой строки STFT
эндолиты
3

Похоже, вы хотите использовать автокорреляцию для обнаружения ударов. Вы можете сделать это, но я предлагаю вам значительно уменьшить частоту дискретизации. Вы ищете сигнал от 1 до 3 Гц (от 60 до 180 ударов в минуту), поэтому вам не нужно разрешение 44100 Гц. Правильно рассчитанная и нормализованная автокорреляция равна 1,0 при запаздывании 0 (сигнал прекрасно коррелирует с самим собой). Для периодического сигнала переменный ток падает ниже нуля, а затем возвращается в пик с задержкой, соответствующей основной частоте, с меньшими пиками на гармониках. Вы должны выбрать разумный диапазон для поиска этого пика. Что касается шума, автокорреляция падает и в основном выравнивается в кривых вокруг нуля. Как правило, если у вас есть пик> 0,5 в нормированном переменном токе, у вас есть периодический сигнал.

Билл
источник
1

Автокорреляция - это просто взаимная корреляция сигнала с самим собой. Простой способ вычислить это - сделать свертку между исходным сигналом и измененной во времени версией сигнала. Если у вас есть сигнал длиной 1000 отсчетов, то его автокорреляция имеет 1999 (2 * N-1) ненулевых отсчетов. Только 1000 из этих выборок являются уникальными, потому что автокорреляция (для реального сигнала) всегда симметрична по времени, то есть ac [n] = ac [-n].

Непрерывные сигналы должны быть разбиты на конечные сегменты. Это похоже на преобразование Фурье: с технической точки зрения вам нужно интегрировать из -inf в + inf, но разбив его на сегменты (с перекрытием и / или распределением окон по мере необходимости), также можно получить полезные результаты. Выбор длины окна, формы и перекрытия зависит от применения.

Hilmar
источник