2012-06-11 5 views
5

Diese zum Teil aus dem Matlab fft-Dokumentation entnommen:fft/ifft: Sampling-Frequenz und Dauer der Signal

Fs = 30;     % Sampling frequency 
T = 1/Fs;     % Sample time 
L = 130;     % Length of signal 
t = (0:L-1)*T;    % Time vector 

x = sin(2*pi*1*t);   % 1 Hz sinus 

plot(real(ifft(abs(fft(x))))); % fft then ifft 

% Fs = 30, L = 60/90/120 ... : ok 
% Fs = 20, L = 60/80/100 ... : ok 
% Fs = 30, L = 50/70/80 ... : not ok 

Es scheint mir, dass, wenn die Länge des Signals ein Vielfaches der Abtastfrequenz ist, die Sinuskurve wird korrekt rekonstruiert (abgesehen von einigen Verschiebungen), z hier Fs = 30, L = 60:

enter image description here

Wenn jedoch zum Beispiel Fs = 30, L = 80 (kein Mehrfach), sieht das Ergebnis ungerade:

enter image description here

Ist dieses Verhalten richtig? Warum passiert das und wie kann ich das vermeiden? Einfach einen Teil des Signals wegwerfen, so dass die Länge der Abtastfrequenz "passt"?

Antwort

7

Wenn Sie die Abs (fft()) in ift verwenden, verwenden Sie nur die Amplitude des Signals und die Phaseninformation, die benötigt wird.

Verwenden Sie das gesamte Signal (entfernt abs):

plot(real(ifft(fft(x)))); % fft then ifft 
+0

Vielen Dank, dass sie löst. Trotzdem verstehe ich nicht, warum die Phaseninformation benötigt wird. Könnten Sie das ein bisschen genauer erläutern? Warum funktioniert es (abgesehen von der Verschiebung) in einigen Fällen korrekt? – Tobold

+3

Überprüfen Sie die fft (oder dft) Definition. Die Häufigkeiten im Ergebnis von fft (X) sind (Fs/2) * (0 ... (N/2) +1)/(N/2 + 1). Um zu Ihrem 1Hz-Sinus zu kommen, müssen Sie k so finden, dass (Fs/2) * k/(N/2 + 1) = 1. Wenn k eine ganze Zahl ist (runde Zahl), wird keine Phase (Verzögerung) benötigt 1Hz, und das passiert, wenn N/Fs (oder L/Fs in Ihrem Fall) eine ganze Zahl ist. Wenn dies nicht der Fall ist, gibt es keine 1Hz in Ihrem FFT-Ausgang, und der Algorithmus "repräsentiert" 1Hz in einem Wert k, der nahe bei 1Hz plus einem Phasenwert liegt, der ihn auf 1Hz verzögert. Ich hoffe meine Erklärung ist etwas, was klar ist. :) – Ran

+0

Danke! Jetzt ist es klar :) – Tobold