2012-06-11 140 views
5

的這部分是從MATLAB FFT的文檔採取:FFT/IFFT:採樣頻率和長度信號

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 

在我看來,每當該信號的長度是採樣頻率的倍數,正弦重構(除了一些移位),例如這裏Fs = 30, L = 60

enter image description here

然而,例如,如果Fs = 30, L = 80(不是多),結果看起來很奇怪:

enter image description here

這種行爲是正確的嗎?爲什麼會發生這種情況,我該如何避免這種情況?只要丟掉信號的一部分,使長度「適合」採樣頻率?

回答

7

在ifft中使用abs(fft())時,僅使用信號的幅度並丟棄所需的相位信息。

使用整個信號(除去ABS):

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

謝謝你,能解決它。不過,我不明白爲什麼需要階段信息。你能詳細解釋一下嗎?爲什麼它在某些情況下可以正常工作(除了輪班)? – Tobold

+3

檢查fft(或dft)的定義。 fft(X)的結果的頻率爲(Fs/2)*(0 ...(N/2)+1)/(N/2 + 1)。爲了達到你的1Hz的竇你需要找到k使得(Fs/2)* K /(N/2 + 1)= 1.當k是一個整數(整數)時,不需要相位(延遲) 1Hz,這發生在N/F(或你的情況下的L/F)是一個整數。如果不是,則FFT輸出中不存在1Hz,算法「表示」1Hz的值接近1Hz,加上將其延遲到1Hz的相位值。我希望我的解釋是清楚的。 :) – Ran

+0

謝謝!現在很清楚:) – Tobold