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

时间:2015-03-18 13:10:36

标签: matlab signal-processing

我正在尝试绘制频率响应图。我被要求在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吗?

3 个答案:

答案 0 :(得分:3)

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

所以只需生成一个由零组成的信号x(n),除了第一个样本x(1)为1.将其传递过滤器(是的,你的差分方程)。你得到的y(n)是你的脉冲响应h(n)。这基本上就是你做的。

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

答案 1 :(得分:3)

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

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之间的那些系数是,并且这些系数中有20个是总计为零,这就是为什么我们需要在1和-(20/21)项之间用零填充向量。

我们得到:

enter image description here


如果您想绘制滤镜的极点和零点,请使用tfpzmap的组合:

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

tf通过指定滤镜的分子和分母系数来创建传递函数,-1暗示它是离散时间滤镜,但我们不知道是什么采样时间是。 pzmap绘制z域中的极点和零点,并重叠单位圆。

我们得到了这个:

enter image description here

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

答案 2 :(得分:1)

来自Matlab的filter文档:

  

使用由分子和分母系数b和a分别定义的rational transfer function来过滤输入数据x。

您可能知道,过滤脉冲输入会给您脉冲响应。然后,仍然需要获得那些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扩展进行评估,然后具有时域{{ 1}}(脉冲响应)系列。

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

H(z)

PS FrequencyResponse = fft(y); figure(1); plot(abs(FrequencyResponse)); figure(2); plot(phase(FrequencyResponse)); filter的计算可以在单个调用fft中完成,如果您有信号处理工具箱(尽管您具体要求使用freqz)。