关于IFFT
我想问一下,一个实信号经过FFT变换,然后对其频率作了处理后,再做IFFT变换,这时候信号变为了复数,那么应该是取其实部还是取其绝对值? 如果在做IFFT变换后楼主想得到实数序列,则在IFFT之前应满足实部偶对称、虚部奇对称,在IFFT之后取实部(虚部虽有数值,但一般较小,是由有限字长运算所造成的误差)。 请帮我看一下,我用下面的程序实现一个理想滤波器,但是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)))'; % 取逆变换的实部作为滤波后的信号 这语句
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));
试试看. 谢谢,问题解决了~~~
我看了别的帖子,也知道了原因:@)
太感谢了!!
回复 5楼 yjesefcu 的帖子
能否把原因和大家分享一下? 不好意思,昨天没有好好验证,如果nmin为0的就没有问题,但是如果nmin不为0,问题还是存在的所以还是想请教一下songzy41,到底问题在哪里? 或者说用这种理想滤波器做是不是不太好? 因为我需要在10000Hz的采样频率信号中滤除掉前0.001Hz的超低频信号,如果用MATLAB已经有的滤波器不知道能不能达到很好的滤波效果,因为貌似基本上过渡带都无法达到那么窄
不知道有没有什么别的方法可以实现这个目标? 本帖最后由 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 编辑 ] 本帖最后由 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后虚部还是挺大的? 本帖最后由 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,用低通滤波的办法是较难滤除。 那我想问一下有没有什么比较好的去趋势项的方法? 这个方面我不懂
纠正一下,大概是要滤掉前0.04Hz的信号 本帖最后由 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)); 本帖最后由 wdhd 于 2016-9-18 13:59 编辑
原帖由 yjesefcu 于 2008-11-26 12:49 发表
那我想问一下有没有什么比较好的去趋势项的方法? 这个方面我不懂
纠正一下,大概是要滤掉前0.04Hz的信号
在王济和胡晓编 “MATLAB在振动信号处理中的应用”(中国水利水电出版社)一书中有介绍消去趋势项的方法,可参考一下。 本帖最后由 wdhd 于 2016-9-18 13:59 编辑
原帖由 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结果就基本是实数了,再次感谢!!
页:
[1]
2