实验五 使用matlab实现卷积的运算
卷积和相关的matlab实现

两个序列的卷积:c(n)=a(n)*b(n)即k c(n)=a(k)b(n-k)∑如果a 和b 的脚标范围为:12[,]a a 与12[,]b b ,则c 的脚标范围为1122[,]a b a b ++,但是由于matlab 的索引是从1开始的,这里假设a 和b 都是从n=1开始。
知道最后的范围即可:function c = convolution(a,b)M= length(a); %a 序列的长度N=length(b); %b 序列的长度c=zeros(1,N+M-1); %用来存放卷积的结果for n = 2:(M+N) %卷积之后的索引本应该的范围tmp_max=min(n-1,M); %根据求和表达式,由1=<k<=M 且 1=<n-k<=N tmp_min=max(n-N,1); %确定最终求和变量k 的取值for k =tmp_min:1:tmp_max;c(n-1) = c(n-1) +a(k)*b(n-k);%求和,同时由于c 从1开始索引,%将n 的范围2:M+N%对应到c 的1:M+N-1中去endend调用matlab 自带卷积函数conv 验证:>> x = 1:9;>> y=2:8;>> conv(x,y)ans =2 7 16 30 50 77 112 147 182 197 200 190 166 127 72>> convolution(x,y)ans =2 7 16 30 50 77 112 147 182 197 200 190 166 127 72两个序列的相关:()((),())c n cor a n b n =即()()*()k c n a n k b k =+∑同样,如果a 和b 的脚标范围为:12[,]a a 与12[,]b b ,则c 的脚标范围为1221[,]a b a b -+,但是由于matlab 的索引是从1开始的,这里假设a 和b 都是从n=1开始。
MATLAB实验报告卷积

实验报告学院:机电班级:姓名:学号:实验名称:连续时间信号卷积运算的MATLAB实现1.实验目的:掌握卷积的概念及计算方法2.熟悉通过调用conv()函数求解连续时间信号卷积的数值分析法实验环境:MATLAB 6.5.1软件实验要求:1、已知信号f1(t)=t/2*[ε(t)- ε(t-2)], f2(t)= [ε(t)- ε(t-1)],通过调用conv()函数编程实现卷积计算y(t)= f1(t)* f2(t),画出波形。
2、已知信号f(t)=e-t *ε(t), h(t)= t2 *e-2t *ε(t),y(t)=f(t)* h(t)(1)用符号分析法编程实现计算y(t)的理论解;(2)过调用conv()函数编程实现卷积计算y(t)的数值解并画图实验程序及结果:第一题:M文件(1) function f=uCT(t)f=(t>=0);主程序:k1=0:p:2;k2=0:p:1;f1=k1/2.*[uCT(k1)-uCT(k1-2)]; f2=uCT(k2)-uCT(k2-1);y=conv(f1,f2)*p;k0=k1(1)+k2(1);k3=length(f1)+length(f2)-2; k=k0:p:k3*p+k0;subplot(311)plot(k1,f1);xlabel('t')ylabel('f1(t)')axis([-0.5 2.5 -0.5 1.5])grid onsubplot(312);plot(k2,f2)grid onaxis([-0.5 2.5 -0.5 1.5]) xlabel('t')ylabel('f2(t)')subplot(313)axis([-0.5 4 -0.5 1.5])grid onxlabel('t')ylabel('f1(t)*f2(t)')实验结果:第二题:M文件function f=uCT(t)f=(t>=0);主程序:syms tao>> t=sym('t','positive');>> f=exp(-t);>> h=t^2*exp(-2*t);>> fh_tao=subs(f,t,tao)*subs(h,t,t-tao); >> yt=int(fh_tao,0,t)yt =-(-2*exp(t)+t^2+2*t+2)/exp(t)^2p=0.01;k1=0:p:3;k2=0:p:12;f=exp(-k1).*uCT(k1);h=(k2).^2.*exp(-2.*k2).*uCT(k2);y=conv(f,h)*p;k0=k1(1)+k2(1);k3=length(f)+length(h)-2;k=k0:p:k3*p+k0;subplot(221)plot(k1,f);xlabel('t')ylabel('f(t)')grid onaxis([-0.5 3.5 -0.5 1.5])subplot(222)plot(k2,h);xlabel('t')ylabel('h(t)')grid onaxis([-0.5 11 -0.05 0.2])subplot(223)plot(k,y);grid onxlabel('t')ylabel('f(t)*h(t)数值')axis([-0.5 15 -0.01 0.1])subplot(224)yt =-(-2.*exp(k)+k.^2+2.*k+2)./exp(k).^2; plot(k,yt);grid onxlabel('t')ylabel('f(t)*h(t)理论') axis([-0.5 15 -0.01 0.1]) 实验结果:。
离散序列卷积和(用matlab实现)

离散序列卷积和(用matlab实现)MATLAB(一)实验目的:学会用MATLAB对信号与系统分析的方法,理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。
(二)实验原理:1、离散时间序列f1(k)和f2(k)的卷积和定义:,f1(i),f2(k,i) f(k)=f1(k)*f2(k)= ,i,,,2、在离散信号与系统分析中有两个与卷积和相关的重要结论:,f(i),,(k,i) a、f(k)= =f(k)* δ(k)即离散序列可分解为一系列,i,,,幅度由f(k)决定的单位序列δ(k)及其平移序列之积。
b、对线性时不变系统,设其输入序列为f(k),单位响应为h(k),其零状,f(i),h(k,i)态响应为y(k),则有:y(k)= ,i,,,3、上机:conv.m用来实现两个离散序列的线性卷积。
其调用格式是:y=conv(x,h)若x的长度为N,h的长度为M,则y的长度L=N+M-1。
(三)实验内容,,,,1,2,3,4,56,2,3,6,4,21、题一:令x(n)= ,h(n)=,y(n)=x(n)*h(n),求y(n)。
要求用subplot和stem画出x(n),h(n),y(n)与n的离散序列图形。
源程序:N=5;M=6;L=N+M-1;x=[1,2,3,4,5];h=[6,2,3,6,4,2];y=conv(x,h);nx=0:N-1;nh=0:M-1;ny=0:L-1;subplot(131); stem(nx,x,'*k'); xlabel('n'); ylabel('x(n)'); grid on ;subplot(132); stem(nh,h,'*k'); xlabel('n'); ylabel('h(n)'); grid on ;subplot(133); stem(ny,y,'*k'); xlabel('n'); ylabel('y(n)'); grid on ;实验结果:56704.56054503.543402.53x(n)h(n)y(n)30221.52011100.5000024050510nnn分析实验结果:根据实验结果分析可知,实验所得的数值跟x(n)与y(n)所卷积的结果相同。
信号的时域表示以及卷积运算(MATLAB)

