离散时间信号分析课设.docx
《离散时间信号分析课设.docx》由会员分享,可在线阅读,更多相关《离散时间信号分析课设.docx(13页珍藏版)》请在冰豆网上搜索。
离散时间信号分析课设
摘要
离散时间信号是指信号在时间上是离散的,只在某些不连续的时刻给出信号的值,而其它时间则没有定义。
为了便于数字系统的接受、处理,需要对信号进行数字化处理,即出现了时间上离散,幅度上量化的信号。
在离散时间系统中,信号用序列表示。
有一些常见的典型序列,我们时刻都需要用到,同时需要掌握的还有序列的一些运算。
MATLAB在数值计算、符号运算、数据可视化、数字文件图形处理等方面有杰出优势,所以,我们需要了解常见序列的MATLAB实现,以及序列运算的MATLAB实现。
关键词:
离散时间信号,序列运算,编程实现
Abstract
Referstoadiscretetimesignalisdiscreteintime,andonlyinthemomentofsomediscretesignalvalueisgiven,andtheothertimeisnotdefined.Tofacilitatetheacceptanceofdigitalsystem,theprocessing,theneedfordigitalsignalprocessing,namelyadiscretetime,amplitudequantizationofthesignal.Indiscretetimesystem,thesignalisrepresentedbysequence.Therearesomecommontypicalsequence,weallneedtime,atthesametimealsoneedtoknowsomeoftheoperationsequence.Innumericalcalculation,MATLABsymbolicoperation,datavisualization,digitalfiles,graphics,etc,hasoutstandingadvantages,therefore,weneedtounderstandthecommonsequenceofMATLAB,andthesequenceofoperationofMATLAB.
Keywords:
discrete-timesignal,Sequenceofoperations,programmingrealization
1离散时间信号及MATLAB表示
1.1离散时间信号
在离散时间系统中,信号要用序列来表示,其特点是:
时间离散,幅值连续。
离散时间信号通常由对连续时间信号进行抽样获得。
离散时间信号表示方法有3种:
列表法、函数表示法、线图法。
1.2离散时间信号的MATLAB表示
一个序列有两个要素:
样值和位置。
在MATLAB中用样值向量和位置向量来表示一个序列。
要求两个向量长度相等。
例如:
,其MATLAB产生语句为:
n=0:
3;X=[5,6,7,8];
1.3常用的典型序列
(1)单位阶跃序列
单位阶跃序列定义如下:
。
在MATLAB中,可以用逻辑关系表达式产生,在
区间范围内,其产生方式为:
n=n1:
n2;x=((n-n0)>=0)
(2)矩形序列
矩形序列定义如下:
。
其中,N为矩形序列的长度。
它与单位阶跃序列的关系为
。
在MATLAB中,同样可以用逻辑关系表达式产生,其产生方式为:
x=(((n-n1)>=0)&((n-n2)<=0));其中n1,n2表示取值区间的范围,由这两个值可以确定该矩形序列的长度,公式为N=n2-n1+1。
(3)实指数序列
实指数序列定义为
,式中a为实数。
当
时,上式可表示为
。
例如
,
在MATLAB中可以用n=0:
10;x=0.8.^n;产生。
(4)复数指数序列
复数指数序列定义为
,式中
为数字域频率。
复指数序列换可以表示为:
。
例如,对于序列
,在MATLA中,可以用n=0:
10;alpha=(pi/8)*j;x=exp(alpha*n);来实现。
2程序设计
2.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]。
试求它们的和及乘积。
2.1.1原理分析
序列相加指两个不同序列,在同一时刻n,对幅度进行叠加。
序列相乘指在同一时刻n,对不同的两个序列做幅度乘法运算。
序列相加、相乘是对应序列值之间的相加、相乘。
MATLAB中可以用符号“+”、“.*”来实现序列的相加、相乘,但是要求序列的长度必须相等,否则需要通过补零来改变序列的长度。
2.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));%生成1行n列的矩阵
y2=y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;%具有新长度的序列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([-6,10,0,5]),
title('x1序列'),xlabel('n1'),ylabel('x(n1)');
subplot(2,2,2),stem(n2,x2),axis([-6,10,-3,3]),
title('x2序列'),xlabel('n2'),ylabel('x(n2)');
subplot(2,2,3),stem(n,y3),axis([-6,10,-3,7]),
title('x1与x2的和'),xlabel('n'),ylabel('y3');
subplot(2,2,4),stem(n,y4),axis([-6,10,0,9]),
title('x1与x2的乘积'),xlabel('n'),ylabel('y4');
序列x1和x2的长度是不同的,首先确定运算之后的长度,min(n)与max(n)函数可获取向量n的最小值和最大值,通过程序,可得序列范围为-2到8,再将原序列x1和x2变为具有新序列长度的x1和x2,最后,在进行序列的相加、相乘。
程序运行结果如下图:
图2.1序列相加、相乘
2.2序列的合成和截取
编写产生矩形序列
的程序。
序列起点为
,矩形序列起点为
,长度为
(其中
由键盘输入),并用它截取一个复正弦序列
,最后画出波形。
2.2.1原理分析
首先,需要设计一个矩形序列,矩形序列与单位阶跃序列的关系为
,
在MATLAB中可以通过逻辑关系表达式产生,其产生方式为:
x=(((n-n1)>=0)&((n-n2)<=0));其中n1,n2表示取值区间的范围,由这两个值可以确定该矩形序列的长度,公式为N=n2-n1+1。
第二,设计一个复正弦序列,
对于序列
,在MATLAB中,可以用n=0:
10;alpha=(pi/8)*j;x=exp(alpha*n);来实现。
在本次设计中,将该复正弦序列的是不与虚部分开显示,便于观察。
第三,实现序列的截取,序列的合成与截取相当于序列的相加与相乘。
2.2.2程序代码与结果
矩形序列设计代码如下:
%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('矩形序列');
juxing
输入序列起点n0=0
输入矩形序列起点n1=1
输入矩形序列长度N=8
根据设计要求,序列起点、矩形序列起点及长度要求键盘输入,所以利用input函数实现键盘输入,本段代码将主代码放倒M文件中,只需要进行调用即可获得所需的矩形序列。
矩形序列结果如下:
图2.2矩形序列
复正弦序列代码及结果如下:
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('实部');
subplot(2,1,2),stem(n,image_x),axis([0,20,-2,2]),xlabel('n'),
ylabel('imag(x)'),title('虚部');
图2.3复正弦序列
用矩形序列截取复正弦序列代码级结果如下:
%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('实部');
subplot(2,1,2),stem(n,image_y),axis([0,20,-2,2]),title('虚部');
jie
输入序列起点n0=0
输入矩形序列起点n1=1
输入矩形序列长度N=8
图2.4序列截取之后结果
由实验结果可知,矩形序列范围为0到8,所截取之后的结果也变为了0到8,序列的截取相当于序列相乘,在代码中,是通过相乘来实现截取的。
2.3序列的移位和周期延拓
已知
,利用MATLAB生成并图示
表示
以8周期的延拓)和
,其中
,
为一个整常数,
。
2.3.1设计原理
序列
的移位操作不影响x的值,只需要对向量进行加、减运算,就可以实现对序列的移位操作。
序列的周期延拓就是将某个区间上的序列拓展到整个区间上,在本次设计中,因为原序列长度为8,而又是以8为周期进行周期延拓,所以不会发生重叠现象。
2.3.2程序代码及结果
程序代码如下:
function[y,n]=sigshift(x,m,n0)
n=m+n0;
y=x;
n=0:
10;
N=8;
x1=[((n)>=0)&((n-N+1)<=0)];
x2=0.8.^n;
y=x1.*x2;
m=6;
[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)');
subplot(1,2,2),stem(n1,y1),axis([0,15,0,1]),xlabel('n1'),
ylabel('y1'),title('x(n-m)m=6');
因为MATLAB中没有异味函数,所以需要先用M文件编写移位函数,只需要在主代码中直接调用移位函数即可实现移位。
设计结果如下:
图2.5原序列与移位后序列
序列的周期延拓就是将某个区间上的序列拓展到整个区间上,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;
x3=[((n)>=0)&((n-N2+1)<=0)];
y2=y1.*x3;
subplot(3,1,1),stem(n,y),axis([0,25,0,1]),xlabel('n'),
ylabel('y'),title('原序列');
subplot(3,1,2),stem(n,y1),axis([0,25,0,1]),xlabel('n'),
ylabel('y1'),title('周期延拓序列');
subplot(3,1,3),stem(n,y2),axis([0,25,0,1]),xlabel('n'),
ylabel('y2'),title('最终结果');
图2.6原序列与周期延拓序列
移位后序列进行周期延拓及结果:
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;
x2=[((n)>=0)&((n-N2+1)<=0)];
y3=y2.*x2;
subplot(3,1,1),stem(n1,y1),axis([0,25,0,1]),xlabel('n1'),
ylabel('y1'),title('移位后序列');
subplot(3,1,2),stem(n,y2),axis([0,25,0,1]),xlabel('n'),
ylabel('y2'),title('周期延拓序列');
subplot(3,1,3),stem(n,y3),axis([0,25,0,1]),xlabel('n'),
ylabel('y3'),title('最终结果');
图2.7移位后序列与其周期延拓序列
3.心得体会
经过这一次的信号分析与处理课程设计,我对离散时间信号的运算以及编程实现有了深入了解。
离散时间信号的运算包括序列相加,序列相乘,数乘运算,差分运算,累加运算,位移运算,反褶运算,重排运算,卷积和运算等,本次课程设计主要对其中的序列相加、相乘,序列合成与截取,序列移位以及周期延拓进行了原理分析与MATLAB实现。
当要进行序列的运算时,还需要了解一些常见的典型序列,例如单位采样序列,单位阶跃序列,矩形序列,实指数序列,复指数序列等相关序列。
通过本次课程设计,深入了解了相关离散时间信号运算的原理,同时,还学会了这些运算的MATLAB实现方法。
在课程设计的过程中,尤其是进行MATLAB实现时,有很多地方不明白,例如如何实现周期延拓,通过查找资料找到了几种方法,从而挑选了一种比较容易达到目标的方法来使用。
课程设计,让我们学会了思考问题,不单单是依靠课本知识,还需要联系实际,我们在课程设计的过程中,发现问题,并找出问题的原因,还需要自己动手将问题解决,这极大的调动了我们的积极性,扩展了我们的思维,对待出现的问题,我们学会了不逃避,而是努力将其解决,这对我们今后的学习生活有着重大影响。
这次课程设计,我收获很大,提高了我遇到问题解决问题的能力,加强了与同学就学习问题的交流讨论,加强了自己的动手能力,明白了团队合作的作用,同时也认识到了自己不足,最重要的是认识到了光有理论知识是远远不够的,理论需要结合实践才能发挥最大的作用。
这些问题的暴露让我知道了以后努力的方向,在加强理论学习的基础上,提高自己思考问题、解决问题的能力,提高自己动手实践的能力。
参考文献
[1]刘泉,阙大顺,郭志强.数字信号处理.北京:
电子工业出版社,2009.
[2]刘泉,江雪梅.信号与系统.北京:
高等教育出版社,2006.
[3]史林,赵树杰.数字信号处理.北京:
科学出版社,2007.
[4]陈佩青.数字信号处理教程.北京:
清华大学出版社,2007.
[5]王亚芳,董楠编.MATLAB仿真及电子信息应用.北京:
人民邮电出版社,2011.