声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4096|回复: 15

[FFT] 关于IFFT

[复制链接]
发表于 2008-11-23 21:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我想问一下,一个实信号经过FFT变换,然后对其频率作了处理后,再做IFFT变换,这时候信号变为了复数,那么应该是取其实部还是取其绝对值?
回复
分享到:

使用道具 举报

发表于 2008-11-23 21:57 | 显示全部楼层
如果在做IFFT变换后楼主想得到实数序列,则在IFFT之前应满足实部偶对称、虚部奇对称,在IFFT之后取实部(虚部虽有数值,但一般较小,是由有限字长运算所造成的误差)。
 楼主| 发表于 2008-11-24 16:32 | 显示全部楼层
请帮我看一下,我用下面的程序实现一个理想滤波器,但是IFFT后的信号虚部挺大的,取实部跟取绝对值差很多,请帮我指出错在哪里? 谢谢!!


% 对信号sig进行滤波
%fmin为滤波器的下限频率
%fmax为滤波器的上限频率
% fs为信号的采样频率

n=length(sig);    %取信号数据长度
t=(0:1/fs:(n-1)/fs)';   %建立离散时间列向量
nfft=2^nextpow2(n);  %取大于并最接近n的2的幂次方为FFT长度
nmin=round(fmin*nfft/fs+1);     %四舍五入取整求最小截止频率对应数组元素的下标
nmax=round(fmax*nfft/fs+1);     %四舍五入取整求最大截止频率对应数组元素的下标

y=fft(sig,nfft);        %进行FFT变换,结果存于y

a=zeros(1,nfft);        %建立一个长度为nfft,元素全为0的向量
a(nmin:nmax)=fftx(nmin:nmax);      %将y的正频率带通内的元素赋值给a
a((nfft-nmax+1):(nfft-nmin+1))=fftx((nfft-nmax+1):(nfft-nmin+1));  %将y的负频率带通内的
%元素赋值给a
y1=ifft(a,nfft);         %进行FFT逆变换,结果存于y
y1=(real(y1(1:n)))';     % 取逆变换的实部作为滤波后的信号
发表于 2008-11-24 20:47 | 显示全部楼层
这语句
a((nfft-nmax+1):(nfft-nmin+1))=fftx((nfft-nmax+1):(nfft-nmin+1));  
改为
a((nfft-nmax+2):(nfft-nmin+2))=fftx((nfft-nmax+2):(nfft-nmin+2));  
试试看.
 楼主| 发表于 2008-11-24 21:49 | 显示全部楼层
谢谢,问题解决了~~~

我看了别的帖子,也知道了原因  :@)

太感谢了!!
发表于 2008-11-24 23:40 | 显示全部楼层

回复 5楼 yjesefcu 的帖子

能否把原因和大家分享一下?
 楼主| 发表于 2008-11-25 14:59 | 显示全部楼层
不好意思,昨天没有好好验证,如果nmin为0的就没有问题,但是如果nmin不为0,问题还是存在的

所以还是想请教一下songzy41,到底问题在哪里?
 楼主| 发表于 2008-11-25 15:02 | 显示全部楼层
或者说用这种理想滤波器做是不是不太好? 因为我需要在10000Hz的采样频率信号中滤除掉前0.001Hz的超低频信号,如果用MATLAB已经有的滤波器不知道能不能达到很好的滤波效果,因为貌似基本上过渡带都无法达到那么窄

不知道有没有什么别的方法可以实现这个目标?
发表于 2008-11-25 18:28 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 13:58 编辑
原帖由 yjesefcu 于 2008-11-25 14:59 发表
不好意思,昨天没有好好验证,如果nmin为0的就没有问题,但是如果nmin不为0,问题还是存在的

所以还是想请教一下songzy41,到底问题在哪里?

我在下帖中已指出了错误:

这语句
a((nfft-nmax+1):(nfft-nmin+1))=fftx((nfft-nmax+1):(nfft-nmin+1));  
改为
a((nfft-nmax+2):(nfft-nmin+2))=fftx((nfft-nmax+2):(nfft-nmin+2));  
试试看.

其原因是这样的:当实数数据进行nfft长的FFT变换时,变换后也长nfft,有共轭对称的特点。对应的0频率谱线下标为1,fs/2的谱线下标为nfft/2+1,而且是以下标为nfft/2+1为共轭对称,即实部从下标2~nfft/2与下标nfft~nfft/2+2相同(下标nfft/2的数值与下标nfft/2+2的数值相同、...一直到下标2的数值与下标nfft的数值相同),而虚部是下标2-nfft/2与下标nfft-nfft/2+2的数值相同,符号相反。
既然这样,我们可试一下,把nmin=2,它的对称下标应为nfft,所以只有nfft-nmin+2=nfft,才能得正确结果;同样设nmax=nfft/2,也一样要有nfft-nmax+2才能得它的对称下标nfft/2+2。
所以这样语句
a((nfft-nmax+1):(nfft-nmin+1))=fftx((nfft-nmax+1):(nfft-nmin+1));  
把对称关系错了,就造成虚部的数值还“挺大的”。
如果nmin=1,或nmax=nfft/2+1时就不能用这种方法处理。

