如何使用Matlab的滤波器命令绘制系统的脉冲响应?

时间:2015-04-26 17:17:03

标签: matlab plot filter sequence

我试图通过使用Matlab的滤波器命令并且没有其他预先存在的Matlab函数来绘制IIR和FIR系统的脉冲响应。过滤器必须能够处理样本输入,例如绘图([1 2 2],[0 1.8])。问题看起来像这样:

function iplot(b, a)

% IPLOT Impulse response of system.
% IPLOT(B,A,N) is the N-point impulse response
% of the filter B/A:

%                          -1                -nb 
%     
%           B(z) b(1) + b(2)z + .... + b(nb+1)z
%
%    H(z) = ---- = --------------------------------- 
% 
%                          -1                -n         
%           A(z) a(1) + a(2)z + .... + a(na+1)z


% If h[n] FIR, then N = length(h);

% given numerator and denominator coefficients in vectors B and A.

% N is specified according to the following rule:

% If If h[n] is IIR and increasing (i.e. |h[n]|-->inf as n-->inf),

% then N=20;

% h[n] is IIR and decreasing (i.e. |h[n]|-->0 as n-->inf), 

% then the maximum N is determined such that

% rms value of h(1:N) = 0.999 * rms value of h(1:1000).

% However, in this case, N must also be chosen such that 10 <=

% N <= 100

这是我到目前为止所拥有的。我知道它不正确,现在它并没有绘制任何东西,只要它已经得到了它。任何帮助深表感谢!

h = filter(a,b,[1,zeros(1,999)]); 
N = length(h); 

plot(h, zeros(length(h),999), 'b'); 

poles = roots(a); 

if poles <= 1

    N = 20; 
    plot(h, N, 'b'); 

end


end

1 个答案:

答案 0 :(得分:2)

第一行代码是正确的。但是,在调用b时,您需要反向 afilter的顺序。 b代表分子系数,而a代表分母系数。那也在你的文档中。

但是,您正确地将输入指定为单个输入。但是,您的绘图代码不正确。 plot的工作原理是它包含一组x值和一组y值,我们将这些点绘制成对。由于您正在绘制离散输出信号,因此我建议您使用stem而不是plot。这样,每个点都会绘制一条从水平轴到感兴趣点的线。

在任何情况下,您都需要提供一组x值。在这种情况下,您需要一个从0到999的向量。y值是由filter引起的输出脉冲响应。目前,您的x值是输出脉冲响应,而您的y值是一堆零。这将被视为在y = 0聚集的一大堆点,这可能不是你想要的。

因此,您只需要这样做:

h = filter(b,a,[1,zeros(1,999)]); 
plot(0:999, h, 'b');  %// Change

关于我的建议,我会改为使用stem

stem(0:999, h, 'b');

此外,代码的最后一部分是绘制过滤器的极点。您还应该创建一个单独的数字,然后绘制这些结果。你不是这样做的,所以当你尝试绘制极点时,包含你的脉冲响应的数字将被覆盖。在当前窗口打开的情况下多次调用plot将覆盖最后一次调用plot的绘图。因此,在继续之前生成一个新的figure窗口:

figure; %// New window
h = filter(b,a,[1,zeros(1,999)]); 
stem(0:999, h, 'b');  %// Change

figure; %// New window
poles = roots(a); %// Find roots
%// Plot the roots as single dots
plot(real(poles), imag(poles), 'b.');

但是,这不能回答您的问题陈述。问题陈述说:

  

如果h[n]是FIR,那么N = length(h);   在向量BA中给出分子和分母系数。

     

N根据以下规则指定:   如果h[n]是IIR并且正在增加(即|h[n]|-->inf as n-->inf),   然后N=20;

     

h[n]是IIR并且正在减少(即|h[n]|-->0 as n-->inf),   然后确定最大N,使得   rms的{​​{1}}值。   但是,在这种情况下,还必须选择h(1:N) = 0.999 * rms value of h(1:1000) N

如果您将10 <= N <= 100指定为1或仅指定一个值,我们知道FIR滤波器实际上是FIR滤波器。因此,当您检测到A的长度为1时,则为A。但是,如果N = length(h); 只是一个值,我们必须检查两种情况。第一种情况是脉冲响应增加。您可以使用a进行检查,并确保您的脉冲响应的所有相邻差异均为正值。下一种情况是diff正在减少。您可以通过确保脉冲响应的所有相邻差异为负值来检查。

如果是增加的情况,请选择h。如果它是递减的情况,那么选择N = 20值就是你在上面看到的,你可以使用MATLAB中的rms函数来帮助你做到这一点。我们还需要确保此值介于10和100之间,并且我们还希望舍入值,因为我们尝试选择整数个点并且N将可能会给你一个浮点数。

因此,使用默认的1000分执行rms,然后您需要截断响应,具体取决于输入到函数中的内容。首先,我们需要检查FIR,然后检查IIR情况,以确定要显示的filter的值。

因此:

N