目录
一、实验名称
序列运算的matlab实现。
二、实验器材
安装有matlab软件的电脑、《数字信号处理教程》课本。
三、实验目的
1. 了解复指数序列和它延扩周期得到的序列的图形和实现方法,并掌握matlab产生常用离散时间信号的编程方法;
2. 了解length函数、find函数和mod函数的用法,并能够在实验时很好的实现序列。
四、实验原理
1.常用序列的matlab实现
(1)随机序列。
当序列的取值不能用确定的数学表达式来描述时,这种序列就称为随机序列,MATLAB中,有两种随机序列(实际是伪随机序列)可供调用。
rand:此函数产生均值为0.5,幅度在0~1之间均匀分布的随机序列。调用格式是rand(1,N)或rand(NXM),前者产生N点随机序列,后者产生NXM随机矩阵。
randn:此函数产生均值为0,方差为1,服从正态(高斯)分布的白噪声序列。调用格式同上,有randn(1,N)和randn(NXM)两种,解释同上。
(2)周期序列。
设x(n),0<n<N-1,MATLAB可利用xtide(n)把它拓展成K个周期的周期序列,有两种办法。
①简单复制。
即原x(n)长度为N=length(x),复制K次得到xtide长度为K*N,但K太大时容易出错。
②用求余数的方法(模运算)。
函数n1=mode(n.N)完成模运算nl=(n,mod,N)=((n)),即完成nl=n+KN,0<nl<N-1,K整数,即余数n1在0到N-1之间。把这一运算用到位置向量上,
就可实现有限长序列的周期延拓。
设x的起始位置为0,长度为N可用以下语句:
nxtide=0:K·N-1;
xtide=x(mod(nxtide,N)+1);
第二条语句中,由于mod(nxtide,N)的值永远在0到N-1之间,而MATLAB的规则是x的下标为nx=[1:N],故上面的后一条语句(即第二条语句)中必须把mod函数的结果加1才对。
2. 序列运算的MATLAB实现。
(1)序列之和。
将两序列x1、x2位置序号相同的样值相加,必须使x1、x2的位置向量的
起点、终点相同,因而序列的长度相同,故有可能要补“零值”。
首先,使x1、x2有同样的位置向量,因而要注意MATLAB的下标运算,将
x1的位置向量n1及x2的位置向量n2都变成相同的位置向量n,显然,min(n)应等于min(nl)和min(n2)中的小者。max(n)应等于max(nl)和max(n2)中的大者。随后,将x1及x2放到扩展后的位置向量n上,由于n比n1、n2都可能长,故应将x1、x2长度加长,加长后分别用y1,y2表示,即将x1、x2放到位置向量n的对应位置上,将多余之处的元素置零。
(2)序列之积。
将函数命名为seqmult,将函数的头语句改为function [y,n]=seqmult(x1,x2,n1,n2), 且将上面的第六行换成y=y1*y2,则得到序列的乘积运算。可以看出在一些情况下,序列的位置向量对序列的运算起着重要作用。
五、实验内容及结果
编制程序使用matlab实现复指数序列、延扩周期序列和两序列之和与之积的正确结果和产生图形。
(一)实验一:用编程产生下列复指数序列x(n)=e^[(aj-b)n],其中-1<=n<=10,a=0.4,b=0.6。
1.实验代码
%复指数序列1
n=0:10; %定义n的范围
x=exp((0.4*j-0.6)*n);
%产生实部图像
subplot(2,1,1); %定义图像窗口为2x1(2行1列),坐标为(1,1)(第一行第一列)
stem(n,real(x),'b.'); %绘制实部离散图像,并设置线为b(蓝色)点线型
axis([-1,10,min(real(x))-0.1,1.2*max(real(x))]); %定义图像1的横轴、纵轴范围
title('复指数序列实部图像'); %对图像主题的说明
xlabel('n'); %对横轴进行说明
ylabel('real(x)'); %对纵轴进行说明
grid on; %打开图像网格
%产生虚部图像
subplot(2,1,2); %定义图像窗口为2x2(2行2列),坐标为(2,1)(第二行第一列)
stem(n,imag(x),'m.'); %绘制虚部离散图像,并设置线为m(洋红色)点线型
axis([-1,10,min(imag(x))-0.1,1.3*max(imag(x))]); %定义图像2的横轴、纵轴范围
title('复指数序列虚部图像'); %对图像主题的说明
xlabel('n'); %对横轴进行说明
ylabel('imag(x)'); %对纵轴进行说明
grid on; %打开图像网格
2.实验结果
(二)实验二:x(n)=[1,2,3,4],求它延后5个周期所得到的序列。
1.实验代码
%周期序列
x=[1,2,3,4];
N=length(x);
k=5;
nx=0:N-1;
ny=0:(k*N-1);
y=x(mod(ny,N)+1);
subplot(2,1,1); %定义图像窗口为2x1(2行1列),坐标为(1,1)(第一行第一列)
stem(nx,x,'m.'); %绘制离散图像,并设置线为m(洋红色)点线型
axis([-1,N,0,5]); %定义图像1的横轴、纵轴范围
title('周期序列'); %对图像主题的说明
xlabel('nx'); %对横轴进行说明
ylabel('x'); %对纵轴进行说明
grid on; %打开图像网格
subplot(2,1,2); %定义图像窗口为2x2(2行2列),坐标为(2,1)(第二行第一列)
stem(ny,y,'r.'); %绘制离散图像,并设置线为r(红色)点线型
axis([-1,k*N,0,5]); %定义图像2的横轴、纵轴范围
title('周期序列'); %对图像主题的说明
xlabel('ny'); %对横轴进行说明
ylabel('y'); %对纵轴进行说明
grid on; %打开图像网格
2.实验结果
(三)实验三:已知两个序列为x1(n)=[1,3,5,7,6,4,2,1],起始位置为ns1=-3,x2(n)=[4,0,2,1,-1,3],起始位置为ns2=1,求它们的和ya和乘积yb。
1.实验代码
%序列的matlab实现
x1=[1,3,5,7,6,4,2,1],ns1=-3; %给定x1和它的起始点位置ns1
x2=[4,0,2,1,-1,3],ns2=1; %给定x2和它的起始点位置ns2
nf1=ns1+length(x1)-1; %求出x1的终点位置nf1
nf2=ns2+length(x2)-1; %求出x1的终点位置nf1
n1=ns1:nf1,n2=ns2:nf2; %定义n1和n2的范围
n=min(ns1,ns2):max(nf1,nf2); %定义n的范围
y1=zeros(1,length(n)); %y向量初始化为零
y2=y1; %y1,y2序列的初始化
y1(find((n>=ns1)&(n<=nf1)==1))=x1; %给y1赋值x1
y2(find((n>=ns2)&(n<=nf2)==1))=x2; %给y2赋值x2
ya=y1+y2,yb=y1.*y2; %序列的相加和相乘
subplot(2,2,1),stem(n1,x1,'b.'),title('序列x1(n)'),xlabel('n1'),ylabel('x1'),grid on;
subplot(2,2,2),stem(n2,x2,'r.'),title('序列x2(n)'),xlabel('n2'),ylabel('x2'),grid on;
subplot(2,2,3),stem(n,ya,'m.'),title('序列ya'),xlabel('n'),ylabel('ya'),grid on;
subplot(2,2,4),stem(n,yb,'k.'),title('序列yb'),xlabel('n'),ylabel('xb'),grid on;
2.实验结果
六、实验收获
通过本次实验,我有了许多的收获,主要学会了产生复指数序列的实部和虚部的方法、延扩周期后的序列、两序列之和与之积的方法,以及一些相关函数的用法:real函数、imag函数mod函数、length函数、find函数,还有一些关于自身素质修养:自己的垃圾必须要带走,爱护公共设施(电脑、鼠标等),与同学互相帮助,谦虚学习。
总之,只要积极主动、细心、有耐心,注意理论联系实际、多做多学多问,就会有进步,就会学到更多知识。