FFT频域滤波之后的IFFT的实现,急求!
matlab的新手。具体想实现下面的功能。现在有一段时间长为10秒的脑波数据。首先FFT变换:
%signal为脑波信号
fs=1000; %采样频率
N=10000; %采样点数
t=(0:N-1)/fs; %采样时间序列
fft_signal=2*abs(fft(signal))/N;
fft_signal=fft_signal(1:N/2);
df_ps=fs/N; %频率分辨率Hz
f_ps=(0:N/2-1)*df_ps; %频域序列
这样得到频域数据fft_signal,之后想把50Hz以上的频率值置为零,来保留50Hz以下的脑波数据。(应该叫做低通滤波吧)
然后用0到50Hz的频率用IFFT恢复到原来的波形。应该是得到光滑的波形。
但是我差了很多资料还是不知道具体该怎么实现。是不是要用到FITLER命令,如果要用的话具体怎么用这个命令呢?
有高手能帮帮我吗?最好能给出具体的程序来,谢谢了!
回复 楼主 jiyutao 的帖子
FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0,真正的N就不是原来的N了。这里还不如取N=8192为好。FFT以后,不要取绝对值,保留实部虚部,将频率高的部分清0,再IFFT就是了。
这样做有个前提,就是FFT以前认为它是一个周期信号,头尾是相接的(函数及其一阶导数连续),如果不是周期信号,头尾不相接,则IFFT以后,头尾部分是有歧变的。
[ 本帖最后由 hcharlie 于 2009-1-5 18:05 编辑 ] 本帖最后由 VibInfo 于 2016-11-8 16:11 编辑
原帖由 hcharlie 于 2009-1-5 15:26 发表
FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0...
我记得好像是使用fft(X,n), 当n>length(X)时才会补零
若使用fft(X), 则是使用DFT, 或许记错了! (v5.6的确如此)
回复 沙发 hcharlie 的帖子
我记得如果fft没有指定nfft(即fft点数)的时候,他是按照采样点的多少来做fft的,并不是添零变成2的幂次方,只有你指定的nfft比采样点数多的时候才会添零,这样做的好处是加快fft的运算速度和提高频率分辨率我也只是新手,不知道说的对不对! 在MATLAB中点数既可以是2的幂次,也可以不是。对信号处理时,FFT后保留50Hz前的复数值,同时在负频率方面也做相应的处理,然后再做IFFT便能得到。 本帖最后由 VibInfo 于 2016-11-8 16:11 编辑
原帖由 ChaChing 于 2009-1-5 18:58 发表
我记得好像是使用fft(X,n), 当n>length(X)时才会补零
若使用fft(X), 则是使用DFT, 或许记错了! (v5.6的确如此)
同意啊,fft只不过是dft的一种快速算法 hcharlie 发表于 2009-1-5 15:26 static/image/common/back.gif
FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0,真正的N就不是原来的N了。这里还不如取N=8192为好。 ...
是周期信号,也会发生畸变啊,存在着截断误差,有没有办法解决啊?高手 hcharlie 发表于 2009-1-5 15:26 static/image/common/back.gif
FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0,真正的N就不是原来的N了。这里还不如取N=8192为好。 ...
我想问下IFFT时,头尾产生畸变具体应该怎么处理呢?有相关的资料没啊?谢谢!
页:
[1]