如何在 MATLAB 中绘制数字滤波器的频率响应?

How do I plot the frequency response of a digital filter in MATLAB?

我正在尝试绘制频率响应图。我被要求在 MATLAB 中使用 filter,但自从我阅读了手册后,我仍然不明白它是如何执行 Z 转换的。

我有下面写的数字滤波器的脉冲响应:

for i=1:22;
   y(i)= 0;
end
x(22) = 1;
for k=23:2523
    x(k) = 0;
end
for n = 22:2522;
    y(n) = ((1/21)*x(n))+((20/21)*y(n-21));
end
plot(y);

只是y[n] = 1/21*x[n] + 20/21*y[n-21]

的反馈系统

以下是我计算上述系统的 Z 变换的计算结果,它最终决定了脉冲响应:

Z(y) = Z((1/21)*x(n)+(20/21)*y(n-21))

Y(Z) = (1/21)X(Z)+(20/21)*Z.^-21Y(Z)

Z(Z)-(20/21)*Z.^-21Y(Z) = (1/21)X(Z)

Y(Z)(1-(20/21)*Z.^-21) = (1/21)X(Z)  // divide by X(Z)*(1-(20/21)*Z.^-21)

Y(Z)/X(Z) = (1/21)/(1-(20/21)*Z.^-21)

H(Z) = (1/21)/(1-(20/21)*Z.^-21) // B = 1/21, A = 20/21

H(Z) = (B*Z.^21)/(Z.^21-A)

如何绘制 H(Z) 的频率响应?我应该使用 filter 吗?

如果您只需要绘制脉冲响应,那很容易。脉冲响应是数字滤波器对狄拉克脉冲的响应。你已经有了差分方程,所以你已经在'z',你不关心's',你不必执行's'到'z' 变换(这本身就是一个话题!)。

因此,只需生成一个信号 x(n),除了第一个样本 x(1) 为 1 之外,所有地方都由零组成。将其通过滤波器(是的,您的差分方程)。你得到的 y(n) 是你的脉冲响应 h(n)。这基本上就是你所做的。

当然,如果你对这个 h(n) 进行 FFT,你就会得到相位和幅度响应。

使用信号处理工具箱中的 freqz(希望你有)。您首先需要找到您已经在此处完成的 Z 变换:

Y(Z)/X(Z) = (1/21)/(1-(20/21)*Z.^-21)

freqz 接受一个系数向量,该向量对应于传递函数的分子和分母。它的名字是这样的:

freqz(b, a);

ba 是传递函数的分子和分母系数。这将生成一个显示上述系统的幅度和相位响应(以及频率响应)的图形。

因此,您只需要这样做:

b = 1/21;
a = [1 zeros(1,20) -(20/21)];
freqz(b, a)

请特别注意 a 向量。它有 1,后面跟着 20 个零,然后是 -(20/21)。因为你有一个 -21 的幂系数,除了它前面的 1 之外没有别的,这意味着 -1 到 -20 之间的那些系数是 0,并且有 20 个这些系数总共为零,这就是为什么我们需要在 1 和 -(20/21) 项之间用零填充向量。

我们得到:


如果要绘制滤波器的极点和零点,请组合使用 tf and pzmap:

sys = tf(b, a, -1);
pzmap(sys);

tf 通过指定滤波器的分子和分母系数创建传递函数,-1 暗示它是一个离散时间滤波器,但我们不知道采样时间是多少. pzmap 在覆盖单位圆的 z 域中绘制极点和零点。

我们得到这个:

这是有道理的,因为您的系统中没有零点和 21 个极点,因为在您的示例中检查离散时间序列时有 21 个延迟元素。

来自 Matlab 的 filter 文档:

filters the input data, x, using a rational transfer function defined by the numerator and denominator coefficients b and a, respectively.

您可能知道,过滤脉冲输入会给您脉冲响应。然后剩下的就是获得那些 ba 系数。 您可以直接从差分方程

y[n] = 1/21*x[n] + 20/21*y[n-21];

(如 rational transfer function link above 中所示)或等效地从您导出的有理传递函数:

%H(Z) = (B*Z.^21)/(Z.^21-A)

无论哪种情况,您都应该得到以下 ab 系数:

a = [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -20/21];
% or equivalently: a=zeros(22,1); a(1)=1; a(22)=-20/21;
b = [1/21];

因此,

% setup the impulse input
x = zeros(2500,1);
x(1) = 1;

% compute the impulse response
y = filter(b, a, x);

这个脉冲响应可以像你所做的那样绘制:

plot(y);

至于这与变换 H(Z) 的关系,您获得的封闭形式表达式可以根据 Laurent series 展开进行计算,然后具有时域系数y(脉冲响应)系列。

但是,H(z) 是在复平面的 |z| > R(在您的情况下为 R=power(20/21,1/21))收敛区域中定义的解析函数。更典型的是绘制频率响应,它对应于在单位圆上评估的 H(z)(即对于满足 |z|=1 或等价于 z = exp(j * theta) 且在 [0- 2pi] 范围)。在该单位圆上规则间隔的点处计算 H(z) 值的一种有效方法是采用脉冲响应的 FFT:

FrequencyResponse = fft(y);
figure(1);
plot(abs(FrequencyResponse));
figure(2);
plot(phase(FrequencyResponse));

P.S.filterfft 的计算可以在单个调用 freqz 中完成,如果你有信号处理工具箱(虽然你被特别要求使用filter)。