【问题标题】:MATLAB: filter in the frequency domain using FFT/IFFT with an IIR filterMATLAB:使用 FFT/IFFT 和 IIR 滤波器在频域中进行滤波
【发布时间】:2013-12-05 04:26:04
【问题描述】:

我正在尝试使用 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 现在是真实的......但与我直接使用“过滤器”功能得到的信号明显不同(幅度和相位)。而这个“对称”选项显然会丢弃虚部或类似的部分,所以我想使用它可能不是一个好主意......

提前非常感谢! (对不起我的英语)

【问题讨论】:

    标签: matlab filter fft


    【解决方案1】:

    只使用结果的实部是不正确的,

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

    只有这样才能将 'symmetric' 选项与 ifft 一起使用,因为它的目的是防止您创建的对称性之间可能存在小的数值误差。

    【讨论】:

    • 非常感谢!我按照您的解释“手动”尝试了它并且它有效:)它产生的结果与使用 lennon310 建议的“整体”完全相同。
    【解决方案2】:

    您的FilterFreqResponseNFFT 点进行评估,这些点仅围绕单位圆的上半部分等距分布。你试过FilterFreqResponse = freqz(b,a,NFFT,'whole') 吗?

    【讨论】:

    • 谢谢!我首先尝试了詹姆斯的解决方案,然后我看到了你的评论,两者都给出了相同的结果(幸运的是!)。现在我明白了:)
    【解决方案3】:

    使用逆 FFT 的实部:

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

    【讨论】:

    • 我已经尝试过了,但不幸的是它不起作用。如果我这样做,产生的信号会丢失或多或少一半的幅度,并且相对于我使用“过滤器”功能获得的过滤信号是异相的。
    【解决方案4】:

    频域的乘法是时域的循环卷积。为了消除循环卷积伪影,您需要在 FFT 之前将您的信号按滤波器响应的长度进行零填充,镜像您的频率响应滤波器,以便在相乘之前它是复共轭对称的(可能使两个向量长度为​​ 2N case),然后在IFFT之后,丢弃添加的填充,或者保留它以进行额外的重叠添加/保存处理。

    【讨论】:

    • 谢谢!我不知道它是否或多或少是同一件事,但我这样做了:我用自己填充了我的信号(但相反):signal=[flipud(signal);信号;翻转(信号)];然后保留输出的中间部分。也对吗?
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2014-12-31
    • 2014-04-26
    • 2016-07-30
    • 1970-01-01
    • 2015-05-03
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多