数字信号处理实验讲义Word文档下载推荐.docx
《数字信号处理实验讲义Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字信号处理实验讲义Word文档下载推荐.docx(62页珍藏版)》请在冰豆网上搜索。
在线帮助。
语法格式为
Helptopictopic为要取得的帮助主题。
例如:
helpfft将显示fft()函数的说明。
3.编写MATLAB程序:
MATLAB的程序以.M结尾,你可以使用MATLAB窗口中File--NewM--file的菜单命令来建立一个.m空白文件,编写完成后,你保存一下,然后可以在MATLAB窗口中敲此文件名执行该文件。
函数编写
script编写
4.常用的MATLAB命令归类:
通用命令:
Help在线帮助
Demo例程演示
Path路径设置
Who列出当前变量
What列出当前路径下的.m文件
Clear清除所有变量
Clc清除当前命令窗口命令
Clf清除当前图形
Quit退出MATLAB
运算符:
加法:
+
减法:
—
乘法:
*
点乘:
.*
指数:
.^
除法:
\
点除:
.\
关系运算符:
小于<
大于>
小于等于<
=大于等于>
=等于==不等于~=
基本矩阵
zeros零阵ones1阵
信号运算
abs取模值
angle相角
real实部
imag虚部
conv卷积
fft快速傅立叶变换
ifft快速傅立叶反变换
图形函数
figure生成一图框
axis设置坐标轴
hold保持原图
text在图上标记文字
gtext通过鼠标点击方式在图上标记文字
plot画图
subplot子图
title添加图名
xlabel给X轴增加文本标注
ylabel给Y轴增加文本标注
grid设置网格线
stem离散序列数据杆状图
bar条形图
polar极坐标
实验二离散时间信号分析
实验目的:
通过Matlab实现基本信号的表示和运算。
理解信号的构成和性质。
1.学习使用基本信号在Matlab中的基本表示方法。
2.了解本实验中的扩展函数的结构和组成,实现自己设计的扩展函数的编程:
(1)写一新的卷积函数conv_m,它可求出带下标的序列卷积。
(2)修改给出的evenodd函数,使他能接受任意序列并把它分解成共轭对称分量和共轭反对称分量。
3.掌握复杂信号的表示方法;
并对复杂信号进行编程实现。
(1)产生下列序列并绘出离散图:
(a).x(n)=2δ(n+2)-δ(n-4)-5≤n≤5
(b)x(n)=n[u(n)-u(n-10)]+10e-0.3(n-10)[u(n-10)-u(n-2)]0≤n≤20
(c)x(n)=cos(0.04πn)+0.2w(n)0≤n≤50
其中w(n)是均值为零、方差为1的白噪声序列
(d)
(n)=[x1x1x1x1],其中x1=[54321]
(e)已知x(n)=u(n)-u(n-10),要求将它分解成奇偶序列。
(2)用Matlab产生一矩形脉冲串,连续时间为2s,脉冲个数为10,并绘制其波形图。
4.掌握复序列x(n)的实部、虚部、幅值和相位离散图,并编程实现。
产生复信号:
x(n)=e(-0.1+j0.3)n-10≤n≤10
并画出复序列x(n)的实部、虚部、幅值和相位离散图。
一.离散信号
在数字信号处理(DSP)中,所有的信号都是离散(时间)信号,因此首先应解决在MATLAB中如何表示离散信号。
设一模拟信号经A/D变换后,得到序列信号
x(n)={x(n)}={…,x(-1),x(0),x
(1),…}
由于MATLAB对下标的约定为从1开始递增,因此要表示x(n),一般应采用两个矢量,如:
n=[-3,-2,-1,0,1,2,3,4,5]
y=[1,-1,3,2,0,4,5,2,1]
这表示了一个含9个采样点的矢量:
y(n)={x(-3),x(-2),x(-1),x(0),x
(1),…x(5)}。
通常情况下,序列值从x(0)开始,因此一个N点序列x(n)={x(0),x
(1),…,x(N-1)}可简单地表示成
y=[x(0),x
(1),…,x(N-1)]
这时y的下标为1~N。
二.基本信号表示
1.单位取样序列
这一函数可利用MATLAB的zeros函数实现:
x=zeros(1,N);
x
(1)=1
还可以借助于关系操作符实现:
n=1:
N;
x=[n==1];
如要产生
则可采用MATLAB实现:
n=n1:
n2;
x=[(n-n0)==0];
2.单位阶跃序列
这一函数可利用MATLAB的ones函数实现:
x=ones(1,N);
还借助于关系操作符“>
=”来实现。
如要产生在n1≤n0≤n2上的单位阶跃序列
则可采用MATLAB实现:
n=n1:
x=[(n-n0)>
=0];
3.实指数序列
x(n)=an
采用MATLAB实现:
n=0:
N-1;
x=a.^n;
4.复指数序列
采用MATBLAB实现:
x=exp((lu+j*w0)*n);
5.正(余)弦序列
x=cos(w0*n+Q);
6.随机序列
MATLAB中提供了两类(伪)随机信号:
rand(1,N)产生[0,1]上均匀分布的随机矢量;
randn(1,N)产生均值为0,方差为1的高斯随机序列,也就是白噪声序列。
其它分布的随机数可通过上述随机数的变换而产生。
7.周期序列
x(n)=x(n+N)
例如,设x1表示x序列中一个周期的序列,要产生P个周期的x序列,可以把它重复4次,用MALAB实现:
x=[x1,x1,x1,…..,x1];
但是高明的方法是利用MATLAB的强有力的下标能力。
先产生一个包含P行x(n)
值的矩阵,然后用结构(:
)把它的P行串接起来成为一个长行,不过这种结构只能用于列向,所以我们往往还要用矩阵转置把它扩展成行向。
>
xtilde=x1’*ones(1,P);
%P列x1
xtilde=xtilde(:
);
%长的列向量
xtilde=xtilde’;
%长的行向量
三.序列操作
1.信号加
x(n)={x1(n)+x2(n)}
x=x1+x2;
注意:
当x1和x2序列的长度不等或其位置不对应时,信号相加就不是这么简单。
首先应使x1、x2具有相等的长度,然后两者对齐,最后进行相加。
2.信号乘
x(n)={x1(n)*x2(n)}
这是一种样本对样本的相乘,也即点乘运算,在MATLAB中可采用.*(数组乘法)来实现,但两序列x1、x2也应经过处理。
3.改变比例
y(n)=a{x(n)}={ax(n)}
y=alpha*x;
4.移位
y(n)={x(n-k)}
5.折叠
y(n)={x(-n)}
它将序列x(n)在n=0处倒转,在MATLAB中可直接用fliplr函数实现。
6.取样和
它不同于信号加。
采用MATLAB实现:
y=sum(x(n1:
n2));
7.取样积
y=prod(x(n1:
8.卷积和
y(n)=x(n)*h(n)=
可直接采用MATLAB中的函数conv,即
y=conv(x,h);
它默认序列从n=0开始。
但如果序列是从一负值开始,即如
{x(n):
nxb≤n≤nxe}
{h(n):
nhb≤n≤nhe}
其中nxb<
0或nhb<
0,或两者同时为负时,就不能直接采用conv函数。
通过卷积结果序列{y(n):
nyb≤n≤nye}
且nyb=nxb+nhb,nye=nxe+nhe
这样我们就可以构成一新的卷积函数conv_m,它可求出带下标的序列卷积。
9.信号能量
Px=sum(abs(x).^2);
Px=sum(x.*conj(x));
10.奇偶综合
任何一个序列x(n)都可分解成偶对称部分xe(n)和奇对称部分x0(n),即
x(n)=xe(n)+x0(n)
其中
xe(n)=
{x(n)+x(-n)}
x0(n)=
{x(n)-x(-n)}
这样我们可以设计一函数evenodd,完成将任一给定序列x(n)分解成xe(n)和x0(n)。
四.MATLAB信号生成函数
1.square()方波发生器。
调用格式为:
square(T)返回一周期为2π的方波,采样时刻由向量T指定。
square(T,DUTY)产生一给定占空比的方波,占空比DUTY是信号为正
值的比例。
2.sawtooth()锯齿波和方波发生器。
sawtooth(T)返回一周期为2π的锯齿波,采样时刻由向量T指定。
sawtooth(T,WIDTH)产生一三角波,WIDTH指定最大值出现的地方,其取值在0到1之间,1对应2π。
3.diric()周期sinc函数(Dirichlet函数)。
调用格式:
Y=diric(X,N)返回一大小与X相同的矩阵,其元素为Dirichlet函数。
N必须为正整数,该函数将0到2π等间隔分成N等分。
4.pulstran()通过对连续函数或脉冲原型进行采样而得到脉冲序列的发生器
5.rectplus()非周期矩形波发生器
6.tripuls()非周期三角脉冲发生器
五.MATLAB七个基本的扩展函数
1.单位取样序列
impseq.m
function[x,n]=impseq(n0,n1,n2)
%Generatesx(n)=delta(n-n0);
n1<
=n,n0<
-n2
%------------------------------
%[x,n]=impseq(n0,n1,n2)
%
if((n0<
n1)|(n0>
n2)|(n1>
n2))
error(ˊargumentsmustsatisfyn1<
=n0<
=n2ˊ)
end
n=[n1:
n2];
x=[(n-n0)==0];
stepseq.m
function[x,n]=stepseq(n0,n1,n2)
%Generatesx(n)=u(n0);
=n2
%--------------------------
%[x,n]=stepseq(n0,n1,n2)
x=[(n-n0)>
3.信号加
sigadd.m
function[y,n]=sigadd(x1,n1,x2,n2)
%implementsy(n)=x1(n)+x2(n)
%--------------------------------
%[y,n]=sigadd(x1,n1,x2,n2)
%y=sumsequenceovern,whichincludesn1andn2
%x1=firstsequenceovern1
%x2=secondsequenceovern2(n2canbedifferentfromn1)
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))&
=max(n2))==1))=x2;
y=y1+y2
4.信号乘
sigmult.m
function[y,n]=sigmult(x1,n1,x2,n2)
%implementsy(n)=x1(n)*x2(n)
%----------------------------------
%[y,n]=sigmult(x1,n1,x2,n2)
%y=productsequenceovern,whichincludesn1andn2
y1(find((n>
=min(n1))&
=max(n1))==1))=x1;
y=y1.*y2
5.移位
sigshift.m
function[y,n]=sigshift(x,m,n0)
%implementsy(n)=x(n-n0)
%[y,n]=sigshift(x,m,n0)
n=m+n0;
y=x;
6.折叠
sigfold.m
function[y,n]=sigfold(x,n)
%implementsy(n)=x(-n)
%---------------------------
%[y,n]=sigsfold(x,n)
y=fliplr(x);
n=-fliplr(n);
7奇偶综合
evenodd.m
function[xe,xo,m]=evenodd(x,n)
%Realsignaldecompositionintoevenandoddparts
%[xe,xo,m]=evenodd(x,n)
ifany(imag(x)=0)
error(ˊxisnotarealsequenceˊ)
m=-fliplr(n);
m1=min([m,n]);
m2=max([m,n]);
m=m1:
m2;
nm=n
(1)-m
(1);
n1=1:
length(n);
x1=zeros(1,length(m));
x1(n1+nm)=x;
x=x1;
xe=0.5*(x+fliplr(x));
xo=0.5*(x-fliplr(x));
【例2-1】实验任务3.
(1)产生下列序列并绘出离散图:
x(n)=2δ(n+2)-δ(n-4)-5≤n≤5
解:
利用MATLAB及信号处理工具箱函数,再加上前面构造的几个函数如sigadd,sigmult等,可很容易编写出可直接执行的MATLAB程序ex31.m:
%Example3.1
%a)x(n)=2*delta(n+2)-delta(n-4),-5<
=n<
=5
%figure
(1);
clf
n=[-5:
5];
x=2*impseq(-2,-5,5)-impseq(4,-5,5);
subplot(2,2,1);
stem(n,x);
title(′SequenceinExample3.1a′);
【例2-2】设线性时不变(LTI)系统的单位冲激响应为
h(n)=(0.9)nu(n)
输入序列为
x(n)=u(n)-u(n-10)
求系统输出y(n)。
系统输出y(n)为输入x(n)与系统单位冲激响应h(n)的卷积,可直接采用conv-m函数求出输出序列。
MATLAB程序为ex22.m:
%Example2-2
%x(n)=[u(n)-u(n-10)];
h(n)=(0.9)^n*u(n)n=0:
04
%y(n)=conv(x,h)
n=-5:
50;
u1=stepseq(0,-5,50);
u2=stepseq(10,-5,50);
%inputx(n)
x=u1-u2;
%impulseresponseh(n)
h=((0.9).^n).*u1;
figure
(1)
subplot(3,1,1);
axis([-5,50,0,2])
title(′InputSequence′)
ylabel(′x(n)′)
subplot(3,1,2);
stem(n,h);
ylabel(′h(n)′)
%outputresponse
[y,ny]=conv_m(x,n,h,n);
subplot(3,1,3);
stem(ny,y);
axis([-5,50,0,8])
gtext(′ImpulseResponse′)
xlabel(′n′),ylabel(′y(n)′)
执行结果分析所得的序列的离散图.
实验报告要求
1.实验报告包括目的、要求、内容、步骤、结果、总结,形成完整实验报告。
实验步骤不是书本内容的复制,而是自己结合实验内容进行探索的过程。
2.提交打印版实验报告,A4纸张打印,并附源程序清单。
3.提交的报告和源程序中标注清楚姓名学号专业等基本信息,禁止抄袭。
实验三离散系统分析
通过用Matlab实现信号的分析和表示方法,掌握离散系统的分析方法。
1.了解系统的Matlab描述和转换
2.掌握分析线性时不变系统的方法,并编程实现。
给定系统H(z)=-0.2z/(z2+0.8),
(1)求出H(z)的幅频响应和相频响应;
(2)绘制极零点图;
(3)求出并绘出该系统的单位抽样响应;
(4)令x(n)=u(n),求出并绘出系统的单位阶跃响应y(n)。
MATLAB系统的描述和转换
MATLAB的信号处理工具提供了几种线性时不变系统的模型,我们可以灵活的选择合适的模型以满足不同应用场合的需要。
信号处理工具箱提供的离散时间系统模型常用于数字滤波器,这些模型包括传递函数、零极点增益形式、状态空间形式、部分分式、二阶级联形式、格状结构和卷积矩阵等。
1.传递函数形式
在MATLAB信号处理工具箱中,数字滤波器的传递函数具有以下形式:
这种形式称为DSP(DigitalSignalProcessing),它和控制工具箱的z传递函数模型形式不同。
这一模型用z传递函数分子和分母多项式的系数构成两个向量来确定,即
num=[b
(1)b
(2)…b(nb+1)]
den=[a
(1)a
(2)…a(na+1)]
式中nb和na分别为分子num和den的阶数
在MATLAB中,要定义一个DSP形式的传递函数可利用FILT。
sys=filt(num,den)
sys=filt(num,den,Ts)
2.零极点增益形式
在MATLAB信号处理工具箱中,离散时间系统(数字滤波器)的零极点形式具有以下形式:
这一模型用零点向量和极点向量及增益来表示,即
q(z)=[q
(1),q
(2),…,q(n)]
p(z)=[p
(1),p
(2),…,p(n)]
MATLAB函数poly和roots可实现传递函数形式和零极点增益形式的转换。
3.状态空间形式
离散系统的状态空间表达式为:
x(n+1)=Ax(n)+Bu(n)
y(n)=Cx(n)+Du(n)
式中,u为输入,y为输出,x为状态向量。
在MATLAB信号处理工具箱中,用矩阵A、B、C、D表示数字滤波器模型(和控制工具箱一样)
MATLAB信号处理工具箱还提供传递函数、零极点和状态空间三种模型之间的相互转换函数,它们是zp2ft