gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:42:36 27 4
gpt4 key购买 nike

我正在尝试使用 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')

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

关于MATLAB:使用 FFT/IFFT 和 IIR 滤波器在频域中进行滤波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com