[ 本帖最后由 songzy41 于 2008-11-25 19:39 编辑 ]
 楼主| 发表于 2008-11-25 19:40 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 13:58 编辑
原帖由 songzy41 于 2008-11-25 18:28 发表

我在下帖中已指出了错误:

其原因是这样的:当实数数据进行nfft长的FFT变换时,变换后也长nfft,有共轭对称的特点。对应的0频率谱线下标为1,fs/2的谱线下标为nfft/2+1,而且是以下标为nfft/2+1为共轭对称,即实 ...


这个原因我知道了,但是我改了之后,如果通带下限为0Hz的话IFFT结果是实数,但如果下限不为0,IFFT结果的虚部还是挺大的

所以如果通带下限不为0,即在(1:nfft/2+1)中只有(nmin:nmax)不为0,其余都为0,fs/2跟零频点的值也都为0,按照上述方法求得右边部分,这样还会被当作是共轭对称来处理吗?为什么IFFT后虚部还是挺大的?
发表于 2008-11-25 19:44 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 13:58 编辑
原帖由 yjesefcu 于 2008-11-25 15:02 发表
或者说用这种理想滤波器做是不是不太好? 因为我需要在10000Hz的采样频率信号中滤除掉前0.001Hz的超低频信号,如果用MATLAB已经有的滤波器不知道能不能达到很好的滤波效果,因为貌似基本上过渡带都无法达到那么窄
不知道有没有什么别的方法可以实现这个目标?

如果确是一个0.001Hz的超低频信号叠加在信号上,可把0.001Hz的超低频信号作为趋势项,用消除趋势项的方法来消除它;0.001Hz和10000HZ相比差10^7,用低通滤波的办法是较难滤除。
 楼主| 发表于 2008-11-26 12:49 | 显示全部楼层
那我想问一下有没有什么比较好的去趋势项的方法? 这个方面我不懂

纠正一下,大概是要滤掉前0.04Hz的信号
发表于 2008-11-26 18:08 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 13:58 编辑
原帖由 yjesefcu 于 2008-11-25 19:40 发表
这个原因我知道了,但是我改了之后,如果通带下限为0Hz的话IFFT结果是实数,但如果下限不为0,IFFT结果的虚部还是挺大的

如果通带下限fmin为0Hz,nmin=1,则按
a((nfft-nmax+2):(nfft-nmin+2))=fftx((nfft-nmax+2):(nfft-nmin+2));  
计算时:nfft-nmin+2=nfft+1,这在数组a和fftx中都会下标溢出,而楼主怎么会能计算出的?

所以如果通带下限不为0,即在(1:nfft/2+1)中只有(nmin:nmax)不为0,其余都为0,fs/2跟零频点的值也都为0,按照上述方法求得右边部分,这样还会被当作是共轭对称来处理吗?为什么IFFT后虚部还是挺大的?

而我按这样来计算,虚部很小:
a(nmin:nmax)=fftx(nmin:nmax);      
a((nfft-nmax+2):(nfft-nmin+2))=fftx((nfft-nmax+2):(nfft-nmin+2));
发表于 2008-11-26 18:09 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 13:59 编辑
原帖由 yjesefcu 于 2008-11-26 12:49 发表
那我想问一下有没有什么比较好的去趋势项的方法? 这个方面我不懂
纠正一下,大概是要滤掉前0.04Hz的信号

在王济和胡晓编 “MATLAB在振动信号处理中的应用”(中国水利水电出版社)一书中有介绍消去趋势项的方法,可参考一下。
 楼主| 发表于 2008-11-26 18:38 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-18 13:59 编辑

[quote]原帖由 songzy41 于 2008-11-26 18:08 发表


如果通带下限fmin为0Hz,nmin=1,则按
a((nfft-nmax+2):(nfft-nmin+2))=fftx((nfft-nmax+2):(nfft-nmin+2));  
计算时:nfft-nmin+2=nfft+1,这在数组a和fftx中都会下标溢出,而楼主怎么会能计算出的?


之前没仔细看,我后面是设的1,不是设的2
按您说的把两个都改成2以后,IFFT结果就基本是实数了,再次感谢!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-16 23:39 , Processed in 0.061496 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表