Wie verschiebe ich das Frequenzspektrum?

7

Nehmen wir an, wir haben ein Spektrum von -X MHz bis + X MHz. Ich müsste den Frequenzfehler im Spektrum korrigieren, indem ich die Nullkomponente in die Mitte (0 Hz) verschiebe.

Wenn der Ausgang (das Frequenzspektrum) über FFT berechnet wird, kann ich das Spektrum meines Wissens durch Anpassen der 'Twiddle-Faktoren' (oder Koeffizienten für komplexe Daten-Sinus- und Cosinus-Wellen) verschieben.

Im Fall einer FFT der Größe 1024 (Bin-Indizes von 0 bis 1023) sollte in Bin-Nummer 511 eine 0-Hz-Komponente vorhanden sein. Aufgrund eines möglichen Frequenzfehlers kann sich die 0-Hz-Komponente jedoch tatsächlich tatsächlich in Bin 510 befinden.

Ich kann nicht viele Informationen dazu finden. Jede Hilfe geschätzt.

EDIT: Fehler in der Frage.

user1166780
quelle
2
0 Hz ist in Bin 0, nein? Die Mitte der FFT ist die hohen Frequenzen
Endolith
1
Dies würde vollständig vom verwendeten Algorithmus abhängen. Eine einfache Möglichkeit, sich das
vorzustellen,
Ich denke, es funktioniert wie folgt: Je nachdem, wo der höchste Frequenzkoeffizient verwendet wird, wäre dies die Position der höchsten Frequenzkomponente. Ich kann jedoch die Regeln nicht erklären, warum einige Algorithmen ihre Ausgaben an verschiedenen Positionen usw. haben können (außer sie am Ende neu anzuordnen).
user1166780
Wolfram Alpha-Link sollte Folgendes haben: cos ((2 * pi / 512) * x * 500) + i * sin ((2 * pi / 512) * x * 500), scheint nicht zu funktionieren. Ändern Sie 500 in 1 und sehen Sie den Unterschied. Wenn Sie 0 und 0 eingeben, ist die Frequenz natürlich 0. Wenn wir sie jedoch am Ende neu anordnen (falls unsere Daten von-etwas bis + etwas sind), können wir unsere 0-Hz-Komponente in der Mitte haben.
user1166780

Antworten:

8

Wenn die gewünschte Frequenzverschiebung ein Vielfaches des Bin-Abstands ist, wie in Ihrem Beispiel, können Sie die gewünschte Verschiebung leicht bewirken, indem Sie einfach die FFT-Ausgänge um die Anzahl der benötigten Bins drehen. In dem häufigeren Fall, dass der Frequenzversatz kein ganzzahliges Vielfaches des Bin-Abstands ist, können Sie das Signal vor der FFT mit einer komplexen Exponentialfunktion multiplizieren.

Wenn Sie also feststellen, dass sich die Mittenfrequenzkomponente, von der Sie sprechen, tatsächlich bei der Frequenz Hz in Ihren Daten befindet und die Daten mit der Rate Hz abgetastet werden , verschieben Sie das Spektrum so, dass die interessierende Komponente ist Bei einer Frequenz von Null im FFT-Ausgang würden Sie Folgendes tun:fÖffsetfs

xverschoben[n]]=x[n]]e- -j2πfVersatznfs,  n=0,1,,N.- -1

Y.verschoben[k]]=F.F.T.[xverschoben[n]]]]
Jason R.
quelle
1
Vielen Dank dafür, aber wo haben Sie diese Informationen gefunden?
user1166780
Nun, egal, 'komplexe exponentielle Multiplikationsfrequenzverschiebung' oder ähnliches ist das Schlüsselwort, nach dem ich gesucht habe. Danke noch einmal.
user1166780
1
Dies ist eine grundlegende Eigenschaft der diskreten Fourier-Transformation , von der die FFT nur eine effiziente Implementierung ist. Die anderen Transformationen in der Fourier-Familie haben eigene analoge Eigenschaften, aber es gibt subtile Unterschiede in jeder.
Jason R
Ich bin verwirrt. Ich versuche dies zu verwenden, um ein Echtzeitdomänensignal mit FFT (kreisförmig) zu verschieben. Ganzzahlige Sample-Verschiebungen funktionieren einwandfrei, aber wenn ich versuche, um ein halbes Sample zu verschieben, wird das Ergebnis imaginär und sieht nicht wie das Original aus (Original ist gerade-symmetrisch, Ergebnis ist ungerade-symmetrisch). Gleiches gilt für ungerade oder gerade Längen.
Endolith
@endolith: Ich bin nicht sicher, was Sie dort versuchen. Die Antwort, die ich oben gegeben habe, war, einfach eine Frequenzverschiebung auf ein Signal anzuwenden. Versuchen Sie, eine geringfügige Verzögerung anzuwenden?
Jason R
-2

Nun, der einfache Weg ist, wenn Sie das Fourier verwendet haben, um die Spektren zu finden, und Sie müssen seine Frequenz wissen, um wie viel es verschoben ist, können Sie eine Sache tun.

1) Finden Sie die Impulsantwort aus diesen Spektren heraus

2) falten Sie es mit einem Geräusch

3) Sehen Sie das Signal, dass Sie obtaine4) nehmen Sie seine FFT, nur um sicherzugehen, ob es mit der vorherigen übereinstimmt

4) und sehen Sie die Spektren durch Mitteln in verschiedene Teile ... dafür kann ich ua einen Algorithmus in der mathematica-Software angeben, das heißt

reflect[a_] := Module[{n = Length[a]},
  RotateRight[a, Floor[n/2]]
  ]

freqAxis[len_] := Module[{},
   If[OddQ[len],
    Range[1, len] - (Ceiling[len/2.]),
    Range[1, len] - (1 + Ceiling[len/2.])
    ]
   ];

colors = {Black, Red, Blue, Brown , ColorData["Legacy", "DarkGreen"], 
   ColorData["Legacy", "Goldenrod"], ColorData["Legacy", "DeepPink"], 
   Cyan, Orange, Purple, ColorData["Legacy", "DeepSkyBlue"], Magenta};

specPlot[pieces_, pieceLen_, color_] := 
 Module[{data, spec, fAxis, pos},
  fAxis = freqAxis[pieceLen];
  data = Partition[Take[mysignal, pieces*pieceLen], pieceLen];
  spec = Total[Abs[Fourier[data]]^2]/pieces;
  spec = reflect[spec];
  Print["valley=", Nearest[spec, 1.0][[1]], " atPos=", 
   pos = Position[spec, Nearest[spec, 1.0][[1]]][[1, 1]], " atFpos=", 
   Position[fAxis, 0][[1, 1]], " atF=", fAxis[[pos]], " firstMax=", 
   Max[Take[spec, Round[pieceLen/2]]], " atF=", 
   fAxis[[Position[spec, Max[Take[spec, Round[pieceLen/2]]]][[1, 
     1]]]], " lastMax=", Max[Take[spec, -Round[pieceLen/2]]], " atF=",
    fAxis[[Position[spec, Max[Take[spec, -Round[pieceLen/2]]]][[1, 
     1]]]]];
  ListLinePlot[Transpose[{fAxis, spec}], PlotStyle -> colors[[color]],
    PlotLabel -> "N = " <> ToString[pieces], PlotRange -> All]
  ]

In diesem Code habe ich ein Argument für pmsesignal, damit Sie stattdessen Ihr eigenes Signal verwenden können.

Ich bin mir nicht sicher, wie gut ich das erklärt habe, aber das hatte in meinem Fall funktioniert.

Prost!

Marschall
quelle