IIR 传递函数的零频响应

信息处理 matlab 过滤器 频率 无限脉冲响应
2022-02-02 11:31:34

我对 IIR 滤波器的零频率 (DC) 响应有疑问。三阶 IIR 滤波器的系数如下:

% polynomial coefficients for the numerator of the IIR transfer function
b = [0.0066324, -0.0130292, 0.0063988]; 

% polynomial coefficients for the denominator of the IIR transfer function
a = [1, -1.4158855, 0.4158913];  

请注意,所有的根a都小于一,但一个非常接近一。我试图理解为什么 MATLAB 的filter()函数会产生以下结果:

rng default;
x = rand(15,1);
y = filter(b,a,x);
mean(y)/mean(x)   

>> 0.0012

在最后一条语句中,我计算了输入和输出均值的比率,MATLAB 返回 0.0012。

(即)的零频率来看,我预计. 检查这个,H(z)=0.3448sum(b)/sum(a)=0.3448mean(y)/mean(x)=0.3448

[H,W] = freqz(b,a);
H(1)

>> 0.3448

我是否在这里误解了关于 MATLABfilter()函数的某些内容,或者对传递函数的零频响应的其他误解?感谢任何能够提供对此问题的见解的人。

3个回答

由于单位圆附近的极点,脉冲响应直到数万个样本后才真正稳定下来。相比之下,您输入的 15 个样本非常短。尝试让它更长:

x = rand(15E6,1);
y = filter(b,a,x);
mean(y)/mean(x)

>> 0.34252

此外,过滤器以对应于全零输入历史的状态开始。如果您使用实际输入对其进行预处理,则结果将收敛得更快:

x = rand(15E6,1);
y = filter(b,a,x);
mean(y(5E6:length(y)))/mean(x(5E6:length(x)))

>> 0.34483

您的基本假设是正确的:如果您对两个序列进行卷积

(1)y[n]=(xh)[n]

那么他们的变换与Z

(2)Y(z)=X(z)H(z)

从中

(3)Y(1)=X(1)H(1)

跟随。在递归滤波器的情况下,并且H(z)=B(z)/A(z)

H(1)=B(1)A(1)=nbnnan

其中分别是分母和分子系数。anbn

您的实现的问题是该函数filter()不计算输入信号与滤波器脉冲响应的完整卷积,但它只计算与输入样本一样多的输出样本。请注意,实际卷积结果的长度总是比输入序列长。在你的情况下,它长,实际上是无限长的(因为你有一个 IIR 滤波器)。

Olli Niemitalo 的解决方案是可以的,但它并没有解决问题的所有细节,因为使输入信号更长并不能完全解决问题。由于滤波器的记忆,它只会降低瞬态的相对贡献。仍然没有考虑输入信号关闭后滤波器的瞬态响应。

等式 (3) 当然必须适用于任何输入信号,也适用于非常短的信号。所以你需要做的是在输入信号上附加零,这样你在输入信号关闭后也能得到瞬态响应。从理论上讲,您需要附加无限多个零,因为您的过滤器的内存(理论上)是无限长的。而且由于滤波器的一个极点非常接近单位圆,因此即使出于实际目的,滤波器的内存也特别大。

在 Matlab/Octave 中,您可以执行以下操作:

b = [0.0066324,-0.0130292,0.0063988];
a = [1, -1.4158855, 0.4158913];
x = 兰德(15,1);
x0 = [x;zeros(1e6,1)];
y0 = 过滤器(b,a,x0);
[sum(y0)/sum(x0),sum(b)/sum(a)] % 应该(几乎)相同

A部分:双线性变换法

  1. 设计具有以下规格的低通 IIR 滤波器:

过滤阶数 = 2,巴特沃斯类型

截止频率=800 Hz

采样率 =8000 Hz

使用双线性 z 变换设计方法进行设计

使用 MATLAB 打印低通 IIR 滤波器系数并绘制频率响应。

MATLAB>>freqz(bLP,aLP,512,8000); 轴([0 4000 –40 1]);% 采样率=8000 Hz

标记并打印您的图表。

根据幅频响应图,截止频率和 2000 Hz 处的阻带和 50 Hz 处的通带的滤波器增益是多少?