jiyutao 发表于 2009-1-5 03:48

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命令,如果要用的话具体怎么用这个命令呢?
有高手能帮帮我吗?最好能给出具体的程序来,谢谢了!

hcharlie 发表于 2009-1-5 15:26

回复 楼主 jiyutao 的帖子

FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0,真正的N就不是原来的N了。这里还不如取N=8192为好。
FFT以后,不要取绝对值,保留实部虚部,将频率高的部分清0,再IFFT就是了。
这样做有个前提,就是FFT以前认为它是一个周期信号,头尾是相接的(函数及其一阶导数连续),如果不是周期信号,头尾不相接,则IFFT以后,头尾部分是有歧变的。

[ 本帖最后由 hcharlie 于 2009-1-5 18:05 编辑 ]

ChaChing 发表于 2009-1-5 18:58

本帖最后由 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的确如此)

dizi1028 发表于 2009-2-24 14:53

回复 沙发 hcharlie 的帖子

我记得如果fft没有指定nfft(即fft点数)的时候,他是按照采样点的多少来做fft的,并不是添零变成2的幂次方,只有你指定的nfft比采样点数多的时候才会添零,这样做的好处是加快fft的运算速度和提高频率分辨率

我也只是新手,不知道说的对不对!

songzy41 发表于 2009-2-25 14:28

在MATLAB中点数既可以是2的幂次,也可以不是。对信号处理时,FFT后保留50Hz前的复数值,同时在负频率方面也做相应的处理,然后再做IFFT便能得到。

jidianwangliang 发表于 2009-6-9 23:02

本帖最后由 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的一种快速算法

倔强的笨蛋 发表于 2012-11-12 16:48

hcharlie 发表于 2009-1-5 15:26 static/image/common/back.gif
FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0,真正的N就不是原来的N了。这里还不如取N=8192为好。 ...

是周期信号,也会发生畸变啊,存在着截断误差,有没有办法解决啊?高手

咯咯 发表于 2012-12-17 18:50

hcharlie 发表于 2009-1-5 15:26 static/image/common/back.gif
FFT时N是用2的整数幂做的,当N不是时则matlab采用尾加0,真正的N就不是原来的N了。这里还不如取N=8192为好。 ...

我想问下IFFT时,头尾产生畸变具体应该怎么处理呢?有相关的资料没啊?谢谢!
页: [1]
查看完整版本: FFT频域滤波之后的IFFT的实现,急求!