信号的时域表示【实验目的】利用MATLAB 实现信号的时域表示利用MATLAB 实现图形表示【实验内容(步骤)】软件仿真实验在此部分只需写出代码及相应的注释。
例题实验:clear;%清除工作空间的变量clf;%清除图形clc;%清除命令窗口中的命令t0=-1;%给t0赋值1,作为横轴的最小值tf=5;%给tf赋值5,作为横轴的最大值dt=0.05;%作为冒号表达式的步长t1=0;t=t0:dt:tf; %建立向量Len_t = length(t);%把向量t的长度赋值给Len_tn1 = floor((t1-t0)/dt);%选出t=0在向量t中对应的元素序号x1 = zeros(1,Len_t);%建立一个与t等长的一维零矩阵x1(n1) = 1/dt;%选出t=0在向量t中对应的元素subplot(2,2,1),stairs(t,x1),grid on%把图形窗口分割成2*2的四个部分,第一个部分用stairs函数画出单位冲击函数axis([-1,5,0,22])%控制坐标轴,横轴在-1到5之间,纵轴在0到22之间title('1.冲击信号');%给第一个图形命名% x2 = [zeros(1,n1-1),ones(1,Len_t-n1+1)];% x2 = (t>0);% x2 = 1/2*(sign(t-0)+1);%利用符号函数实现单位阶跃函数x2 = stepfun(t,t1);%建立一个向量x2,当t<t1时,元素都为0,当t>=t1时,元素都为1subplot(2,2,3),stairs(t,x2),grid on%在图形窗口的第三个部分画出单位阶跃函数axis([-1,5,0,1.1]) %设置显示的坐标轴的最大最小值title('2.单位阶跃信号'); %给第二个图形命名alpha = -0.5;%为x3中的alpha赋值omega = 10;%为x3中的omega赋值x3 = exp((alpha+j*omega)*t);%产生了一个复指数信号subplot(2,2,2),plot(t,real(x3)),grid on%在图形窗口的第二部分画出复指数信号的实部title('3.复指数跃信号(实部)'); %命名subplot(2,2,4),plot(t,imag(x3)),grid on%在图形窗口中的第四部分画出复指数信号的虚部title('4.复指数跃信号(虚部)'); %命名【实验结果及分析】图像截图:10HZ和16HZ的周期方波实验:实验步骤:t = linspace(-10,10,100); 产生一百个元素y = (square(t) + 1)./2; y的函数subplot(211); 分割成两块,进入第一块界面plot(t./(2*pi*10),y,'r-');grid on 产生10HZ 的方波axis([0,0.3,-1.2,1.2]);xlabel('t'),ylabel('y1'),title('10Hz');subplot(212); 进入第二块界面plot(t./(2*pi*16),y,'c-');grid on 产生16HZ 的方波axis([0,0.3,-1.2,1.2]);xlabel('t'),ylabel('y2'),title('16Hz');图像截图:连续信号的卷积实验实验步骤:clear %清除Workspace中的变量clc %清除Command Window中的命令uls=ones(1,10); %建立一个1*10的矩阵Length_u = length(uls); %把向量uls的长度赋给Length_uhls = exp(-0.1*(1:15)); %建立一个长度为15的向量hlsLength_h = length(hls); %把向量hls的长度赋给Length_hlmax = max(Length_u,Length_h); %把向量u的长度与向量h的长度中的最大值赋给lmax%if end 语句确定了nh与nu的值,用于下面的向量u与向量h中,保证两者长度相等if Length_u>Length_hnu=0; nh = Length_u - Length_h;elseif Length_u<Length_hnh=0; nu = Length_h - Length_u;elsenu=0; nh=0;end%nh=0 nu=5dt = 0.5;lt = lmax;%把向量u的长度与向量h的长度中的最大值赋给ltu = [zeros(1,lt),uls,zeros(1,nu),zeros(1,lt)];% 建立一个长度为45的向量,uls的值在中间,易于卷积t1 = (-lt+1:2*lt)*dt;%建立了一个长度为45,步长为0.5的向量,从-7到15h = [zeros(1,2*lt),hls,zeros(1,nh)];% 建立一个长度为45的向量,hls的值在末尾一段hf = fliplr(h);%将h进行反褶运算y = zeros(1,3*lt);%建立一个1*45的零矩阵for k = 0:2*lt%设置循环31次p = [zeros(1,k),hf(1:end-k)];%p是长度为45的向量,由向量hf平移k个单位而来y1 = u.*p*dt;%卷积中的相乘yk = sum(y1);%卷积中的积分(求和)y(k+lt+1) = yk;%给y中的元素赋值subplot(4,1,1);stairs(t1,u)%分割图形窗口为4*1,在第一部分画出要进行卷积的函数uaxis([-lt*dt,2*lt*dt,min(u),max(u)]),hold on%设置坐标轴的最值,并让图形等待ylabel('u(t)')%给y轴命名subplot(4,1,2);stairs(t1,p)%在图形窗口的第二部分画出要进行卷积的函数h(k-t)axis([-lt*dt,2*lt*dt,min(p),max(p)])%控制坐标轴的最值ylabel('h(k-t)')%给y轴命名subplot(4,1,3);stairs(t1,y1)%在图形窗口的第三部分画出u(t)*h(k-t)的阶梯状图形axis([-lt*dt,2*lt*dt,min(y1),max(y1)+eps])%控制坐标轴的最值ylabel('s=u*h(k-t)')%给y轴命名subplot(4,1,4);stem(k*dt,yk)%在图形窗口的第四部分画出卷积结果的点状图 axis([-lt*dt,2*lt*dt,floor(min(y)+eps),ceil(max(y+eps))])%控制坐标轴的最值hold on,ylabel('y(k)=sum(s)*dt')%给y轴命名pause(1),%每次循环暂停一秒,方便看清各个图形的变化End图像截图:矩形脉冲信号与锯齿波信号的卷积实验步骤:>> cleardt=0.001; 时间间隔t=0:dt;1; 变化范围f1=(t>0&t<1); 矩形脉冲subplot(311); 分割版面plot(t,f1);grid onxlabel('t'),ylabel('f1'),title('矩形脉冲');axis([-0.3,1.7,0,1.2]);f2=(t>0&t<1).*t; 锯齿波subplot(312);plot(t,f2);grid onxlabel('t'),ylabel('f2'),title('锯齿波');axis([-0.3,1.7,0,1.2]);f3=conv(f1,f2);f3=f3*dt; 实现卷积功能n=length(f1)+length(f2)-2;x=0:dt:n*dt;subplot(313);plot(x,f3);grid onxlabel('x'),ylabel('f3'),title('卷积');axis([-0.3,1.7,0,1.2]);图像截图:。
利用MATLAB实现循环卷积.doc

