如何从滤波器频率响应还原时域[b,a]系数?
从频率响应还原FIR/IIR滤波器的[b,a]系数
FIR和IIR滤波器的时域行为由回归公式中的[b,a]系数定义:
y[n] = b_0 * x[n] + b_1 * x[n-1] + ... + b_N * x[n - N] - a_1 * y[n-1] - ... - a_M * y[n-M]
正向计算时,我们可以用傅里叶变换或scipy的signal.freqz函数从[b,a]提取频率响应h:
w, h = signal.freqz(b, a, worN=FFT_LENGTH, fs=FS)
反向还原的方法与限制
现在需要反向操作:已知由freqz或[b,a]的FFT生成的频率响应h(w),还原[b,a]以用signal.lfilter等工具做时域滤波。这个问题没有通用解,逆过程不一定存在,分两种情况讨论:
FIR滤波器:可以直接还原。因为FIR的频率响应h就是系数b的FFT结果,对h做逆FFT就能得到b,此时a系数固定为
[1](FIR无反馈项)。IIR滤波器:无法通过简单逆FFT还原。因为IIR的频率响应是
h = FFT(b)/FFT(a),是两个序列的频域比值,有限长的频域采样无法唯一确定b和a的组合。如果一定要尝试还原,通常需要用系统辨识类方法:- 先预设滤波器的阶数N和M,通过最小二乘法拟合时域输入输出关系,或者在频域上最小化估计响应与给定响应的误差来求解[b,a]
- 也可以使用有理函数逼近方法(如Prony方法、Levinson-Durbin算法),但这类方法对频域采样误差、噪声非常敏感,得到的系数可能不稳定,甚至无法实现因果稳定的滤波器。
另外需要注意:如果给定的h(w)不满足因果、稳定IIR滤波器的频域特性(比如对应单位圆外的极点),则根本无法还原出物理可实现的[b,a]系数。
内容的提问来源于stack exchange,提问作者Triceratops
相关产品推荐
相关产品推荐

