Jak przesunąć cyklicznie sygnał o ułamek próbki?

22

Twierdzenie przesunięcie mówi :

Mnożenie przez fazę liniową e 2 π ixn niektórych całkowitąmodpowiadakołowym zmianywyjściaXk:XKzastąpionoXk-m, gdzie wskaźnikiem jest interpretowane moduloN(to znaczy periodycznie).e2πiNnmXkXkXkm

Ok, to działa dobrze:

plot a

arbitralny sygnał z 9 próbek

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

sygnał przesunięty o 3 próbki w dziedzinie częstotliwości

Przesunęły się o 3 próbki, jak się spodziewałem.

Pomyślałem, że możesz to zrobić, aby przesuwać się o ułamki próbki, ale kiedy próbuję, mój sygnał staje się wyobrażony i wcale nie przypomina oryginału:

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

sygnał po pomnożeniu przez 3,5 złożonej wykładniczej

W ogóle się tego nie spodziewałem. Czy to nie jest równoważne zwojowi z prawdziwym impulsem, który został przesunięty o 3,5 próbki? Więc impuls powinien być nadal prawdziwy, a wynik powinien być prawdziwy? I powinien mieć mniej więcej taki sam kształt jak oryginał, ale interpolować sinc?

endolit
źródło
Oto przesłanie Matlab File Exchange, które oblicza prawidłową modulację dla sygnałów rzeczywistych / złożonych o parzystej / nieparzystej długości i ułamkowo je opóźnia: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

Odpowiedzi:

14

Jeśli chcesz, aby przesunięte wyjście IFFT było prawdziwe, skręcenie / obrót fazowy w dziedzinie częstotliwości musi być sprzężony symetrycznie, podobnie jak dane. Można to osiągnąć przez dodanie odpowiedniego przesunięcia wykładnika złożonego exp () dla danego nachylenia fazy, tak aby faza górnej (lub ujemnej) połowy, modulo 2 Pi, odzwierciedlała dolną połowę w otworze FFT . Złożoną funkcję przesunięcia wykładniczego można również przekształcić w sprzężoną symetryczną, indeksując ją od -N / 2 do N / 2 z fazą zero przy indeksie 0.

Zdarza się tak, że odpowiednie przesunięcie dla skrętów fazowych lub spiral, które wypełniają dokładną wielokrotność liczby całkowitej 2 obrotów Pi w aperturze, aby być sprzężonym symetrycznym w aperturze, wynosi zero.

W przypadku sprzężonego symetrycznego wektora skrętu fazowego wynik powinien następnie zakończyć się kołową interpolacją Sinc dla przesunięć niecałkowitych.

Opracowanie przez OP:

Twój wybór k = [0, 1, 2, 3, 4, 5, 6, 7, 8] daje asymetryczny złożony wykładniczy:

asymetryczna złożona wykładnicza próba przesunięcia próbki o 0,5, z częścią urojoną jako linią przerywaną

Jeśli użyjesz zamiast tego k = [0, 1, 2, 3, 4, -4, -3, -2, -1], otrzymasz wykładniczy kompleks Hermite-symetryczny:

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

Hermityczno-symetryczny kompleks wykładniczy dla przesunięcia próbki o 0,5, z urojoną częścią jako linią przerywaną

a teraz, gdy użyjesz tej samej formuły wykładniczej do przesunięcia o 0,5 lub 3,5 próbek, otrzymasz prawdziwy wynik:

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

przesuń o 0,5 i 3,5 próbek, z oryginalną linią przerywaną

hotpaw2
źródło
Aha! Zamiast tego k = [0, 1, 2, 3, 4]powinienem używaćk = [0, 1, 2, -2, -1]
endolith
@endolith / hotpaw2, Innymi słowy, chodzi o indeksowanie próbek w dziedzinie czasu?
TheGrapeBeyond
1
Symetria wokół bin 0 zapewni również symetrię wokół N / 2, nawet jeśli N / 2 nie jest liczbą całkowitą.
hotpaw2
1
Znalazłem funkcję, która stosuje poprawną modulację w Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ahmed Fasih
1
czy to samo dotyczy złożonych sygnałów?
Leo