使⽤matlab如何求卷积,利⽤MATLAB求解卷积的⽅法分类利⽤MATLAB 求解卷积的⽅法分类 求法⼀:
求有序列A (n )=1 n=3,4,5,6,7,8,9,,10,11,1,2.B(n)=1 n=2,3,4,5,6,7,8,9,. 代码:
n1=3;n2=12;
>> m1=2;m2=9;
>> a=ones(1,(n2-n1+1));
>> b=ones(1,(m2-m1+1));
>> c=conv(a,b);
>> nc1=n1+m1;nc2+m2+n2;
nc1=n1+m1;nc2=m2+n2;
>> kc=nc1:nc2;
>> kc,c
stem(kc,c),text(18,6,'⾮平凡法')
>> CC=[zeros(1,kc(1)),c];
kc=0:(n2+m2);
>> stem(kc,CC),text(18,6,'⾮平凡法')
求法⼆:
N1=3;N2=12;
a=ones(1,N2+1);a(1:N1)=0;
M1=2;M2=9;
b=ones(1,M2+1);b(1:M1)=0;
c=conv(a,b);
kc=0:(N2+M2);
kc,c
subplot(2,1,1),stem(kc,c),text(20,6,'0 起点法')
求法三:
求有限序列与⽆限序列的卷积
clear
>> M=4;
>> h=[0.1,0.35,-0.42,-0.05,0.15];
>> N=10000;
>>rng default %恢复matlab 启动时默认的全局随机流。
>> u=randsrc(1,N);
>>tic
>> y_filter=filter(h,1,u);
>> t_filter=toc;
>> tic
>> ct=[u(1),zeros(1,M)];
>> ut=toeplitz(ct,u);
>> y_toe=h*ut;
>> t_toe=toc;
>> %卷积指令法
>> tic
>> y_conv=conv(h,u);
>> t_conv=toc;
>> y_conv(N+1:end)=[];
filter 是⼀维数字滤波器
使⽤⽅法:
Y = filter(B,A,X) ,输⼊X 为滤波前序列,Y 为滤波结果序列,B/A 提供滤波器系数,B 为分⼦, A 为分母
整个滤波过程是通过下⾯差分⽅程实现的:
a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
[Y,Zf] = filter(B,A,X,Zi),输⼊X 为滤波前序列,Y 为滤波结果序列,B/A 提供滤波器系数,B 为分⼦, A 为分母,
在MATLAB 中,可以⽤函数y=filter(p,d,x)实现差分⽅程的仿真,也可以⽤函数 y=conv(x,h)计算卷积,⽤y=impz(p,d,N)求系统的冲激响应。
实现差分⽅程
先从简单的说起:
filter([1,2],1,[1,2,3,4,5])
实现 y[k]=x[k]+2*x[k-1]
y[1]=x[1]+2*0=1%(x[1]之前状态都⽤0)
y[2]=x[2]+2*x[1]=2+2*1=4
a. 下⾯程序是⽤来实现h 和x 的卷积得,分别⽤了filter 和conv 函数,两者函数得出的结果⼀样。
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);
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)];
y1 = filter(h,1,x1);
subplot(2,1,2);
stem(n,y1);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Generated by Filtering'); grid;
要实现下式的冲击响应和阶跃响应,可以分别采⽤三种⽅法。y[n]+0.75y[n-1]+0.125y[n-2]=x[n]-x[n-1]。
b. 单位冲激响应:
(1)⽤filter 函数
a1=[1,0.75,0.125];
b1=[1,-1];
n=0:20;
x1=[1 zeros(1,20)];
y1filter=filter(b1,a1,x1);
stem(n,y1filter);
title('y1filter');
xlabel('x');
ylabel('y');
(2)⽤conv 函数
a1=[1,0.75,0.125];
b1=[1,-1];
x1=[1 zeros(1,10)];
[h]=impz(b1,a1,10);
y1conv=conv(h,x1);
n=0:19;
stem(n,y1conv,'filled')
(3)⽤impz 函数
a1=[1,0.75,0.125];
b1=[1,-1];
impz(b1,a1,21);
c. 单位阶跃响应:
(1)⽤filter 函数
a1=[1,0.75,0.125];
b1=[1,-1];
n=0:20;
x2=ones(1,21);
y1filter=filter(b1,a1,x2);
stem(n,y1filter);
title('y1filter_step');
用subplot函数xlabel('x');
ylabel('y');
(2)⽤conv 函数
a1=[1,0.75,0.125];
b1=[1,-1];
x2=ones(1,21);
[h]=impz(b1,a1,20);
y1=conv(h,x2);
y1conv=y1(1:21); %为何y1conv 要取y1中1:21的值,解释见
n1=0:20; %y2à单位阶跃响应à⽤conv 函数中注释
stem(n1,y1conv,'filled');
title('y1conv');
xlabel('n');
ylabel('y1[n]');
(3)⽤impz 函数
a=[1,0.75,0.125];
b=1;
impz(b,a)
即y=filter(p,d,x)⽤来实现差分⽅程,d 表⽰差分⽅程输出y 的系数,p 表⽰输⼊x 的系数,⽽x 表⽰输⼊序列。输出结果长度数等于x 的长度。
⽽y=conv(x,h)是⽤来实现卷级的,对x 序列和h 序列进⾏卷积,输出的结果个数等于x 的长度与h 的长度之和减去1。
y=impz(p,d,N)是⽤来实现冲击响应的,d 和p 的定义见filter ,N 表⽰冲击响应输出的序列个数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论