逆傅立叶变换的移位

时间:2014-03-18 08:03:04

标签: matlab signal-processing fft dft

我使用快速傅立叶变换编写了一个小脚本(MATLAB)来过滤凌乱的时间序列。

给定一个信号S(t),我的函数从S(t)的FFT变换中滤除n个最大振幅分量,并通过逆FFT返回滤波后的信号。

问题在于,当我使用测试信号时,滤波后的信号以某种方式移动了大约。幅度为-1。我试图改变窗口,但似乎没有帮助(但是移动向+1移动)。

以下是我的脚本示例代码:

% test Signal

t=0:0.1:1000;
f1=1/50; f2=1/300; f3=1/20;
Signal=100*sin(f1*2*pi*t)6x1+8*sin(f2*2*pi*t)+x3+x4+65*sin(f3*2*pi*t);

[FiltredSignal]=Filter(data,5,0); % call Filter function

figure
plot(t,real(a)*2,t,data) 

figure
plot(t,real(a)*2-data) % ???? shift of -1 in ifft ????


function [FiltredSignal]=Filter(Signal,n)   
% n= nbr of "most significative spectra components"

timelen=length(Signal);

FT=fft(Signal); % fast fourrier transform

FTcopy=FT/timelen; % Copy for spectral analysis
FTcopy(floor(timelen/2+1):end)=[]; % cut at nyquist point
FTcopy(1,1)=0; 


% sort FT2 in descending amplitude order
sortedFT=sort(abs(FTcopy),'descend');

% spectral selection --> n biggest amplitudes
FiltredFT=zeros(1,timelen); 
for i=1:n
  freq=find(abs(FTcopy)==sortedFT(i));      
  FiltredFT(freq)=FT(1,freq);
  %FiltredFT(freq-1)=FT(1,freq-1); % windowing
  %FiltredFT(freq+1)=FT(1,freq+1); % windowing
end

FiltredData=ifft(FiltredFT); % return filtred signal time serie

% END

有人可以解释发生了什么吗?

我肯定会错过FFT的一些理论事实(我自学,所以一切都不那么清楚)。

1 个答案:

答案 0 :(得分:0)

以上是上述功能的修订版,感谢Paul R的评论。

function [FiltredSignal]=Filter(Signal,n)   
"% n= nbr of spectral components to keep "

timelen=length(Signal);

FT=fft(Signal); "% fast fourrier transform"

FTcopy=FT/timelen; "% Copy for spectral analysis"
FTcopy(floor(timelen/2+1):end)=[]; "% cut at nyquist point"


"% sort FT2 in descending amplitude order"
sortedFT=sort(abs(FTcopy),'descend');

"% spectral selection --> n biggest amplitudes"

FiltredFT=zeros(1,timelen); 

for i=1:n
  freq=find(abs(FTcopy)==sortedFT(i));      
  FiltredFT(freq)=FT(1,freq);
end

"% return filtred signal time serie with complex conjugate reconstruction"
FiltredData=ifft(FiltredFT,'symmetric');