数字信号处理课程设计离散时间信号的运算及其编程实现.docx
《数字信号处理课程设计离散时间信号的运算及其编程实现.docx》由会员分享,可在线阅读,更多相关《数字信号处理课程设计离散时间信号的运算及其编程实现.docx(23页珍藏版)》请在冰豆网上搜索。
![数字信号处理课程设计离散时间信号的运算及其编程实现.docx](https://file1.bdocx.com/fileroot1/2023-2/7/59e7dd1a-6a9c-4cad-98a4-dd8adcdca7e7/59e7dd1a-6a9c-4cad-98a4-dd8adcdca7e71.gif)
数字信号处理课程设计离散时间信号的运算及其编程实现
课程设计任务书
学生姓名:
专业班级:
电信1306班
指导教师:
工作单位:
信息工程学院
课程设计名称:
信号分析与处理课程设计
课程设计题目:
离散时间信号的运算及其编程实现
初始条件:
1.Matlab软件;
2.课程设计辅导资料:
“Matlab语言基础及使用入门”、“信号与系统”、“数字信号处理原理与实现”、“Matlab及在电子信息课程中的应用”等;
3.先修课程:
信号与系统、数字信号处理、Matlab应用实践及信号处理类课程等。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.课程设计时间:
1周;
2.课程设计内容:
离散时间信号的运算及其编程实现,具体包括:
序列的相加、相乘、合成、截取和各种移位运算等;
3.本课程设计统一技术要求:
研读辅导资料对应章节,对选定的设计题目进行理论分析,针对具体设计部分的原理分析、建模、必要的推导和可行性分析,画出程序设计框图,编写程序代码(含注释),上机调试运行程序,记录实验结果(含计算结果和图表),并对实验结果进行分析和总结,按要求进行实验演示和答辩等;
4.课程设计说明书按学校“课程设计工作规范”中的“统一书写格式”撰写,具体包括:
1目录;
2与设计题目相关的理论分析、归纳和总结;
3与设计内容相关的原理分析、建模、推导、可行性分析;
4程序设计框图、程序代码(含注释)、程序运行结果和图表、实验结果分析和总结;
5课程设计的心得体会(至少500字);
6参考文献(不少于5篇);
7其它必要内容等。
时间安排:
1周
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
摘要
离散时间信号是指信号在时间上是离散的,只在某些不连续的时刻给出信号的值,而其它时间则没有定义。
为了便于数字系统的接受、处理,需要对信号进行数字化处理,即出现了时间上离散,幅度上量化的信号。
在离散时间系统中,信号用序列表示。
有一些常见的典型序列,我们时刻都需要用到,同时需要掌握的还有序列的一些运算。
MATLAB在数值计算、符号运算、数据可视化、数字文件图形处理等方面有杰出优势,所以,我们需要了解常见序列的MATLAB实现,以及序列运算的MATLAB实现。
关键词:
离散时间信号,序列运算,编程实现
离散时间信号的运算及其编程实现
1MATLAB概述
1.1MATLAB简介
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。
是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
1.2MATLAB的应用及特点
MATLAB以矩阵作为基本编程单元,它提供了各种矩阵的运算与操作,并有较强的绘图功能。
MATLAB集科学计算、图像处理、声音处理于一身,是一个高度的集成系统,有良好的用户界面,并有良好的帮助功能。
MATLAB不仅流行于控制界,在机械工程、生物工程、语音处理、图像处理、信号分析、计算机技术等各行各业中都有极广泛的应用。
MATLAB语言的特点:
1.编程效率高;2.用户使用方便;3.扩充能力强;4.语句简单,内涵丰富;5.高效方便的矩阵和数组运算;6.方便的绘图功能。
1.3数字信号处理的特点
数字信号处理的主要对象是数字信号,且是采用运算的方法达到处理目的,因此,其实现方法不同于模拟信号的实现方法,基本上可以分为两种实现方法,即软件实现方法和硬件实现的方法。
而硬件实现指的是选用合适的DSP芯片,配有适合芯片语言及任务要求的软件,实现某种信号处理功能的一种方法。
数字信号处理的特点:
1.灵活性;2.高精度和高稳定性;3.便于大规模集成;4.对数字信号可以存储、运算;5系统可以获得高性能指标。
2理论分析
2.1Matlab表示序列
Matlab中,可采用向量表示序列,由于Matlab中对序列下标默认为从1开始递增,因此要表示离散信号
,一般应采用两个向量分别对信号的自变量和因变量进行描述。
如
n=-3~4,在MATLAB中表示为:
>>n=[-3,-2,-1,0,1,2,3,4];%自变量取值
>>x=[2,1,-1,0,1,4,3,7];%因变量取值
2.2常用典型序列
2.2.1单位阶跃序列
(2.1)
在
区间的值,Matlab中可用下列表达式描述:
n=[n1:
n2];(2.2)
x=[(n-n0)>=0];(2.3)
2.2.2矩形序列
(2.4)
矩形序列有一个重要的参数,就是序列宽度N。
与
之间的关系为:
(2.5)
2.2.3实数指数序列
(2.6)
例如要实现序列
,Matlab中可用下列表达式描述:
n=[0:
10];(2.7)
x=(0.9).^n;(2.8)
2.2.4复数指数序列
复指数序列定义为
(2.9)
当
时,得到虚指数序列
,式中
是正弦序列的数字域频率。
由欧拉公式知,复指数序列可进一步表示为
(2.10)
与连续复指数信号一样,我们将复指数序列实部和虚部的波形分开讨论,得出如下结论:
(1)当
时,复指数序列
的实部和虚部分别是按指数规律增长的正弦振荡序列;
(2)当
时,复指数序列
的实部和虚部分别是按指数规律衰减的正弦振荡序列;
(3)当
时,复指数序列
即为虚指数序列,其实部和虚部分别是等幅的正弦振荡序列。
例如要实现序列
,Matlab中可用下列表达式描述:
n=[0:
10];(2.11)
x=exp((2+3j)*n);(2.12)
2.2.5周期序列
周期为N,长度为L(L=P*N)的周期序列
可视为信号
复制P次后产生的结果。
Matlab中可用下列两种方法表示:
法1:
法2:
%产生P列x;x是一个行向量
%长的列向量
%长的行向量
2.3序列的运算
2.3.1信号的加减
Matlab中可用算术运算符“+”和“-”分别实现序列的加法和减法运算,此时两序列的长度必须相等,否则需通过补零法改变信号的长度。
例:
序列x1(n)、x2(n),长度分别为n1和n2,其求和的Matlab代码为:
n=min(min(n1),min(n2)):
max(max(n1),max(n2));%y(n)的长度
y1=zeros(1,length(n));y2=y1;%初始化(产生1行*length(n)列的零值)
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;%具有y(n)的长度的x1
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;%具有y(n)的长度的x2
y=y1+y2;%序列相加
说明:
函数min(n)可获取向量n的最小值,函数max(n)则获取向量n的最大值。
函数length(n)可取得向量n的长度。
函数find((n>a)&(n
2.3.2信号的乘除
Matlab中两序列对应值的乘、除可分别采用点乘“.*”和点除“./”运算符,运算时两序列的长度需相等,具体处理方法和序列求和差时的一致。
例:
序列x1(n)、x2(n),长度分别为n1和n2,其求积的MATLAB代码为:
n=min(min(n1),min(n2)):
max(max(n1),max(n2));%y(n)的长度
y1=zeros(1,length(n));y2=y1;%初始化(产生1行*length(n)列的零值)
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;%具有y(n)的长度的x1
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;%具有y(n)的长度的x2
y=y1.*y2;%序列相乘
2.3.3移位
序列x(n)的移位操作不影响向量x,只需对向量n的每个元素加或减去一个移位值。
如移位序列y(n)=x(n-n0)等价为y(n+n0)=x(n),对应的Matlab语句为:
n=n+n0;(2.13)
y=x;(2.14)
2.3.4周期延拓
如果对于所有的n,序列
满足:
(2.15)
则
称为周期序列。
满足上述关系的最小N称为基本周期。
用Matlab把一个周期序列{x(n),0简单复制法:
设x是一个已赋值的行向量,其长度为N=length(x),把它复制K次,得到的x1长度为K*N。
因此有,x1=[X,X,„„X];nx1=0:
K*N-1。
这个方法在K太大时容易数错,不是很好。
余函数mod法:
函数n1=(nmodN)。
这个算式把大于等于N的n值,减去N的整倍数,使余数n1在0与N-1之间。
对于小于等于0的n值,则加以N的整倍数。
也使n1在0与N-1之间。
把这一运算用到位置向量上,就可以方便的实现有限序列的周期延拓。
先设置位置向量,要复制K个x,则新向量的长度应为K*N。
其中N为x的长度,也就是所取的周期。
假如起始位置为0,则可用下列语句:
nx1=0:
K*N-1;%设置延拓序列的位置向量
x1=x(mod(nx1,N)+1)%确定位置向量各点对应的x值
3课程设计内容
3.1题一
给出两个序列
和
,x1=[0,1,2,3,4,3,2,1,0];n1=[-2:
6];x2=[2,2,0,0,0,-2,-2],n2=[2:
8]。
试求它们的和及乘积。
3.1.1理论分析
序列相加指两个不同序列,在同一时刻n,对幅度进行叠加。
序列相乘指在同一时刻n,对不同的两个序列做幅度乘法运算。
序列相加、相乘是对应序列值之间的相加、相乘。
MATLAB中可以用符号“+”、“.*”来实现序列的相加、相乘,但是要求序列的长度必须相等,否则需要通过补零来改变序列的长度。
3.1.2程序编程
x1=[0,1,2,3,4,3,2,1,0];
n1=[-2:
6];
x2=[2,2,0,0,0,-2,-2];
n2=[2:
8];
n=min(min(n1),min(n2)):
max(max(n1),max(n2));
y1=zeros(1,length(n));
y2=y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;
y3=y1+y2;
y4=y1.*y2;
subplot(2,2,1),stem(n1,x1),axis([-5,10,0,5])
title('x1序列电信1306班陈雪燕'),xlabel('n1'),ylabel('x(n1)');
subplot(2,2,2),stem(n2,x2),axis([-5,10,-3,3])
title('x2序列'),xlabel('n2'),ylabel('x(n2)');
subplot(2,2,3),stem(n,y3),axis([-5,10,-3,7])
title('x1与x2的和'),xlabel('n'),ylabel('y3');
subplot(2,2,4),stem(n,y4),axis([-5,10,0,9])
title('x1与x2的乘积'),xlabel('n'),ylabel('y4');
3.1.3结果显示
图3.1题一的结果显示
3.1.4结果分析
序列x1和x2的长度是不同的,首先确定运算之后的长度,min(n)与max(n)函数可获取向量n的最小值和最大值,通过程序,可得序列范围为-2到8,再将原序列x1和x2变为具有新序列长度的x1和x2,最后,在进行序列的相加、相乘。
程序运行结果如图3.1所示。
3.2题二
编写产生矩形序列
的程序。
序列起点为
,矩形序列起点为
,长度为
(其中
由键盘输入),并用它截取一个复正弦序列
,最后画出波形。
3.2.1理论分析
首先,需要设计一个矩形序列,矩形序列与单位阶跃序列的关系为:
(3.1)
在MATLAB中可以通过逻辑关系表达式产生,其产生方式为:
x=(((n-n1)>=0)&((n-n2)<=0));其中n1,n2表示取值区间的范围,由这两个值可以确定该矩形序列的长度,公式为:
N=n2-n1+1(3.2)
第二,设计一个复正弦序列,对于序列
,在MATLAB中,可以用n=0:
10;alpha=(pi/8)*j;x=exp(alpha*n);来实现。
在本次设计中,将该复正弦序列的是不与虚部分开显示,便于观察。
第三,实现序列的截取,序列的合成与截取相当于序列的相加与相乘。
3.2.2矩形序列
3.2.2.1设计代码
%m-file,juxing
n0=input('输入序列起点n0=');
n1=input('输入矩形序列起点n1=');
N=input('输入矩形序列长度N=');
n=n0:
10;
x=[((n-n1)>=0)&((n-N-n1+1)<=0)];
stem(n,x),axis([0,10,0,1]);
title('矩形序列电信1306班陈雪燕');
3.2.2.2相关数据键入及结果
图3.2矩形序列相关数据的输入
根据设计要求,序列起点、矩形序列起点及长度要求键盘输入,所以利用input函数实现键盘输入,本段代码将主代码放倒M文件中,只需要进行调用即可获得所需的矩形序列。
矩形序列结果如下:
图3.3矩形序列展示
3.2.3复正弦序列
3.2.3.1设计代码
n=[0:
20];
alpha=(pi/8)*j;
x=exp(alpha*n);
real_x=real(x);
image_x=imag(x);
subplot(2,1,1),stem(n,real_x),axis([0,20,-2,2])
xlabel('n'),ylabel('real(x)');title('实部电信1306班陈雪燕');
subplot(2,1,2),stem(n,image_x),axis([0,20,-2,2])
xlabel('n'),ylabel('imag(x)');title('虚部');
3.2.3.2结果展示
图3.4复正弦序列结果展示
3.2.4用矩形序列截取复正弦序列
3.2.4.1设计代码
%m-file,jie
n0=input('输入序列起点n0=');
n1=input('输入矩形序列起点n1=');
N=input('输入矩形序列长度N=');
n=0:
20;
x1=[((n-n1)>=0)&((n-N-n1+1)<=0)];
alpha=(pi/8)*j;
x2=exp(alpha*n);
y=x1.*x2;
real_y=real(y);
image_y=imag(y);
subplot(2,1,1),stem(n,real_y),axis([0,20,-2,2])
title('实部电信1306班陈雪燕');
subplot(2,1,2),stem(n,image_y),axis([0,20,-2,2])
title('虚部');
3.2.4.2相关数据键入及结果
图3.5序列的相关数据的输入
图3.6截取后的最终波形展示
3.2.5结果分析
由实验结果可知,矩形序列范围为3到7,所截取之后的结果也变为了3到7,序列的截取相当于序列相乘,在代码中,是通过相乘来实现截取的。
3.3题三
已知
,利用MATLAB生成并图示
表示
以8周期的延拓)和
,其中
,
为一个整常数,
。
3.3.1理论分析
序列x(n)的移位操作不影响x的值,只需要对向量进行加、减运算,就可以实现对序列的移位操作。
序列的周期延拓就是将某个区间上的序列拓展到整个区间上,在本次设计中,因为原序列长度为8,而又是以8为周期进行周期延拓,所以不会发生重叠现象。
3.3.2sigshift函数的定义
图3.7sigshift函数的定义
3.3.3x(n)和x(n-m)的程序代码及图示
n=0:
10;
N=8;
x1=[((n)>=0)&((n-N+1)<=0)];
x2=0.8.^n;
y=x1.*x2;
m=5;
[y1,n1]=sigshift(y,n,m);
subplot(1,2,1),stem(n,y),axis([0,10,0,1])
xlabel('n'),ylabel('y'),title('x(n)电信1306班陈雪燕');
subplot(1,2,2),stem(n1,y1),axis([0,15,0,1])
xlabel('n1'),ylabel('y1'),title('x(n-m)m=5');
因为MATLAB中没有移位函数,所以需要先用M文件编写移位函数,只需要在主代码中直接调用移位函数即可实现移位。
设计结果如下:
图3.8x(n)和x(n-m)的生成图示
3.3.4
的生成程序及图示
序列的周期延拓就是将某个区间上的序列拓展到整个区间上,y=x(mod(n,m)+1)可以实现对序列以m为周期的周期延拓,加1是因为MATLAB向量下标从1开始。
原序列进行周期延拓代码及结果:
n=0:
25;
N1=8;
x1=[((n)>=0)&((n-N1+1)<=0)];
x2=0.8.^n;
y=x2.*x1;
y1=y(mod(n,8)+1);
N2=24;
y2=[((n)>=0)&((n-N2+1)<=0)];
y3=y1.*y2;
subplot(2,2,1),stem(n,y),axis([0,25,0,1])
xlabel('n'),ylabel('y'),title('原序列电信1306班陈雪燕');
subplot(2,2,2),stem(n,y1),axis([0,25,0,1])
xlabel('n'),ylabel('y1'),title('周期延拓序列');
subplot(2,2,3),stem(n,y2),axis([0,25,0,1])
xlabel('n'),ylabel('y2'),title('矩形序列N=24');
subplot(2,2,4),stem(n,y3),axis([0,25,0,1])
xlabel('n'),ylabel('y3'),title('最终结果');
图3.9
的生成图示
3.3.5
的生成程序及图示
n=0:
25;
N1=8;
x1=[((n)>=0)&((n-N1+1)<=0)];
x2=0.8.^n;
y=x1.*x2;
m=6;
[y1,n1]=sigshift(y,n,m);
y2=y1(mod(n-m,8)+1);
N2=24;
y3=[((n)>=0)&((n-N2+1)<=0)];
y4=y2.*y3;
subplot(2,2,1),stem(n1,y1),axis([0,25,0,1])
xlabel('n1'),ylabel('y1'),title('x(n-m)电信1306班陈雪燕');
subplot(2,2,2),stem(n,y2),axis([0,25,0,1])
xlabel('n'),ylabel('y2'),title('周期延拓序列');
subplot(2,2,3),stem(n,y3),axis([0,25,0,1])
xlabel('n'),ylabel('y3'),title('矩形序列N=24');
subplot(2,2,4),stem(n,y4),axis([0,25,0,1])
xlabel('n'),ylabel('y4'),title('最终结果');
图3.10
的生成图示
3.3.6结果分析
4.心得体会
经历了一个星期的查阅资料和理论分析,终于完成了信号分析与处理课程设计的编程和报告。
经历了这次课程设计,大大的提高了我的操作能力以及分析问题的能力,从中也学到了很多书面上所没有搞清楚的问题,也熟悉了应用Matlab这个软件来进行程序编程。
通过这次课程设计,我学到了很多有用的知识,并加强了自己掌握和理解书本知识的能力,培养了自己的实际动手能力与综合设计能力,提高了自己的技术素质。
这对以后的学习和工作都是非常有益的。
我对离散时间信号的运算以及编程实现有了深入了解,离散时间信号的运算包括序列相加,序列相乘,数乘运算,差分运算,累加运算,位移运算,反褶运算,重排运算,卷积和运算等,本次课程设计主要对其中的序列相加、相乘,序列合成与截取,序列移位以及周期延拓进行了原理分析与Matlab实现。
当要进行序列的运算时,还需要了解一些常见的典型序列,例如单位采样序列,单位阶跃序列,矩形序列,实指数序列,复指数序列等相关序列。
通过本次课程设计,深入了解了相关离散时间信号运算的原理,同时,还学会了这些运算的Matlab实现方法。
在课程设计的过程中,尤其是进行Matlab实现时,有很多地方不明白,例如如何实现周期延拓,通过查找资料找到了几种方法,从而挑选了一种比较容易达到目标的方法来使用。
总之,通过这次课程设计我有了很多收获。
摸索该如何使用Matlab去实现题目要求的过程特别有趣,培养了我的设计思维。
在编程的过程中,同学们共同探讨,并从中体会到了Matlab的强大功能,以后我还得深入学习Matlab,并在以后的专业学习中去很好地应用它;更让我体会到成功的喜悦和快乐。
5.参考文献
[1]张志涌等.精通MATLABR2011a.北京航空航天大学出版社,2011.11.
[2]张琨.MATLAB2010从入门到精通.电子工业出版社,2011.
[3]亨赛尔.精通MATLAB7.北京清华大学出版社,2010.
[4]王正林,刘明.精通MATLAB(升级版).电子工业出版社,2011.
[5]薛山.MATLAB基础教程.清华大学出版社,2011.3.
[6]王亚芳,董楠编.MATLAB仿真及电子信息应用.北京:
人民邮电出版社,2011.
本科生课程设计成绩评定表
姓名
性别
女
专业、班级
电信1306班
课程设计题目:
离散时间信号的运算及其编程实现
课程设计答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
2016年月日