我使用快速傅立叶变换编写了一个小脚本(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的一些理论事实(我自学,所以一切都不那么清楚)。
答案 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');