Перехресна кореляція та згортання тісно пов'язані. Коротше кажучи, робити згортку з FFTs, вам
- нульові колодки вхідних сигналів (додайте нулі до кінця, щоб принаймні половина хвилі була "порожньою")
- прийняти FFT обох сигналів
- помножувати результати разом (множення елементів)
- зробити зворотний FFT
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Вам потрібно зробити нульову підкладку, оскільки метод FFT - це насправді кругова перехресна кореляція, тобто сигнал накручується на кінцях. Таким чином, ви додаєте достатньо нулів, щоб позбутися перекриття, щоб імітувати сигнал, який дорівнює нулю до нескінченності.
Щоб отримати перехресну кореляцію замість згортки, вам потрібно або повернути один з сигналів за часом перед тим, як зробити FFT, або взяти складний кон'югат одного з сигналів після FFT:
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
залежно від вашого обладнання та програмного забезпечення. Для автокореляції (перехресна кореляція сигналу з самим собою) краще робити складний кон'югат, тому що тоді потрібно обчислити FFT лише один раз.
Якщо сигнали справжні, ви можете використовувати реальні FFT (RFFT / IRFFT) і економити половину часу на обчислення, лише обчисливши половину спектру.
Крім того, ви можете заощадити час на обчислення, доповнивши більший розмір, під який оптимізовано FFT (наприклад, 5-гладке число для FFTPACK, ~ 13-гладке число для FFTW або потужність 2 для простої апаратної реалізації).
Ось приклад кореляції FFT у Python порівняно з кореляцією грубої сили: https://stackoverflow.com/a/1768140/125507
Це дасть вам функцію перехресної кореляції, яка є показником подібності та зміщення. Для отримання зрушення, при якому хвилі «вишикуються» між собою, буде досягнутий пік функції кореляції:
Значення x піку - це зміщення, яке може бути негативним чи позитивним.
Я бачив, як це використовується для знаходження зміщення між двома хвилями. Ви можете отримати більш точну оцінку зміщення (краще, ніж роздільна здатність ваших зразків), використовуючи параболічну / квадратичну інтерполяцію на піку.
Щоб отримати значення подібності між -1 і 1 (від'ємне значення, що вказує на один із сигналів, зменшується, оскільки інший збільшується), вам потрібно буде масштабувати амплітуду відповідно до довжини входів, довжини FFT, відповідної вашої реалізації FFT масштабування тощо. Автокореляція хвилі із собою дасть вам значення максимально можливого збігу.
Зауважте, що це буде працювати лише на хвилях, що мають однакову форму. Якщо вони взяли пробу на іншому обладнанні або додали шум, але в іншому випадку все-таки мають однакову форму, це порівняння спрацює, але якщо форма хвилі була змінена фільтруванням або зсувом фаз, вони можуть звучати однаково, але виграють Не корелюю також.