Tương quan chéo và tích chập có liên quan chặt chẽ. Nói tóm lại, để thực hiện tích chập với FFT, bạn
- zero-pad các tín hiệu đầu vào (thêm số không vào cuối để ít nhất một nửa sóng "trống")
- lấy FFT của cả hai tín hiệu
- nhân các kết quả với nhau (phép nhân phần tử)
- làm FFT nghịch đảo
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Bạn cần thực hiện phần đệm bằng 0 vì phương pháp FFT thực sự là tương quan chéo tròn , nghĩa là tín hiệu bao quanh ở hai đầu. Vì vậy, bạn thêm số không đủ để loại bỏ sự chồng lấp, để mô phỏng tín hiệu bằng không đến vô cùng.
Để có được mối tương quan chéo thay vì tích chập, bạn cần phải đảo ngược thời gian một trong các tín hiệu trước khi thực hiện FFT hoặc lấy liên hợp phức tạp của một trong các tín hiệu sau 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)))
cái nào dễ hơn với phần cứng / phần mềm của bạn. Đối với tự tương quan (tương quan chéo của tín hiệu với chính nó), tốt hơn là thực hiện liên hợp phức tạp, bởi vì sau đó bạn chỉ cần tính toán FFT một lần.
Nếu các tín hiệu là có thật, bạn có thể sử dụng các FFT thực (RFFT / IRFFT) và tiết kiệm một nửa thời gian tính toán của bạn bằng cách chỉ tính một nửa phổ.
Ngoài ra, bạn có thể tiết kiệm thời gian tính toán bằng cách đệm vào kích thước lớn hơn mà FFT được tối ưu hóa (chẳng hạn như số 5 số cho FFTPACK, số ~ 13 số cho FFTW hoặc công suất 2 cho việc triển khai phần cứng đơn giản).
Đây là một ví dụ về tương quan Python của FFT so với tương quan brute-force: https://stackoverflow.com/a/1768140/125507
Điều này sẽ cung cấp cho bạn hàm tương quan chéo, là thước đo tương tự so với bù. Để có được độ lệch mà tại đó các sóng được "xếp hàng" với nhau, sẽ có một đỉnh trong hàm tương quan:
Giá trị x của đỉnh là giá trị bù, có thể âm hoặc dương.
Tôi chỉ thấy điều này được sử dụng để tìm sự bù giữa hai sóng. Bạn có thể có được ước tính chính xác hơn về độ lệch (tốt hơn độ phân giải của các mẫu) bằng cách sử dụng phép nội suy parabol / bậc hai trên đỉnh.
Để có giá trị tương tự giữa -1 và 1 (giá trị âm biểu thị một trong các tín hiệu giảm khi các tín hiệu khác tăng), bạn cần phải điều chỉnh biên độ theo độ dài của đầu vào, độ dài của FFT, triển khai FFT cụ thể của bạn chia tỷ lệ, v.v ... Việc tự tương quan của một sóng sẽ tự cung cấp cho bạn giá trị của kết quả khớp tối đa có thể.
Lưu ý rằng điều này sẽ chỉ hoạt động trên các sóng có hình dạng tương tự. Nếu chúng đã được lấy mẫu trên các phần cứng khác nhau hoặc có thêm một số nhiễu, nhưng nếu không vẫn có hình dạng giống nhau, thì phép so sánh này sẽ hoạt động, nhưng nếu hình dạng sóng đã được thay đổi bằng cách lọc hoặc dịch pha, chúng có thể phát ra âm thanh giống nhau, nhưng đã thắng 't tương quan là tốt.