Wie verschiebe ich ein Signal zirkular um einen Bruchteil eines Samples?

22

Der Verschiebungssatz lautet :

Multiplikation von mit einer linearen Phase e 2 π ixn für eine ganze Zahlmentspricht einerkreisförmigen Verschiebungdes AusgangsXk:Xkwird ersetzt durchXk-m, wobei der Index modulo interpretiert wirdN(dh periodisch).e2πichNnmXkXkXk-m

Ok, das funktioniert gut:

plot a

beliebiges 9-Sample-Signal

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

Signal um 3 Samples im Frequenzbereich verschoben

Es hat sich wie erwartet um 3 Samples verschoben.

Ich dachte, Sie könnten dies auch tun, um einen Bruchteil eines Samples zu verschieben, aber wenn ich es versuche, wird mein Signal imaginär und überhaupt nicht wie das Original:

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--'

Signal nach Multiplikation mit 3,5 komplexen Exponential

Das habe ich überhaupt nicht erwartet. Ist das nicht gleichbedeutend mit einem echten Impuls, der um 3,5 Samples verschoben wurde? Der Impuls sollte also immer noch real sein, und das Ergebnis sollte immer noch real sein? Und es sollte mehr oder weniger die gleiche Form haben wie das Original, aber sinc interpoliert?

Endolith
quelle
Hier ist eine Matlab File Exchange-Übermittlung, die die korrekte Modulation für reelle / komplexe Signale mit gerader / ungerader Länge berechnet und diese nach Bruchteilen verzögert: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

Antworten:

14

Wenn die verschobene Ausgabe der IFFT real sein soll, muss die Phasendrehung / -rotation im Frequenzbereich ebenso wie die Daten konjugiert symmetrisch sein. Dies kann erreicht werden, indem dem Exponenten Ihres komplexen exp () für die gegebene Phasensteigung ein geeigneter Versatz hinzugefügt wird, so dass die Phase der oberen (oder negativen) Hälfte, Modulo 2 Pi, die untere Hälfte in der FFT-Apertur widerspiegelt . Die komplexe Exponentialverschiebungsfunktion kann auch konjugiert symmetrisch gemacht werden, indem sie von -N / 2 bis N / 2 mit einer Phase von Null bei Index 0 indiziert wird.

Es ist nur so, dass der geeignete Versatz für Phasendrehungen oder Spiralen, die ein genaues ganzzahliges Vielfaches von 2 Pi-Umdrehungen in der Apertur vervollständigen, um in der Apertur symmetrisch zu sein, Null ist.

Bei einem konjugierten symmetrischen Phasendrehungsvektor sollte das Ergebnis dann als zirkuläre Sinc-Interpolation für nicht ganzzahlige Verschiebungen enden.

Ausarbeitung durch OP:

Ihre Wahl von k = [0, 1, 2, 3, 4, 5, 6, 7, 8] führt zu einem asymmetrischen Exponentialkomplex:

asymmetrischer komplexer exponentieller Verschiebungsversuch von 0,5 Abtastwerten mit Imaginärteil als gestrichelte Linie

Wenn Sie stattdessen k = [0, 1, 2, 3, 4, -4, -3, -2, -1] verwenden, erhalten Sie einen Hermite-symmetrischen Exponentialkomplex:

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

Hermite-symmetrischer Komplex Exponential für 0.5 Sample Shift, mit Imaginärteil als gestrichelter Linie

Und jetzt, wenn Sie die gleiche Exponentialformel verwenden, um um 0,5 oder 3,5 Abtastwerte zu verschieben, erhalten Sie ein reales Ergebnis:

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

Verschiebung um 0,5 und 3,5 Samples mit dem Original als gepunktete Linie

hotpaw2
quelle
Aha! Stattdessen k = [0, 1, 2, 3, 4]sollte ichk = [0, 1, 2, -2, -1]
Endolith
@endolith / hotpaw2, geht es also nur um die Indizierung der Zeitdomänen-Samples?
TheGrapeBeyond
1
Symmetrie um Bin 0 liefert auch Symmetrie um N / 2, selbst wenn N / 2 keine ganze Zahl ist.
hotpaw2
1
Ich habe eine Funktion gefunden, die die richtige Modulation für Matlab File Exchange anwendet : mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ahmed Fasih
1
Gilt dies auch für komplexe Signale?
Leo