一、实验目的1.利用MATLAB实现循环卷积。
2.比较循环卷积与线性卷积的区别。
二、实验条件PC机,MATLAB7.0三、实验内容1)循环卷积的定义:两个序列的N点循环卷积定义为:利用MATLAB实现两个序列的循环卷积可以分三个步骤完成:(1)初始化:确定循环点数N,测量输入2个序列的长度。
(2)循环右移函数:将序列x(n)循环右移,一共移N次(N为循环卷积的循环次数),最后将每次循环成的新序列组成一个矩阵V。
(3)相乘:将x(n)移位后组成的矩阵V与第二个序列h(n)对应相乘,即得循环卷积结果。
程序如下:程序一:clear;close all;N=10;x1=[6 15 -6 3 5 7 0 1];x2=[7 1 2 9 4 3 20 6];xn1=length(x1);xxn1=0:xn1-1;xn2=length(x2);xxn2=0:xn2-1;subplot(3,1,1);stem(xxn1,x1);subplot(3,1,2);stem(xxn2,x2);x11=fft(x1,N);x12=fft(x2,N);y11=x11.*x12;y1=ifft(y11,N);subplot(3,1,3);n=0:length(y1)-1;stem(n,y1,'.');title('循环卷积的结果');xlabel('n');ylabel('y1(n)');运行后所得图形如下:观察所得的循环卷积结果发现并没有呈现周期性的序列,因此将程序做下列改变。
程序二:clear;close all;N=40;x1=[6 15 -6 3 5 7 0 1];x2=[7 1 2 9 4 3 20 6];x2=[x2,x2,x2,x2];xn1=length(x1);xxn1=0:xn1-1;xn2=length(x2);xxn2=0:xn2-1;subplot(3,1,1);stem(xxn1,x1);subplot(3,1,2);stem(xxn2,x2);x11=fft(x1,N);x12=fft(x2,N);y11=x11.*x12;y1=ifft(y11,N);subplot(3,1,3);n=0:length(y1)-1;stem(n,y1,'.');title('循环卷积的结果');xlabel('n');ylabel('y1(n)');从图中可以看出循环卷积的结果已经呈循环序列。
实验五 使用matlab实现卷积的运算

