Warum ist die Fourier-Transformation eines einzelnen Sinuszyklus kein einzelner Balken?

12

Ich habe verschiedene Fourier-Transformations-Codes für einzelne Sinuswellen ausprobiert, und alle erzeugen ein verteiltes Spektrum mit einer Resonanz bei der Signalfrequenz, wenn sie theoretisch einen einzelnen Balken anzeigen sollten.

Die Abtastfrequenz hat nur geringen Einfluss (hier 10 kHz), die Anzahl der Zyklen jedoch:

Ein Zyklus:

Bildbeschreibung hier eingeben

100 Zyklen:

Bildbeschreibung hier eingeben

100000 Zyklen:

Bildbeschreibung hier eingeben

Es sieht so aus, als ob die Fouriertransformation nur für eine unendliche Anzahl von Zyklen konvergiert. Warum ist das so? Sollte ein Zeitfenster von genau einem Zyklus nicht die gleichen Ergebnisse bringen wie das von N Zyklen?

Anwendung: Dies ist sowohl aus Neugier als auch, weil ich erfahren möchte, wie sehr die Sprungantwort eines Systems erster Ordnung die Resonanz einer mechanischen Baugruppe erregt. Deshalb brauche ich eine genaue Fourier-Transformation der Antwort ... der ich nicht mehr vertraue. Was könnte ich dann tun, um die Genauigkeit basierend auf dem "Sinuswellen" -Fall zu verbessern?

Bildbeschreibung hier eingeben

PS: Diese Screenshots basieren auf dem Code hier .

Herr Mystère
quelle
6
Beachten Sie, dass es neben der akzeptierten Antwort keinen Grund zur Annahme gibt, dass die zeitdiskrete Fouriertransformation (die Sie mit der DFT berechnen) ein Impuls für ein Eingangssignal ist, das eine Periode einer Sinuskurve ist. Die zeitkontinuierliche Fouriertransformation einer Sinuskurve ist ein Impuls, ja, aber diese Sinuskurve hat eine unendliche Dauer. Wenn Sie das Signal zeitlich begrenzen, entspricht dies der Multiplikation mit einer rechteckigen Fensterfunktion. Das Frequenzbereichsergebnis ist die Faltung des Impulses und die Fouriertransformation des Fensters, was im Wesentlichen das ist, was Sie beobachten.
Jason R
Danke für die Bemerkung. Wie erklären Sie sich also, dass das Ergebnis ein einzelner Balken ist, wenn ich die NFFT-Nummer in die Länge des Vektors ändere?
Mister Mystère
1
Gute Frage. Dies geschieht aufgrund einer inhärenten Annahme in der DFT. Es wird angenommen, dass sich das am Eingang der DFT gegebene Signal endlicher Länge periodisch in beide Richtungen mit unendlicher Dauer erstreckt. Wenn Sie also eine ganzzahlige Anzahl von Zyklen innerhalb der "Apertur" der DFT haben, erhalten Sie die Transformation einer Sinuskurve mit unendlicher Dauer: einen einzelnen Impuls. Dies entspricht dem Fall einer spektralen Streuung von genau Null und tritt in der Praxis nur selten auf.
Jason R

Antworten:

30

Dies ist ein Fensterartefakt.

Der verknüpfte Code füllt ein 10.000-Samplesignal mit Nullen auf, sodass die Länge eine Zweierpotenz ist.

%% Author :- Embedded Laboratory

%%This Project shows how to apply FFT on a signal and its physical 
% significance.

fSampling = 10000;          %Sampling Frequency
tSampling = 1/fSampling;    %Sampling Time
L = 10000;                  %Length of Signal
t = (0:L-1)*tSampling;      %Time Vector
F = 100;                    %Frequency of Signal

%% Signal Without Noise
xsig = sin(2*pi*F*t);
...

%%Frequency Transform of above Signal
subplot(2,1,2)
NFFT = 2^nextpow2(L);
Xsig = fft(xsig,NFFT)/L;
...

Beachten Sie, dass im obigen Code die FFT mit der FFT-Größe genommen wird, NFFTdie die nächste Zweierpotenzfft() ist, die größer ist als die Signallänge (in diesem Fall 16.384). Aus der Mathworks- Dokumentation :

Y = fft(X,n)gibt die n-Punkt-DFT zurück. fft(X)entspricht , fft(X, n)wo ndie Größe ist Xin der ersten Dimension nonsingleton. Wenn die Länge von Xkleiner als ist n, Xwird mit nachgestellten Nullen auf Länge aufgefüllt n. Ist die Länge von Xgrößer als n, wird die Sequenz Xabgeschnitten. Wenn Xes sich um eine Matrix handelt, wird die Länge der Spalten auf dieselbe Weise angepasst.

Dies bedeutet, dass Sie keine FFT einer "reinen Sinuswelle" nehmen - Sie nehmen die FFT einer Sinuswelle mit einem flachen Signal danach.

Dies entspricht der FFT einer Sinuswelle multipliziert mit einer Rechteckfensterfunktion. Das FFT-Spektrum ist dann die Faltung des Sinusfrequenzspektrums (eine Impulsfunktion) mit dem Rechteckfrequenzspektrum (sinc (f).)

Wenn Sie L = 16,384so ändern , dass das Signal nicht mit Nullen aufgefüllt wird, beobachten Sie eine perfectFFT.

Weitere Suchbegriffe: "Spectral Leakage", "Window Function", "Hamming Window".


Bearbeiten: Ich habe einiges Material, das ich zu diesem Thema geschrieben habe, an der Universität aufgeräumt, was wesentlich detaillierter ist. Ich habe das auf meinem Blog gepostet .

Li-aung Yip
quelle
Es war die ganze Zeit direkt vor meinem Gesicht. Gut gemacht, Sir, ich habe gerade die NFFT-Nummer in die Länge des Vektors geändert und das hat es geschafft.
Herr Mystère
1
@ MisterMystère: Siehe Bearbeiten für den Link zu dem relevanten Material, das ich an der Universität geschrieben habe. Eine viel gründlichere Erklärung, einschließlich Bilder.
Li-aung Yip
(Obwohl ich vergessen habe, die mathematischen Formeln neu
einzugeben
Nur eine Erinnerung daran, dass das Auffüllen von nextpow2 mit Matlab-FFT-Algorithmen wenig vorteilhaft ist. Ich glaube, es ist fftw (schnellste Fourier-Transformation im Westen)
Scott Seidman