scipy udostępnia funkcję korelacji, która działa dobrze przy małych wejściach, a także w przypadku korelacji niekołowej, co oznacza, że sygnał nie będzie zawijany. Zauważ, że w mode='full'
wielkość tablicy zwróconej przez signal.correlation jest sumą rozmiarów sygnału wejściowego - 1, więc wartość z argmax
jest wyłączona (wielkość sygnału -1 = 20) z tego, co wydaje się oczekiwać.
from scipy import signal, fftpack
import numpy
a = numpy.array([0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0, 0, 0, 0, 0])
b = numpy.array([0, 0, 0, 0, 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0])
numpy.argmax(signal.correlate(a,b)) -> 16
numpy.argmax(signal.correlate(b,a)) -> 24
Dwa różne wartości odpowiadają czy zmiany w a
lub b
.
Jeśli chcesz korelacji kołowej i dużego rozmiaru sygnału, możesz użyć twierdzenia o przekształceniu Fouriera z zastrzeżeniem, że korelacja jest bardzo podobna do splotu, ale nie jest identyczna.
A = fftpack.fft(a)
B = fftpack.fft(b)
Ar = -A.conjugate()
Br = -B.conjugate()
numpy.argmax(numpy.abs(fftpack.ifft(Ar*B))) -> 4
numpy.argmax(numpy.abs(fftpack.ifft(A*Br))) -> 17
znowu dwie wartości odpowiadają czy Twój interpretacji przesunięcie a
lub przesunięcie b
.
Koniugacja negatywna wynika z przewracania się jednej z funkcji, ale w korelacji nie ma odwracania. Możesz cofnąć przerzucanie, odwracając jeden z sygnałów, a następnie biorąc FFT, lub biorąc FFT sygnału, a następnie biorąc negatywną koniugat. to jest następujące: Ar = -A.conjugate() = fft(a[::-1])
1UP: Nie bardzo obeznany z przetwarzaniem sygnału , ale wygląda na to, że wiesz o co mi chodzi – MattH
Dziękuję za odpowiedź: po raz pierwszy widzę coś, co ma sens. Teraz jeszcze jedno pytanie, w zależności od "znaku" wartości przesunięcia czasowego Odejmuję lub dodaję przesunięcie czasowe Jak uzyskać znak? – Vishal
Czekaj ... dlaczego potrzebujesz negatywu? Nie sądzę, że potrzebujesz negatywu Niech X (t) przekształci X (f). Po odwróceniu czasu, x (-t) przekształca X (-f) .Jeśli x (t) jest prawdziwe, to X (-f) = conj (X (f)). Dlatego jeśli x (t) jest prawdziwe, następnie x (-t) ma tr ansform conj (X (f)). Bez negatywnych. –