实验一 离散卷积的C语言编程(1)
- 格式:ppt
- 大小:162.50 KB
- 文档页数:19


数字信号处理实验讲义xxxxxxxx实验一 离散信号的卷积运算[实验目的](1)学会利用MATLAB 中conv(a,b)命令验证卷积运算;(2)理解序列卷积函数的修正方法;(3)掌握程序代码调试、结果分析的方法。
[实验原理]序列的卷积在数学上定义为∑∞-∞=-=*=k k n h k x n h n x n y )()()()()( (1) 在MATLAB 中,直接用函数conv 来实现卷积操作,即y = conv(x,h),且默认序列从n=0开始。
如果某序列从一负值开始,就不能直接使用函数conv 来实现。
一般地,若有序列{x(n),n Lx <n<n Hx }和{h(n),n Lh <n<n Hh },那么这两个序列卷积所得到的新序列为:{}H h H x H y Lh Lx Ly H h ly n n n n n n n n n n y +=+=〈〈,,),(且有 (2)根据(2)式,就可以得到序列卷积函数的修正方法。
[实验容及步骤]设两序列分别为∑-===551)()()(k k n u n x δ,)()(112n R n x =其卷积函数为 ∑∞-∞=-=*=k k n x k x n x n x n y )()()()()(2121试采用序列卷积函数的修正方法编程实现两序列卷积函数。
(1) 编写两个序列x1(n),x2(n)卷积的MATLAB 程序;序列x1(n),x2(n)卷积的MATLAB 程序:% 序列卷积的修正n1=[-5:5];n2=[0:10];na=min(n1)+ min(n2);nb=max(n1)+ max(n2);n=[na:nb];x1n=ones(1,length(n1));x2n=ones(1,length(n2));% 生成卷积序列yn = conv(x1n,x2n);subplot(1,3,1),stem(n1,x1n);xlabel(‘nl’); ylabel(‘xl(n)’);subplot(1,3,2),stem(n2,x2n);xlabel(‘n2’); ylabel(‘x2(n)’);subplot(1,3,3),stem(n,yn);xlabel(‘n’); ylabel(‘y’);title(‘修改后的卷积’)(2) 程序代码调试、运行及结果分析。
离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]实验成绩:202212202201016学号:【实验题目】1.命题逻辑实验四【实验目的】2.掌握用计算机求集合的交、并、差和补运算的方法。
【实验内容】3.编程实现集合的交、并、差和补运算。
【实验要求】4、++语言编程实现C或C【算法描述】5.10},,,9,6,7,,C,E表示集合。
假定A={1,34,5,(1)用数组AB10},9,,8,7,4,5,6,34B={2,,3,,7,8,10},E={1,2,,输入数据时要求检查数据是否重复(集合中的E(全集),B,输入数组A 的子集。
B是集合E,要求集合数据要求不重复)A,置成空集。
以下每一个运算都要求先将集合CB}且某)二个集合的交运算:AB={某|某A(2C中的元素进行比较,将相同的元素放在数组中元素逐一与数组B把数组AB的交。
便是集合中,数组CA和集合C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]==b[j])c[k++]=a[i];B}或某3)二个集合的并运算:AB={某|某A(中中的元素逐一与数组AC中。
将数组B中各个元素先保存在数组把数组AB和集合C便是集合A 的元素进行比较,把不相同的元素添加到数组C中,数组的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]==c[j])break;if(j==m){c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={某|某A且某B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
C语言算法:for(j=0;j<m;j++){for(i=0;i<n;i++){if(A[j]==B[i]){C[k]=A[j];k++;break;}if(j==n){C[k]=A[i];k++;}}A}且~A=B-A={某|某B某)集合的补运算:(5把不相同的元素保存到中的元素进行比较,E中的元素逐一与数组A将数组关于集合中,数组数组CC便是集合AE的补集。
DSP实验报告离散卷积的C语言实验姓名:学号:班级:DSP实验:离散卷积的C语言实验一、实验目的1.1认识各种常用的信号;1.2掌握卷积的定义和计算方法;1.3掌握在计算机中生成以及绘制信号序号图的方法。
二、实验内容1.用C语言编程产生以下时间序列信号①x1(n)=n u(n)0≤n≤31②x2(n)=a^n u(n)0≤n≤31,0<a<1③x3(n)=G(n)0≤n≤31④产生自己欲实现的一个任意序列(参考《数字信号处理实验教程》69页序列xa(n)=Ae-anTsin(w0nT)u(n),0≤n≤31)。
2、用C语言编程实现y(n)=x1(n)*x3(n)和y(n)=x2(n)*x3(n)并在显示器上观察到x1(n)、x2(n)、x3(n)和y(n)几个相应序列。
3、要求用菜单操作实现序列输入、显示输入,用数组和序列两种形式三、程序VHDL代码include"stdarg.h"#include"graphics.h"#include"math.h"#include"stdio.h"void conv(float x[],int M,float h[],int N,float y[]);void figure(float x[],int m1,float y[],int m2,float z[],int m3);main(){int M,N,n;float a;float A,q,w0,T;char c;float y[63]={0};float x1[32]={0};float x2[32]={0};float x3[32]={0};float xa[32]={0};for(n=0;n<32;n++){x1[n]=n;}for(n=0;n<32;n++){x3[n]=1;}printf("please select x1(z),x2(y),xa(x):\n");c=getch();if(c=='z'){conv(x1,32,x3,32,y);getch();printf("this is y1(n):\n");figure(x1,32,x3,32,y,63);getch();}if(c=='y'){printf("signal x2:\n");loop:printf("please input a(0<a<1):\n");scanf("%f",&a);if(a<=0)goto loop;if(a>=1)goto loop;for(n=0;n<32;n++){x2[n]=pow(a,n);}conv(x2,32,x3,32,y);getch();printf("this is y2(n):\n");figure(x2,32,x3,32,y,63);getch();}if(c=='x'){printf("signal xa:\n");printf("please input A:\n");scanf("%f",&A); printf("please input q:\n");scanf("%f",&q); printf("please input w0:\n");scanf("%f",&w0); printf("please input T:\n");scanf("%f",&T);for(n=0;n<32;n++){xa[n]=A*exp(-q*n*T/1000)*sin(w0*n*T/1000);} clrscr();conv(xa,32,x3,32,y);getch();clrscr();for(n=0;n<82;n++){if(n%6==0)printf("\n");printf("%12.6f",y[n]);}getch();printf("\nthis is ya(n):\n")四、仿真结果五、感悟心得在DSP实验之前一直对用所学理论内容没有清晰的概念,第一次实验虽然没跟上节奏,在第二堂课才弄清脉络,但弄清老师所讲重点之后,程序的修改便水到渠成。
二.连续时间信号卷积和离散时间信号卷积1.连续时间信号卷积)()()(21t f t f t f *=;2.离散时间信号卷积)()()(21n f n f n f *=连续时间信号卷积function [f,k]=sconv(f1,f2,k1,k2,p)%计算连续信号卷积积分f(t)=f1(t)*f2(t)%f: 卷积积分f(t)对应的非零样值向量%K: f(t)的对应时间向量%f1: f1(t)的非零样值向量%f2: f2(t)的非零样值向量%K1: 序列f1(t)的对应时间向量%K2: 序列f2(t)的对应时间向量%p: 取样时间间隔f1=0.5*(0:0.01:2);f2=0.5*(0:0.01:2);k1=0:0.01:2;k2=0:0.01:2;p=0.01;f=conv(f1,f2); %计算序列1与序列2的卷积和f=f*p;k0=k1(1)+k2(1); %计算序列f 非零样值的起点位置k3=length(f1)+length(f2)-2; %计算卷积和f 非零样值得宽度k=k0:p:k0+k3*p; %确定卷积和f 非零样值的时间向量subplot(3,3,1)plot(k1,f1) %在子图1绘制f1(t)时域波形图title('f1(t)')xlabel('t')ylabel('f1(t)')subplot(3,3,4)plot(k2,f2) %在子图2绘制f2(t)时域波形图title('f2(t)')xlabel('t')ylabel('f2(t)')subplot(3,3,7)plot(k,f); %画卷积f(t)的时域波形 h=get(gca,'position');h(3)=2.5*h(3);set(gca,'position',h) %将第三个子图的横坐标范围扩为原来的2.5倍title(' f(t)=f1(t)*f2(t)')xlabel('t')ylabel('f(t)')离散时间信号卷积function [f,k]=dconv(f1,f2,k1,k2)%The function of compute f=f1*f2%f: 卷积和序列f(k)对应的非零样值向量%k: 序列f(k)的对应序号向量%f1: 序列f1(k)非零样值向量%f2: 序列f2(k)非零样值向量%k1: 序列f1(k)的对应序号向量%k2: 序列f2(k)的对应序号向量f1=[1,2,1];f2=ones(1,5);k1=[-1 0 1];k2=-2:2;f=conv(f1,f2) %计算序列f1与f2的卷积和fk0=k1(1)+k2(1); %计算序列f非零样值的起点位置k3=length(f1)+length(f2)-2; %计算卷积和f的非零样值的宽度k=k0:k0+k3 %确定卷积和f非零样值得序号向量subplot(3,3,1)stem(k1,f1) %在子图1绘制序列f1(k)时域波形图title('f1(n)')xlabel('n')ylabel('f1(n)')subplot(3,3,4)stem(k2,f2) %在子图2绘制序列f2(k)时域波形图title('f2(n)')xlabel('n')ylabel('f2(n)')subplot(3,3,7)stem(k,f) %在子图3绘制序列f(k)时域波形图title('f1(n)与f2(n)的卷积和f(n)')xlabel('n')ylabel('f(n)')h=get(gca,'position');h(3)=2.5*h(3);set(gca,'position',h) % 将第三个子图的横坐标范围扩为原来的2.5倍wigb.mfunction wigb (a,scal,x,z,amx)%WIGB: Plot seismic data using wiggles%% WIGB(a,scal,x,z,amx)%% IN a: seismic data% scale: multiple data by scale% x: x-axis;% z: vertical axis (time or depth)% x and z are vectors with offset and time.%% If only 'a' is enter, 'scal,x,z,amn,amx' are decided automatically;% otherwise, 'scal' is a scalar; 'x, z' are vectors for annotation in% offset and time, amx are the amplitude range.%% Author:% Xingong Li, Dec. 1995% Changes:% Jun11,1997: add amx% May16,1997: updated for v5 - add 'zeros line' to background color% May17,1996: if scal ==0, plot without scaling% Aug6, 1996: if max(tr)==0, plot a lineif nargin == 0, nx=10;nz=10; a = rand(nz,nx)-0.5; end;[nz,nx]=size(a);trmx= max(abs(a));if (nargin <= 4); amx=mean(trmx); end;if (nargin <= 2); x=[1:nx]; z=[1:nz]; end;if (nargin <= 1); scal =1; end;if nx <= 1; disp(' ERR:PlotWig: nx has to be more than 1');return;end;% take the average as dxdx1 = abs(x(2:nx)-x(1:nx-1));dx = median(dx1);dz=z(2)-z(1);xmx=max(max(a)); xmn=min(min(a));if scal == 0; scal=1; end;a = a * dx /amx;a = a * scal;fprintf(' PlotWig: data range [%f, %f], plotted max %f \n',xmn,xmx,amx);% set display rangex1=min(x)-2.0*dx; x2=max(x)+2.0*dx;z1=min(z)-dz; z2=max(z)+dz;set(gca,'NextPlot','add','Box','on', ...'XLim', [x1 x2], ...'YDir','reverse', ...'YLim',[z1 z2]);fillcolor = [0 0 0];linecolor = [0 0 0];linewidth = 0.1;z=z'; % input as row vectorzstart=z(1);zend =z(nz);for i=1:nx,if trmx(i) ~= 0; % skip the zero tracestr=a(:,i); % --- one scale for all sections = sign(tr) ;i1= find( s(1:nz-1) ~= s(2:nz) ); % zero crossing pointsnpos = length(i1);%12/7/97zadd = i1 + tr(i1) ./ (tr(i1) - tr(i1+1)); %locations with 0 amplitudes aadd = zeros(size(zadd));[zpos,vpos] = find(tr >0);[zz,iz] = sort([zpos; zadd]); % indices of zero point plus positives aa = [tr(zpos); aadd];aa = aa(iz);% be careful at the endsif tr(1)>0, a0=0; z0=1.00;else, a0=0; z0=zadd(1);end;if tr(nz)>0, a1=0; z1=nz;else, a1=0; z1=max(zadd);end;zz = [z0; zz; z1; z0];aa = [a0; aa; a1; a0];zzz = zstart + zz*dz -dz;patch( aa+x(i) , zzz, fillcolor);line( 'Color',[1 1 1],'EraseMode','background', ...'Xdata', x(i)+[0 0], 'Ydata',[zstart zend]); % remove zero line%'LineWidth',linewidth, ...%12/7/97 'Xdata', x(i)+[0 0], 'Ydata',[z0 z1]*dz); % remove zero lineline( 'Color',linecolor,'EraseMode','background', ...'LineWidth',linewidth, ...'Xdata', tr+x(i), 'Ydata',z); % negatives lineelse % zeros traceline( 'Color',linecolor,'EraseMode','background', ...'LineWidth',linewidth, ...'Xdata', [x(i) x(i)], 'Ydata',[zstart zend]);end;end;。