【问题标题】:How to generate frequency response given b,a coefficients of the system?给定系统的 b,a 系数如何生成频率响应?
【发布时间】:2016-05-22 19:17:19
【问题描述】:

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

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”,以便在纸上以数学方式获得系统的频率响应?从我(学生)的角度来看,这似乎有点荒谬。

【问题讨论】:

    标签: matlab signal-processing digital-filter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您在 e^jw 中为 Z 执行子操作。这并不荒谬。然后你只需将 w 从 -pi 扫到 pi。您的频率响应将是结果的绝对值。

      正如 Alessiox 提到的,freqz 是您要在 matlab 中使用的命令。

      【讨论】:

        【解决方案3】:

        我确实会像在您的传递函数中替换 exp(j*w) 一样简单。当然,使用 Matlab 有不同的方法来实现这一点。为了便于说明,我将假设bs 是x 序列的系数,as 是y 序列的系数,因此b 在分子中,而在as 在分母中:

        可以使用 Matlab 进行直接评估:

        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;
        

        这相当于使用内置polyval的以下内容:

        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));
        

        此外,这实际上是在评估离散等距角频率w = 2*pi*k/N 的传递函数,它对应于离散傅里叶变换 (DFT)。因此,它也可以通过以下方式完成:

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

        顺便说一句,这就是 freqz 所做的,因此您也可以通过以下方式获得相同的结果:

        N = 512;
        H = freqz(b,a,N,'whole');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-09
          • 2011-12-02
          • 1970-01-01
          • 2011-03-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-09
          • 1970-01-01
          相关资源
          最近更新 更多