如何生成频率响应给定b,系统的系数?

时间:2016-02-11 20:08:04

标签: matlab signal-processing digital-filter

我有以下系统,由系数集指定:

b = [1 2 3];
a = [1 .5 .25];

在Z-Domain中,此类函数将具有以下传递函数:

 H(Z) = Y(Z)/X(Z)

所以频率响应只是单位圆,其中:

 H(e^jw) = Y(e^jw)/X(e^jw)

我只是在我的传递函数中用e^jw代替“Z”来在纸上以数学方式获得系统的频率响应吗?从我(学生)的观点来看,似乎有点荒谬。

3 个答案:

答案 0 :(得分:1)

你试过freqz()吗?它返回数字滤波器的频率响应矢量h和相应的角频率矢量w,其中分子和分母多项式系数存储在ba中,分别

在您的情况下,只需按照帮助:

[h,w]=freqz(b,a);

答案 1 :(得分:0)

你为Z做了e ^ jw。这并不荒谬。然后你只需从-pi扫描到pi。您的频率响应将是结果的绝对值。

正如Alessiox所说,freqz是你想在matlab中使用的命令。

答案 2 :(得分:0)

我确实会像在你的传递函数中替换exp(j*w)一样简单。当然,使用Matlab实现这一点的方法有很多种。出于说明的目的,我将假设b s是x序列的系数,a s是y序列的系数,因此{ {1}}在分子中,b在分母中:

enter image description here

使用Matlab进行直接评估可以通过以下方式完成:

a

这相当于以下使用内置polyval

的内容
b = [1 2 3];
a = [1 .5 .25];

N = 513; % number of points at which to evaluate the transfer function
w = linspace(0,2*pi,N);
num = 0;
for i=1:length(b)
  num = num + b(i) * exp(-j*i*w);
end
den = 0;
for i=1:length(a)
  den = den + a(i) * exp(-j*i*w);
end
H = num ./ den;

此外,这实际上是在离散等距角频率N = 513; % number of points at which to evaluate the transfer function w = linspace(0,2*pi,N); H = polyval(fliplr(b),exp(-j*w))./polyval(fliplr(a),exp(-j*w)); 评估传递函数,其对应于离散傅立叶变换(DFT)。因此,也可以通过以下方式完成:

w = 2*pi*k/N

顺便说一下,这就是freqz的作用,所以你也可以得到相同的结果:

N = 512;
H = fft(b,N) ./ fft(a,N);