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


11

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

Скажемо, я виконую це за сигналом 200 секунд, даючи мені 8600 коефіцієнтів. Як я міг би використовувати ці коефіцієнти для виявлення повторення та, у свою чергу, темпу? Чи варто створити якусь нейронну мережу, щоб згрупувати їх, чи це надмірність?

Дякуємо за будь-яку допомогу.


4
1024x[1],x[2],,x[1024]i=11024(x[i])21024R[k]R[k]=i=11024kx[i]x[i+k]1024R[k]R[k]=i=11024kx[i]x[i+k]+i=1kx[1024k+i]x[i]

Ей, Діліп, дякую за допомогу. Я ще не реалізував функцію змінного струму, я просто намагаюся в першу чергу обробити теорію. Перше рівняння виглядає найпростішим, але чи потрібно заздалегідь нормалізувати дані?
XSL

1
Ось приклад: gist.github.com/255291#L62
ендоліти

Відповіді:


23

Ідея автокореляції полягає в тому, щоб забезпечити міру подібності між сигналом і самим собою при заданому відставанні. Існує кілька способів наблизитись до нього, але для виявлення тону / темпу ви можете розглядати це як процедуру пошуку. Іншими словами, ви переходите через зразок за зразком сигналу і здійснюєте кореляцію між вашим опорним вікном та відсталим вікном. Кореляція при "відставанні 0" буде максимальним глобальним, оскільки ви порівнюєте посилання на дослівну копію себе. Коли ви крокуєте вперед, кореляція обов’язково зменшиться, але у випадку періодичного сигналу в якийсь момент він знову почне зростати, після чого досягне локального максимуму. Відстань між "відставанням 0" та першим піком дає оцінку вашому кроку / темпу. Як я '

Обчислення співвідношень вибірки на зразок може бути дуже обчислювально дорогим при високих показниках вибірки, тому зазвичай використовується підхід на основі FFT. Взявши FFT за цікавий сегмент, помноживши його на його складний кон'югат , то прийняття зворотного FFT дасть вам циклічну автокореляцію . У коді (використовуючи 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)

Від того, чи потрібно вам робити більше однієї автокореляції, залежить від того, скільки шуму буде в сигналі.

Звичайно, існує багато тонких варіацій цієї ідеї, і я не збираюся тут все вникати. Найповніше висвітлення, яке я бачив (в контексті виявлення тону), полягає в цифровій обробці мовних сигналів Рабінером і Шафером.


Тепер щодо того, чи буде автокореляція достатньою для виявлення темпу. Відповідь - так і ні. Ви можете отримати деяку інформацію про темп (залежно від вихідного сигналу), але може бути важко зрозуміти, що це означає у всіх випадках. Наприклад, ось сюжет з двох циклів битви, з подальшим графіком циклічної автокореляції всієї послідовності:

Автокореляція Breakbeat

Для довідки, ось відповідне аудіо:

Звичайно, є хороший шип прямо в середині, що відповідає точці циклу, але він отримав обробку досить довгого сегмента. Крім того, якби це була не точна копія (наприклад, якщо з нею були прилади), цей шип не був би таким чистим. Автокореляція, безумовно, буде корисною для виявлення темпу, але вона, ймовірно, сама по собі не буде достатньою для складного вихідного матеріалу. Наприклад, навіть якщо ви знайдете колосок, як ви дізнаєтесь, чи це повна міра, або чверть ноти, половина нота чи щось інше? У цьому випадку досить зрозуміло, що це повна міра, але це не завжди так. Я б запропонував пограти з використанням змінного струму на більш простих сигналах, поки не з’ясується внутрішня робота, а потім задати ще одне питання щодо темпового виявлення (оскільки це "більше"


2
Почекай, це автокореляція аудіосигналу? Це, звичайно, не дуже корисно для темпового виявлення нічого, крім цифрових циклів. Автокореляція деяких конвертів RMS повинна працювати набагато краще загалом, переважно для декількох смуг частот окремо.
листопада

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, але розбиття її на сегменти (з накладанням та / або вікном за необхідності) також дає корисні результати. Вибір довжини, форми та перекриття вікна залежить від застосування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.