实验五 使用matlab 实现卷积的运算一 实验目的1、 学习MATLAB 语言的编程方法及熟悉MA TLAB 指令;2、深刻理解卷积运算,利用离散卷积实现连续卷积运算;二 实验内容1、 完成)(1t f 与)(2t f 两函数的卷积运算 其中:)4()()(),()(221--==-t u t u t f t u et f t在一个图形窗口中,画出)(1t f 、)(2t f 以及卷积结果。
要求每个坐标系有标题、坐标轴名称。
>> p=0.1; t=0:p:10;f1=exp(-2*t).*u(t); f2=u(t)-u(t-4); f=conv(f1,f2); subplot(1,3,1); plot(t,f1,'r');title('f1(t)=e^-2*t*u(t)'); xlabel('t(sec)'); ylabel('f1(t)'); subplot(1,3,2); plot(t,f2,'g');title('f2(t)=u(t)-u(t-4)'); xlabel('t(sec)'); ylabel('f2(t)'); subplot(1,3,3); plot(f);title('f(t)=f1(t)*f2(t)'); xlabel('t(sec)'); ylabel('f(t)');051000.10.20.30.40.50.60.70.80.9f1(t)=e -2*t*u(t)t(sec)f 1(t )5100.10.20.30.40.50.60.70.80.91f2(t)=u(t)-u(t-4)t(sec)f 2(t )02004000.511.522.533.544.55f(t)=f1(t)*f2(t)t(sec)f (t )2、 若系统模型为:)(3)()(4)(4)(''''t f t f t y t y t y +=++ 其中 )()(t u e t f t-= 求零状态响应,画出波形(函数本身画出一幅图,自己再画出一幅输入波形图)。
用MATLAB实现线性卷积运算

北京邮电大学实验报告实验名称:用MATLAB实现线性卷积运算学院:信息与通信工程学院班级:姓名:学号:日期:2018年5月一、实验原理1、算法产生背景DFT 是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换频域的采样。
在形式上,变换两端<时域和频域上)的序列是有限长的。
DFT 具备明确且合理的物理含义,适合应用于数字系统,同时可以方便地由计算机进行运算。
对于线性非移变离散系统,可由线性卷积表示时域输入输出关系,即(> (>*(> ynxnhn通常采用循环卷积降低运算量,但实际中往往无法满足对信号处理的实时性要求。
因此,产生了重叠相加法和重叠保留法两种典型的算法,用以快速计算线性卷积,成为了DFT 的一个重要应用。
2、算法基本思想1)重叠相加法重叠相加法是将待过滤的信号分割成长为N 的若干段,如图1 所示,每一段都可以和有限时宽单位取样响应作卷积,再将过滤后的各段重叠相加。
具体算法实现原理如图2 所示,建立缓存序列,每次输入N 点序列,通过计算x(n> 和h(n> 的循环卷积实现线性卷积运算,将缓存的M-1 点序列和卷积结果相加,并输出前N 点作为计算结果,同时缓存后M-1 点,如此循环,直至所有分段计算完毕,则输出序列y(n>为最终计算结果。
2)重叠保留法重叠保留法相当于将x�l(n>和h(�n>作循环卷积,然后找出循环卷积中相当于线性卷积的部分。
在这种情况下,将序列y(n>分为长为N的若干段(如图3所示>,每个输入段和前一段有M-1个重叠点。
此时只需要将发生重叠的前M-1个点舍去,保留重叠的部分并输出,则可获得序列y(n>,算法如图4所示。
二、流程图设计1、重叠相加法2、重叠保留法三、MATLAB源代码1、重叠相加源码2.重叠保留源码2、四、实验结果与分析对两种算法采用同一序列进行测试分析。
信号与系统实验(MATLAB 西电版)实验5 连续时间信号的卷积运算[精]
![信号与系统实验(MATLAB 西电版)实验5 连续时间信号的卷积运算[精]](https://img.taocdn.com/s3/m/e91452c24693daef5ef73dea.png)
f(t)=f1(t)*f2(t)= f1()f2(t)dl i0k m
f1(kΔ)·f2(t-kΔ)·Δ
实验5 连续时间信号的卷积运算
实验5 连续时间信号的卷积运算
实验5 连续时间信号的卷积运算
y z ( t ) s 0 tx () h ( t ) d 0 tx ( t ) h ( ) d
yzs(t)=x(t)*h(t)
实验5 连续时间信号的卷积运算 由于计算机技术的发展,通过编程的方法来计算卷积积 分已经不再是冗繁的工作,并可以获得足够的精度。因此,
实验5 连续时间信号的卷积运算
subplot(3,1,2); %h(t) plot(t,h); title(′h(t)′); subplot(3,1,3); % plot(t,yzsappr(1:length(t))); title(′卷积的近似计算结果)′); xlabel(′时间′); 连续函数卷积计算(不利用conv函数)结果如图5.3
三、涉及的MATLAB
conv
w=conv(u,v):
实验5 连续时间信号的卷积运算
1. 利用离散conv 1) 若f1(t)=δ(t),f2(t)=u(t),试利用给出的参考程序,计算 f(t)=f1(t)*f2(t),f(t)=f1(t)*f1(t), f(t)=f2(t)*f2(t)(利用conv函数)。
实验5 连续时间信号的卷积运算 图 5.1 连续函数卷积计算结果
实验5 连续时间信号的卷积运算
2) 连续函数卷积计算1(利用conv函数)
MATLAB
%计算连续信号的卷积积分
%f:
%k:
基于Matlab实现线性卷积等

线性卷积与循环卷积一、作品目的通过matlab的强大功能展示线性卷积和循环卷积过程中方方面面的计算和变化,让大家对这两种卷积有一个更加完美的认识。
二、概念简介卷积是一种典型的乘累加运算。
1.线性卷积线性卷积是对线性移不变(LSI)系统的输入输出关系的描述,体现系统的特性。
线性卷积的表达式为一般情况,现实的系统为因果系统,有k<0时,恒有h(k)=0,则若x(n)是一个N点序列,h(n)是一个m点序列,则卷积的结果y(n)将是L=N+M-1点的序列。
2.循环卷积设x1(n) 和x2(n) 是两个长度为L、M的有限长序列,它们的N 点循环卷积x3(n) 定义为:注意:其中N>=Max{L,M}如果其中一个序列(或者两个序列)的长度没有所求N点循环卷积的长度长,那在该序列后面补零,直到长度达到N。
三、设计思路及程序1. 线性卷积:(1)以输入序列x(n)=[5,4,3,2,1],脉冲响应h(n)=[1,1,1,1]为列进行演示。
(2)计算输入序列和脉冲响应的长度。
(3)画出补零后的输入序列和脉冲响应(4)设计一个循环,在循环中实现反转、位移和计算。
并画出反转后的图像变化和卷积图像,将每一次移位结果保存为fig图。
(5)最后将上一步所生成的所有fig图合起来生成一张gif图程序展示:clear;clc;close all;(1)(2)xn=[5,4,3,2,1];M=length(xn);%输入任意序列并计算长度Mhn=[1,1,1,1];N=length(hn);%输入任意脉冲响应并计算长度Nm=[-(M-1):M+N-2];%设置代换变量的范围以便x(m)翻转和移位(3)xm=[zeros(1,M-1),xn,zeros(1,N-1)];%补零以便与m对应绘图subplot(2,2,1);stem(m,xm,'r.');%%绘输入序列x(m) ylabel('x(m)'); grid on;title('(a)输入序列x(m)');hm=[zeros(1,M-1),hn,zeros(1,M-1)];%补零以便与m对应绘图subplot(2,2,2);stem(m,hm,'r.');%绘脉冲响应ylabel('h(m)'),grid,title('(b)脉冲响应h(m)');%%加标签网格和标题yn=zeros(1,2*M+N-2);%卷积输出初始化(4)for n=0:M+N-2;%逐个计算卷积输出if n==0;xmfy=[fliplr(xn),zeros(1,M+N-2)];%实现翻转else for k=M:-1:1;xmfy(k+n)=xmfy(k+n-1);endxmfy(n)=0;xmfy;%实现翻转后移位并显示endsubplot(2,2,3);stem(m,xmfy,'b.');%%绘制翻转移位序列ylabel('x(n-m)'), grid,title('(c)x(n-m)');%%加标签网格和标题yn(M+n)=sum(xmfy.*hm);%计算第n位输出并与m位置对应subplot(2,2,4);stem(m,yn,'r.');%%绘制卷积输出序列axis([min(m),max(m),min([0,conv(xn,hn)]),max([0,c onv(xn,hn)])]);%%控制绘图坐标ylabel('y(n)');grid on;title('(d)卷积输出y(n)');%%加标签网格和标题pause(.5);drawnow,picname=[num2str(n) '.fig'];%保存的文件名:如i=1时,picname=1.fighold on % 写后面的字时,不把前面的字冲掉saveas(gcf,picname)endyn;stepall=M+N-2;(5)for i=1:stepallpicname=[num2str(i) '.fig'];open(picname)set(gcf,'outerposition',get(0,'screensize'));% matlab窗口最大化frame=getframe(gcf);im=frame2im(frame);%制作gif文件,图像必须是index索引图像[I,map]=rgb2ind(im,20);if i==1imwrite(I,map,'xianxingjuanji.gif','gif', 'Loopcount',inf,'DelayTime',0.5);elseif i==stepallimwrite(I,map,'xianxingjuanji.gif','gif','WriteMo de','append','DelayTime',0.5);elseimwrite(I,map,'xianxingjuanji.gif','gif','WriteMode','append','DelayTime',0.5); end;close allend实验结果展示:2. 循环卷积(1)以输入序列x(n)=[5,4,3,2,1],脉冲响应h(n)=[1,1,1,1]为列进行演示。
用MATLAB实现线性卷积运算 北邮

通常采用循环卷积降低运算量,但实际中往往无法满足对信号处理的实时性要求。因此,产生了重叠相加法和重叠保留法两种典型的算法,用以快速计算线性卷积,成为了DFT的一个重要应用。
2
重叠相加法是将待过滤的信号分割成长为N的若干段,如图1所示,每一段都可以和有限时宽单位取样响应作卷积,再将过滤后的各段重叠相加。
0.396206
0.246052
0.33387
10000000
59.93776
25.10466
3.897444
2.328122
3.231499
由上表和图1可以看出,随着数据规模增大,运算耗时呈线性增长,因而算法的时间复杂度为O(n),其中n为数据规模。因而重叠相加算法具有可行性和实用性。再从算法的空间复杂度来看,由于分配的缓存空间只由分段长度确定,不随数据规模的变化而变化,因而空间复杂度为O(1)。综合考察,重叠相加法具有较好的时间和空间复杂度。当数据量达到千万量级时,运算延时最少大约为2.328s,可运用于对信号的实时处理。
2
①分段问题
初始时没有考虑到分段长度的限制,导致用户输入分段小于系统冲击响应h(n)的长度时运算出错。后增加一个判断语句,当出现前述情况时,自动提升分段点数,问题解决。
②运算完整性问题
在写好代码之后的测试中,出现了一个十分奇怪的现象,即:当输入点数为1000、10000或者更大时卷积运算最后M-1个结果为0。反复测试发现,不仅1000和10000,只要是分段数N的倍数的输入点数都存在同样问题,而其他非倍数的输入,运算与conv()函数运算结果完全一致。通过设置断点,逐句调试,最终发现问题的症结,当输入序列为N的倍数时,最后的一段卷积实际上没有做。因而将循环次数增加1,将最后一次保留的M-1个点补全N个0,做最后一次分段卷积。修改后,测试结果正确。
实验dsp报告5 用MATLAB实现圆周卷积以及DFT 的实现

数字信号处理实验报告实验项目名称:用MATLAB实现圆周卷积以及DFT的实现实验日期:2012年11月28日实验成绩:实验评定标准:1)实验结果是否正确A()B()C()2)实验结果分析A()B()C()3)实验报告是否按照规定格式A()B()C()一、实验目的:通过MATLAB实现,实现对离散序列的DFT转换。
二、实验器材:PC机一台MATLAB软件三、实验内容1、计算两序列x1=[1,2,3,4,5]、x2=[1,2,3,4,5,4,3,2,1]的圆周卷积。
clear allclose allclcx1=[1,2,3,4,5];x2=[1,2,3,4,5,4,3,2,1];N=length(x1)+length(x2);n=0:N-1;n1=0:N-2;n2=0:N-3;y1=circonvt(x1,x2,N);y2=circonvt(x1,x2,N-1);y3=circonvt(x1,x2,N-2);x1=[x1zeros(1,N-length(x1))]; x2=[x2zeros(1,N-length(x2))]; Xf1=dft(x1,N);Xf2=dft(x2,N);Xf=Xf1.*Xf2;x=idft(Xf,N)x=real(x);subplot(231)stem(n,x1);title('x1(n)')subplot(232);stem(n,x2);title('x2(n)')subplot(233);stem(n,x);title('x(n)=IDFT(X(k))') subplot(234)stem(n,y1);title('N点圆周卷积') subplot(235)stem(n1,y2);title('N-1点圆周卷积') subplot(236)stem(n2,y3);title('N-2点圆周卷积')另外需要函数定义文件:(1)cirshftt:M-file文件:function y=cirshftt(x,m,N)%长度为N的x序列:(时域)作m采样点圆周移位%[y]=cirshftt(x,m,N)%y=包含圆周移位的输出序列%x=长度<=N输入序列%m=移位采样数%N=圆周缓冲器长度%方法:y(n)=x((n-m)mod N)%Check for length of xif length(x)>Nerror('N必须>=x的长度')endx=[x zeros(1,length(x))];n=[0:1:N-1];n=mod(n-m,N);y=x(n+1);(2)circonvt:M-file文件:在x1和x2:(时域)之间的N点圆周卷积:function y=circonvt(x1,x2,N)%在x1和x2:(时域)之间的N点圆周卷积%[y]=circonvt(x1,x2,N)%y=包含圆周卷积的输出序列%x1=长度N1<=N的输入序列%x2=长度N2<=N的输入序列%N=圆周缓冲器的大小%方法y(n)=sum(x1(m)*x2((n-m)mod N))%check for length of x1if length(x1)>Nerror('N必须>=x1的长度')end%check for length of x2if length(x2)>Nerror('N必须>=x2的长度')endx1=[x1zeros(1,N-length(x1))];x2=[x2zeros(1,N-length(x2))];m=[0:1:N-1];x2=x2(mod(-m,N)+1);H=zeros(N,N)for n=1:1:NH(n,:)=cirshftt(x2,n-1,N);endy=x1*H';(3)dft:M-file文件:计算离散付利叶变换:function[Xk]=dft(xn,N)%计算离散付利叶变换%[Xk]=dft(xn,N)%Xk=在0<=k<=N-1间的DFT系数数组%xn=N点有限长度序列%N=DFT的长度n=[0:1:N-1];%n de hangxiangliang k=[0:1:N-1];%k de hangxiangliang WN=exp(-j*2*pi/N);nk=n'*k;WNnk=WNl.^nk;Xk=xn*WNnk;(4)idft:M-file文件:计算离散傅里叶变换:function[xn]=idft(Xk,N)%计算离散傅里叶变换n=[0:1:N-1];k=[0:1:N-1];WN=exp(-j*2*pi/N):nk=n'*k:WNnk=WN.^(-nk):xn=(Xk*WNnk)/N;四、实验结果:五、实验结果分析:通过实验,经过对各个步骤的链接、综合,最后经过DFT的实际变换,最终终于得到了DFT的变换结果如上图所示。
用MATLAB实现信号的时域卷积

用MATLAB 实现信号的时域卷积摘要:利用抽样方法绘制连续信号和离散信号.编制函数计算连续时间信号,离散时间信号的卷积.关键字:MATLAB ;离散卷积;连续卷积实验原理:卷积运算在信号与系统分析中具有非常重要的意义,是信号与系统分析的基本方法之一.线性是不变系统的零状态响应就可以通过求解驶入激励信号与系统单位冲击响应的卷积运算获得.在连续时间系统中,卷积运算成为卷积积分,表示为在离散时间系统中,卷积运算称为卷积和,表示为:实验任务与实现方法:⑴ 编制计算离散时间序列卷积核的M 函数()dconv ,该函数课计算两离散序列()n x 1和()n x 2的卷积和()()()n x n x n x 21*=.程序计算出卷积和()n x 的同时,还绘制出序列()n x 1、()n x 2和()n x 的时域波形图,并返回()n x 的非零样值点的对应向量.任务〔1〕程序:function dconv<x1,x2,y1,y2>%任意两序列卷积x1=input<'请输入x1='>;x2=input<'请输入x2='>;y1=input<'请输入y1='>;y2=input<'请输入y2='>;subplot<131>,stem<x1,y1>,gridon ,title<'y1'>,axis<[<min<x1>-1>,<max<x1>+1>,<min<y1>-1>,<max<y1>+1>]>subplot<132>,stem<x2,y2>,gridon ,title<'y2'>,axis<[<min<x2>-1>,<max<x2>+1>,<min<y2>-1>,<max<y2>+1>]>%_____________________________________________xmin1=min<x1>;xmax1=max<x1>;xmin2=min<x2>;xmax2=max<x2>;t=<xmax2+xmax1>-<xmin2+xmin1>+1;xx=0:<t-1>;ft=conv<y1,y2>subplot<133>,stem<xx,ft>,grid on ,title<'*'>axis<[<min<xx>+0.5>,<max<xx>+0.5>,<min<ft>-0.5>,<max<ft>+0.5>]>⑵ 调用()dconv 来完成下面两离散序列的卷积和运算,并绘制图形:任务〔2〕程序:function f=ddconv<m1,m2>%-----------------------------%离散序列1t1=m1-5;t2=m1+5;t=t1:t2; %横坐标n=length<t>;tt=t1:m1; %起始到跳变n1=length<tt>;f1=[zeros<1,n1-1>,ones<1,n-n1+1>];%subplot<141>,stem<t,f1>,grid on,title<'阶跃函数序列 u<n-m1> '>,axis<[t1 t2 -0.2 1.5]>%-------------------------------%离散序列2p1=m1-5;p2=m1+5;p=p1:p2; %横坐标z=length<p>;pp=p1:m2; %起始到跳变z1=length<pp>;f2=[zeros<1,z1-1>,ones<1,z-z1+1>];%subplot<142>,stem<p,f2>,grid on,title<'离散阶跃序列 u<n-m2> '>,axis<[p1 p2 -0.2 1.5]>%------------------------------------%两离散序列相减k=min<min<t>,min<p>>:max<max<t>,max<p>>; %共同横坐标s1=zeros<1,length<k>>;s2=s1;s1<find<<k>=min<t>>&<k<=max<t>>==1>>=f1;s2<find<<k>=min<p>>&<k<=max<p>>==1>>=f2;f=s1-s2;subplot<131>,stem<k,f>,grid on,title<'x<n>=u<n>-u<n-4>'>axis<[<min<min<t>,min<p>>-1>,<max<max<t>,max<p>>+1>,<min<f>-0.5>,<max <f>+0.5>]>subplot<132>,stem<k,f>,grid on,title<'h<n>=u<n>-u<n-4>'>axis<[<min<min<t>,min<p>>-1>,<max<max<t>,max<p>>+1>,<min<f>-0.5>,<max <f>+0.5>]>%----------------------------xmin1=min<k>;xmax1=max<k>;xmin2=min<k>;xmax2=max<k>;t=<xmax2+xmax1>-<xmin2+xmin1>+1;xx=0:<t-1>;ft=conv<f,f>subplot<133>,stem<xx,ft>,grid on,title<'h<n>*x<n>'>axis<[<min<xx>+0.5>,<max<xx>+0.5>,<min<ft>-0.5>,<max<ft>+0.5>]>⑶编制计算连续时间信号卷积积分的M函数()sconv,该函数在计算出两信号()t f1和()t f 2的卷积积分()t f的数值近似的同时,还绘制出()t f1、()tf2和()t f的时域波形图. 实现方法:与第〔4〕任务用同一个程序.⑷调用函数()sconv来完成下面两连续时间信号的卷积积分运算,并绘制图形:()()121--⎪⎭⎫⎝⎛+=tutut e,()()()[]221--=tututth任务〔3、4〕程序:function sconv<>%u<t>m1=0;t1=m1-10;t2=m1+10;t=t1:0.01:t2;n=length<t>;tt=t1:0.01:m1;n1=length<tt>;f1=[zeros<1,n1-1>,ones<1,n-n1+1>];%subplot<131>,plot<t,f1>,grid on,title<'ÀëÉ¢½×Ô¾ÐòÁÐ u<t> '>,axis<[t1 t2 -0.2 1.5]>%u<t+1/2>tx1=t-1/2;fx1=f1;%subplot<241>,stairs<tx1,fx1>,grid on,title<' u<t+1/2> '>,axis<[t1 t2 -0.2 1.5]>%u<t-1>tx2=t+1;fx2=f1;%subplot<242>,stairs<tx2,fx2>,grid on,title<' u<t-1> '>,axis<[t1 t2 -0.2 1.5]>k=min<min<tx1>,min<tx2>>:0.01:max<max<tx1>,max<tx2>>;s1=zeros<1,length<k>>;s2=s1;s1<find<<k>=min<tx1>>&<k<=max<tx1>>==1>>=fx1;s2<find<<k>=min<tx2>>&<k<=max<tx2>>==1>>=fx2;e=s1-s2;subplot<131>,stairs<k,e>,grid on,title<'e<t>=u<t+1/2>-u<t-1>'>axis<[<min<min<tx1>,min<tx2>>+5>,<max<max<tx1>,max<tx2>>-5>,<min<e>-0 .5>,<max<e>+0.5>]>tx3=t;fx3=f1;%subplot<243>,stairs<tx3,fx3>,grid on,title<' u<t> '>,axis<[t1 t2 -0.2 1.5]>tx4=t+2;fx4=f1;%subplot<244>,stairs<tx4,fx4>,grid on,title<' u<t-2> '>,axis<[t1 t2 -0.2 1.5]>k1=min<min<tx3>,min<tx4>>:0.01:max<max<tx3>,max<tx4>>;s3=zeros<1,length<k1>>;s4=s1;s3<find<<k1>=min<tx3>>&<k1<=max<tx3>>==1>>=fx3;s4<find<<k1>=min<tx4>>&<k1<=max<tx4>>==1>>=fx4;h=s3-s4;%subplot<236>,stairs<k1,h>,grid on,title<' u<t>-u<t-2>'>%axis<[<min<min<tx3>,min<tx4>>+5>,<max<max<tx3>,max<tx4>>-5>,<min<h>-0.5>,<max<h>+0.5>]>h<t>=1/2*t*[u<t>-u<t-2>]kk1=length<k1>;ont=0:0.01:kk1;ks=min<min<k1>,min<ont>>:0.01:max<max<k1>,max<ont>>;s5=zeros<1,length<ks>>;s6=s5;s5<find<<ks>=min<ont>>&<ks<=max<ont>>==1>>=ont;s6<find<<ks>=min<k1>>&<ks<=max<k1>>==1>>=h;ffu=1/2*<s5.*s6>;subplot<132>,stairs<ks,ffu>,grid on,title<'1/2*t*[u<t>-u<t-2>]'>axis<[-5,5,<min<ffu>-0.5>,<max<ffu>+0.5>]>xmin1=min<k>;xmax1=max<k>;xmin2=min<ks>;xmax2=max<ks>;ttx=<xmax2+xmax1>-<xmin2+xmin1>+0.01;xx=0:0.01:<ttx-0.01>;ft=conv<e,ffu>;subplot<133>,stairs<xx,ft>,grid on,title<'h<n>*x<n>'>axis<[15,55,<min<ft>-0.5>,<max<ft>+0.5>]>实验总结:通过本次实验学会了用MATLAB实现线性系统的时域分析.能自己完成的东西一定要自己独立完成,这样收获的东西才是自己的.。
卷积计算的实验报告

1. 理解卷积的基本概念和原理;2. 掌握卷积的计算方法;3. 通过MATLAB软件实现卷积运算;4. 分析卷积运算在信号处理中的应用。
二、实验原理卷积是一种线性运算,它描述了两个信号之间的相互作用。
对于两个离散信号x[n]和h[n],它们的卷积y[n]定义为:y[n] = Σx[k]h[n-k]其中,n和k为离散时间变量,Σ表示求和。
卷积运算具有以下性质:1. 交换律:x[n] h[n] = h[n] x[n]2. 结合律:(x[n] h[n]) g[n] = x[n] (h[n] g[n])3. 分配律:x[n] (h[n] + g[n]) = x[n] h[n] + x[n] g[n]卷积运算在信号处理中具有重要的应用,如信号滤波、系统分析、图像处理等。
三、实验内容1. 熟悉MATLAB软件环境;2. 编写MATLAB程序实现卷积运算;3. 分析卷积运算的结果,验证卷积性质;4. 应用卷积运算解决实际问题。
四、实验器材1. 计算机;2. MATLAB软件;3. 离散信号数据。
1. 创建离散信号数据:在MATLAB中创建两个离散信号x[n]和h[n],分别代表输入信号和系统响应。
2. 编写卷积程序:使用MATLAB内置函数conv实现卷积运算,计算y[n] = x[n] h[n]。
3. 分析卷积结果:观察卷积运算的结果,验证卷积性质,如交换律、结合律、分配律等。
4. 应用卷积运算解决实际问题:选择一个实际问题,如信号滤波,使用卷积运算进行求解。
六、实验结果与分析1. 卷积运算结果:运行卷积程序,得到卷积运算结果y[n]。
观察y[n]的波形,分析卷积运算对信号的影响。
2. 验证卷积性质:通过比较x[n] h[n]和h[n] x[n]的卷积结果,验证交换律;通过比较(x[n] h[n]) g[n]和x[n] (h[n] g[n])的卷积结果,验证结合律;通过比较x[n] (h[n] + g[n])和x[n] h[n] + x[n] g[n]的卷积结果,验证分配律。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五 使用matlab 实现卷积的运算
一 实验目的
1、 学习MATLAB 语言的编程方法及熟悉MA TLAB 指令;
2、
深刻理解卷积运算,利用离散卷积实现连续卷积运算;
二 实验内容
1、 完成)(1t f 与)(2t f 两函数的卷积运算 其中:)4()()(),
()(221--==-t u t u t f t u e
t f t
在一个图形窗口中,画出)(1t f 、
)(2t f 以及卷积结果。
要求每个坐标系有标题、坐标轴名称。
>> p=0.1; t=0:p:10;
f1=exp(-2*t).*u(t); f2=u(t)-u(t-4); f=conv(f1,f2); subplot(1,3,1); plot(t,f1,'r');
title('f1(t)=e^-2*t*u(t)'); xlabel('t(sec)'); ylabel('f1(t)'); subplot(1,3,2); plot(t,f2,'g');
title('f2(t)=u(t)-u(t-4)'); xlabel('t(sec)'); ylabel('f2(t)'); subplot(1,3,3); plot(f);
title('f(t)=f1(t)*f2(t)'); xlabel('t(sec)'); ylabel('f(t)');
05100
0.10.20.30.40.5
0.6
0.70.8
0.9f1(t)=e -
2*t*u(t)t(sec)
f 1(t )
510
0.10.20.30.4
0.50.6
0.70.80.9
1f2(t)=u(t)-u(t-4)
t(sec)
f 2(t )
0200400
0.511.522.53
3.54
4.5
5f(t)=f1(t)*f2(t)
t(sec)
f (t )
2、 若系统模型为:
)(3)()(4)(4)('
'
'
't f t f t y t y t y +=++ 其中 )()(t u e t f t
-= 求零状态响应,画出波形(函数本身画出一幅图,自己再画出一幅输入波形图)。
a=[1 4 4]; b=[1 3]; sys=tf(b,a); td=0.01; t=0:td:10;
f=exp(-t).*u(t); y=lsim(sys,f,t); plot(t,y);
xlabel('t(sec)'); ylabel('y(t)');
01234
5678910
0.050.10.150.2
0.25
0.3
0.35
t(sec)
y (t )
a= [1 4 4]; b= [1 3]; sys = tf(b, a); td = 0.01; t = 0 : td : 10; f = exp(-t).*u(t); plot(t,f);
xlabel('t(sec)'); ylabel('f(t)');
三 实验原理: 1、 离散卷积和: 调用函数:conv ()
∑∞
-∞
=-=
=i i k f i f f f conv S )()(1)2,1(为离散卷积和,
其中,f1(k), f2 (k) 为离散序列,K=…-2, -1, 0 , 1, 2, …。
但是,conv 函数只给出纵轴的序列值的大小,而不能给出卷积的X 轴序号。
为得到该值,进行以下分析:
对任意输入:设)(1k f 非零区间n1~n2,长度L1=n2-n1+1;)(2k f 非零区间m1~m2,长度L2=m2-m1+1。
则:)(*)()(21k f k f k s =非零区间从n1+m1开始,长度为L=L1+L2-1,所以S (K )的非零区间为:n1+m1~ n1+m1+L-1。
2、 连续卷积和离散卷积的关系:
计算机本身不能直接处理连续信号,只能由离散信号进行近似: 设一系统(LTI )输入为
)(t P ∆,输出为)(t h
∆
,如图所示。
)t
1
2
3
4
5 6
7
8
9
10
00.10.20.30.40.50.60.70.80.91t(sec)
f(t)
)()(t h t P ∆∆→
)()(lim )(lim )(0
t h t h t P t =→=∆→∆∆→∆δ
若输入为f(t):
∆∆-∆=
≈∑∞
-∞
=∆
∆)()()()(k t P k f t f t f k
得输出:
∆∆-∆=
∑∞
-∞
=∆
∆)()()(k t h
k f t y k
当0→∆时:⎰∑∞
∞-∞
-∞
=∆
→∆∆→∆-=∆∆-∆==ττδτd t f k t P k f t f t f k )()()()(lim
)(lim )(0
⎰∑∞
∞
-∞
-∞
=∆
→∆∆→∆-=
∆∆-∆==τττd t h f k t h
k f t y t y k )()()()(lim
)(lim )(0
所以:
∆
∆-∆=-==∑⎰→∆)()(lim
)()()(*)()(21
2121k t f k f
d t f f t f t f t s τ
ττ
如果只求离散点上的f 值)(n f ∆
]
)[()()()()(2121
∑∑∞
-∞
=∞
-∞=∆-∆∆=∆
∆-∆∆=
∆k k k n f k f k n f k f
n f
所以,可以用离散卷积和CONV ()求连续卷积,只需∆足够小以及在卷积和的基础上乘以∆。
3、 连续卷积坐标的确定:
设)(1t f 非零值坐标范围:t1~t2,间隔P )(2t f 非零值坐标范围:tt1~tt2,间隔P
)(*)()(21t f t f t s =非零值坐标:t1+tt1~t2+tt2。