繁体   English   中英

MATLAB:使用带有IIR滤波器的FFT / IFFT在频域中进行滤波

[英]MATLAB: filter in the frequency domain using FFT/IFFT with an IIR filter

我正在尝试使用FFT和逆FFT(IFFT)在Matlab中过滤(真实)信号。 我有一个IIR滤波器(系数“ b”和“ a”)。 我期望(大约吗?)的结果与我刚才做的事情一样:

filteredSignal = filter(b,a,signal);

这就是我所做的:

NFFT = length(signal);
FFTsignal = fft(signal, NFFT);
FilterFreqResponse = freqz(b,a,NFFT);
FFTfilteredSignal = FFTsignal .* FilterFreqResponse;
filteredSignal = ifft(FFTfilteredSignal, NFFT);

这里的问题是结果信号( filteredSignal )很复杂。 我想要一个真实的信号(作为我的输入信号)。 filter功能还返回真实信号。 所以...我在做什么错? 是否可以将基于FFT的滤波与IIR滤波器一起使用? 我的意思是:我的滤波器的频率响应相对于原点不是对称的,所以我的滤波信号的频谱也不是对称的……所以时域中的滤波信号不能是真实的……?

PS:ifft函数中有一个“对称”选项:

filteredSignal = ifft(FFTfilteredSignal, NFFT, 'symmetric');

如果执行此操作,则filteredSignal现在是真实的...但是与我直接使用“ filter”功能获得的信号明显不同(在幅度和相位上)。 而且这个“对称”选项显然会丢弃虚部,或者类似的东西,所以我猜想使用它可能不是一个好主意。

在此先多谢! (对不起,我的英语)

仅使用结果的真实部分是不正确的,

您的答案很复杂的原因是没有对称地执行逐点乘法:即,要使答案有意义,矢量FilterResponse必须相对于其中心元素对称。 您应该只将滤波器响应建立到Fs / 2(即较小的矢量),然后编写一些逻辑以共轭对称地将其应用于镜像频率。 或者,Matlab可以通过以下FilterFreqResponse = freqz(b,a,NFFT,'whole')自动为您完成此操作: FilterFreqResponse = freqz(b,a,NFFT,'whole')

只有那时,“对称”选项才应与ifft一起使用,因为它的目的是防止在您创建的对称之间可能存在小的数值误差。

使用逆FFT的实部:

filteredSignal = real(ifft(FFTfilteredSignal, NFFT));

您的FilterFreqResponse在被评估NFFT仅围绕单位圆的上半部分等间隔点。 您是否尝试过FilterFreqResponse = freqz(b,a,NFFT,'whole')

频域中的乘法是时域中的循环卷积。 要消除圆形卷积伪像,您需要在FFT之前将信号以滤波器响应的长度为零进行填充,镜像频率响应滤波器,以使其在复数之前是复共轭对称的(也许使两个矢量的长度为2N情况),则在IFFT之后,丢弃添加的填充,或保留该填充以进行其他重叠添加/保存处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM