1、以下程序中分别使用conv和filter函数计算h和x的卷积y和y1,运行程序,并分析y和y1是否有差别,为什么要使用x[n]补零后的x1来产生y1;具体分析当h[n]有i个值,x[n]有j个值,使用filter完成卷积功能,需要如何补零?
h = [3 2 1 -2 1 0 -4 0 3]; %impulse response
x = [1 -2 3 -4 3 2 1]; %input sequence
y = conv(h,x);%conv函数执行两个向量的卷积
n = 0:14;
subplot(2,1,1);%分屏
stem(n,y);%绘制散点图
xlabel('Time index n');
ylabel('Amplitude');
title('Output Obtained by Convolution');
grid;%显示坐标的网格线
x1 = [x zeros(1,8)];%补8个零
y1 = filter(h,1,x1);%使用filter函数通过解差分方程的方式实现卷积结果
subplot(2,1,2);
stem(n,y1);
xlabel('Time index n');
ylabel('Amplitude');
title('Output Generated by Filtering');%图表标题
grid;

2、编制程序求解下列两个系统的单位冲激响应和阶跃响应,并绘出其图形。要求分别用 filter、conv、impz三种函数完成。
![]()
冲激响应:
a=[1,0.75,0.125];
b=[1,-1];
n=0:20;
x1=[1,zeros(1,20)];
y1=filter(b,a,x1);% 用filter 函数
subplot(3,1,1);
stem(n,y1,'r');
title('用filter 函数');
xlabel('n');
ylabel('y');
y = filter(b,a,x) 使用由分子和分母系数 b 和 a 定义的有理传递函数 对输入数据 x 进行滤波。

x2=[1,zeros(1,10)];
[h]=impz(b,a,10);
y2=conv(h,x2);%用conv函数
n=0:19;
subplot(3,1,2);
stem(n,y2);
title('用conv函数');
xlabel('n');
ylabel('y');

a=[1,0.75,0.125];
b=[1,-1];
subplot(3,1,3);
impz(b,a,21);
title('用impz函数');

用y=impz(p,d,N)求系统的冲激响应
阶跃响应:
a=[1,0.75,0.125];
b=[1,-1];
n=0:20;
x1=ones(1,21); %本来x应该为无限长的,但此处先取一定的长度,
%单位阶跃响应也取一定的长度
y1=filter(b,a,x1);% 用filter 函数
subplot(3,1,1);stem(n,y1,'r');
title('用filter 函数');
xlabel('n');ylabel('y');
x2=ones(1,21);
[h]=impz(b,a,20);
y2=conv(h,x2);%用conv函数
y2=y2(1:21);%去掉y2后面重复的部分
n=0:20;
subplot(3,1,2);stem(n,y2);
title('用conv函数');
xlabel('n');ylabel('y');
b=1;%矩阵 b已经经过累加器
subplot(3,1,3);impz(b,a,21);
title('用impz函数');

![]()
a=1;
b=[0.25 0.25 0.25 0.25];
n=0:20;
x1=[1,zeros(1,20)];
y1=filter(b,a,x1);% 用filter 函数
subplot(3,1,1);
stem(n,y1,'r');
title('用filter 函数');
xlabel('n');
ylabel('y');x2=[1,zeros(1,10)];
[h]=impz(b,a,10);
y2=conv(h,x2);%用conv函数
n=0:19;
subplot(3,1,2);
stem(n,y2);
title('用conv函数');
xlabel('n');
ylabel('y');subplot(3,1,3);
impz(b,a,21);
title('用impz函数');

a=1;
b=[0.25 0.25 0.25 0.25];
n=0:20;
x1=ones(1,21);
y1=filter(b,a,x1);% 用filter 函数
subplot(3,1,1);
stem(n,y1,'r');
title('用filter 函数');
xlabel('n');
ylabel('y');
x2=ones(1,21);
[h]=impz(b,a,20);
y2=conv(h,x2);%用conv函数
y2=y2(1:21);
n=0:20;
subplot(3,1,2);
stem(n,y2);
title('用conv函数');
xlabel('n');
ylabel('y');
b=[b(1) b(1)+b(2) b(1)+b(2)+b(3) b(1)+b(2)+b(3)+b(4) ones(1,17)];
%将矩阵b经过累加器(暂时用加法代替)
subplot(3,1,3);
impz(b,a,21);
title('用impz函数');

总结:
filter函数求系统响应的过程:
- y = filter(b,a,x) 使用由分子和分母系数 b 和 a 定义的有理传递函数对输入数据 x 进行滤波
-
如果 x 为向量,则 filter 将滤波后数据以大小与 x 相同的向量形式返回。如果 x 为矩阵,则 filter 沿着第一维度操作并返回每列的滤波后的数据。
-
使用fifter函数求系统的响应(1)由差分方程组可得需要的系数a,b(2)由响应类型确定x,传入系数即可得结果
conv函数求系统响应的过程:
- conv 计算 卷积和多项式乘法,w = conv(u,v) 返回向量 u 和 v 的卷积。如果 u 和 v 是多项式系数的向量,对其卷积与将这两个多项式相乘等效。
- 使用conv求系统响应:(1)用filter求得系统的冲激响应(2)用冲激响应的结果与目标响应卷积,实际的结果就是使用filter函数间接实现了原信号与目标信号的卷积,得到结果
impz函数求系统响应的过程:
- 求系统的冲激响应响应
-
[h,t] = impz(b,a)
这里的b和a向量就是分子和分母系数的向量。
得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
-
使用impz求系统响应时首先将系数b通过累加器,再进行运算
1280

被折叠的 条评论
为什么被折叠?



