我试图通过使用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
答案 0 :(得分:2)
第一行代码是正确的。但是,在调用b
时,您需要反向 a
和filter
的顺序。 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)
; 在向量B
和A
中给出分子和分母系数。
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