花如月 发表于 2007-7-15 14:23

FFT滤波的物理意义

在matlab版区我回复过别人一个关于fft和ifft滤波的问题,下边是我的程序
clear;
w=100*pi;
t=0:0.0001:0.04;
y=sin(w*t)+sin(2*w*t)+sin(3*w*t);%定义原始信号
F=fft(y);
F(find(F>5))=0;%滤除高频分量
y1=ifft(F);
figure
subplot(121),plot(t,y);title('原信号')
subplot(122),plot(t,y1);title('滤波后')
原信号包含100HZ和150HZ的谐波,滤除后只有50HZ的正弦波。后来他们问F(find(F>5))=0的物理含义的时候我也范迷糊了,因为当时写的时候没考虑太多,而且确实也可以滤除。。所以请教一下高人,程序的结果只是巧合么?如果是,那么正确的应该怎么写?如果不是物理意义怎么解释?

w89986581 发表于 2007-7-15 14:58

回复 #1 花如月 的帖子

确实如此,find(F>5)相对于find(real(F)>5).如果楼主构造信号时增加一个相位,滤波以后就不是这个结果了,呵呵.

花如月 发表于 2007-7-15 15:31

回复 #2 w89986581 的帖子

也就是说完全是巧合了,real(F)>5没有任何意义么?
给个带相位滤波的正确例子吧,也好让初学者有个参考
可不能误导了版友:@L ,我让他们关注这个帖子了。
能滤除高频的分量就行,谢谢了!

zhangnan3509 发表于 2007-7-15 15:35

回复 #2 w89986581 的帖子

我也觉得是real(F)>5,图形几乎和不加这句没什么差别

w89986581 发表于 2007-7-15 15:47

回复 #3 花如月 的帖子

clear;
w=100*pi;
t=0:0.0001:0.04;
y=sin(w*t)+sin(2*w*t)+sin(3*w*t);%定义原始信号
F=fft(y);
F(4:end-3) = 0;%滤除高频分量
y1=real(ifft(F));
figure
subplot(121),plot(t,y);title('原信号')
subplot(122),plot(t,y1);title('滤波后')

但是不建议直接从频域上直接滤波,这样信号畸变很大.对于你这个问题,采样率高,虑除频率低,直接设计低通滤波器需要的阶数高.因此建议先降采样,再进行低通滤波,前提时信号采集长度足够长.所以,在信号采集时,关心的频率越低,采集时时间应该越长.

[ 本帖最后由 zhlong 于 2007-7-15 19:40 编辑 ]

花如月 发表于 2007-7-15 15:49

回复 #4 zhangnan3509 的帖子

real(F)>5和F>5结果是一样的,主要是程序这样滤波好像是完全巧合。没有任何物理意义。高手们给一个正确的程序吧,还是那个信号(加上不同的相位差),要滤掉100和150HZ的

w89986581 发表于 2007-7-15 15:50

回复 #4 zhangnan3509 的帖子

呵呵find(F>5)就等于find(real(5)),替换以后当然没有变化拉,哈哈.如果构造信号时,认为增加相位,find(F>5)返回的值就不同拉,因此不能实现指定频带滤波的设计任务.

花如月 发表于 2007-7-15 15:54

回复 #5 w89986581 的帖子

谢谢你的意见,F(6:end-5) = 0;%滤除高频分量。这句的物理意义可否解释一下呢。不好意思,基础理论相当欠缺:@L

songzy41 发表于 2007-7-15 16:00

楼主的设置是一种巧合。通过以下程序看一下楼主提供的程序在频率维上的情况:
w=100*pi;
t=0:0.0001:0.04;
y=sin(w*t)+sin(2*w*t)+sin(3*w*t);%定义原始信号
F=fft(y);
subplot(221); stem(real(F));title('F实部');
axis();
subplot(222); stem(imag(F));title('F虚部');
axis();
F1=F;
F1(find(F1>5))=0;%滤除高频分量
y1=ifft(F1);
fs=10000;
N=length(t);
n2=1:N/2;
ff=fs*(n2-1)/N;
subplot(223),stem(ff,abs(F(n2)));title('原信号频谱');
axis();
subplot(224),stem(ff,abs(F1(n2)));title('滤波后频谱')
axis();
图如下,可看到50是笫3根谱线,100是笫5根谱线,150是笫7根谱线。在F的实部中50对应为3,100和150对应的都大于5。所以在F(find(F>5))=0中把100和150处的值都设为0。若要从频率维上滤波,可有
w=100*pi;
t=0:0.0001:0.04;
y=sin(w*t)+sin(2*w*t)+sin(3*w*t);%定义原始信号
F=fft(y);
F1=;
y1=ifft(F1);
subplot(121),plot(t,y);title('原信号')
subplot(122),plot(t,y1);title('滤波后')

[ 本帖最后由 songzy41 于 2007-7-15 16:02 编辑 ]

花如月 发表于 2007-7-15 16:01

回复 #5 w89986581 的帖子

刚试了你的程序,没有滤波效果呀。
2个图是一样的

songzy41 发表于 2007-7-15 16:05

原帖由 w89986581 于 2007-7-15 15:47 发表 http://www.chinavib.com/forum/images/common/back.gif
clear;
w=100*pi;
t=0:0.0001:0.04;
y=sin(w*t)+sin(2*w*t)+sin(3*w*t);%定义原始信号
F=fft(y);
F(6:end-5) = 0;%滤除高频分量
y1=real(ifft(F));
figure
subplot(121),plot(t,y);title('原信号')
su ...
应该为
F(4:end-3) = 0;

w89986581 发表于 2007-7-15 16:06

回复 #10 花如月 的帖子

F(4:end-2) = 0;%滤除高频分量
fft变换以后得到的就是频率域谱,你把不想要的频率都设为零,因此可以实现频率滤波.但是这种滤波器硬件实现起来很痛苦.

[ 本帖最后由 w89986581 于 2007-7-15 16:13 编辑 ]

花如月 发表于 2007-7-15 16:14

谢谢songzy41 w89986581的大力帮忙,我回头再消化一下 :@L
对于“F(4:end-3) = 0;%滤除高频分量”这句的原理还是不太明白

w89986581 发表于 2007-7-15 16:16

回复 #11 songzy41 的帖子

呵呵,是的.老婆的计算机上不让我安装matlab:@(

zhangnan3509 发表于 2007-7-15 17:00

回复 #13 花如月 的帖子

从第四根谱线到倒数第四根谱线,值都设为0,也就是频率滤波
页: [1] 2 3
查看完整版本: FFT滤波的物理意义