医学信号处理
实验1 离散时间信号的表示
一、实验目的
1.加深对离散时间信号特点的理解
2.掌握MATLAB中一些常用离散时间信号的表示方法 3.学习MATLAB中M文件的使用和调用函数方法
二、实验方法与示例
1.正弦信号
离散正弦序列的MATLAB表示与连续信号类似,只不过是用stem函数而不是用plot函数来画出序列的波形。下面是正弦序列sin?%正弦序列实现程序 k=0:39;
fk=sin(pi/6*k); stem(k,fk)
title('正弦序列sin(pi/6*k)的波形') 程序运行结果如图1–1所示。
正弦序列sin(pi/6*k)的波形10.80.60.40.20-0.2-0.4-0.6-0.8-10510152025303540????k的MATLAB源程序。 ?6?
图1–1 正弦序列波形
2.实指数序列
离散实指数序列的一般形式为ca,可用MATLAB中的数组幂运算(即点幂运算)c*a.^k来实现。可直接实现 也可调用用MATLAB编写绘制离散时间实指数序列波形的函数。下面为实指数序列的波形函数。
function dszsu(c,a,k1,k2) %c:指数序列的幅度 %a:指数序列的底数
k%k1:绘制序列的起始序号 %k2:绘制序列的终止序号 k=k1:k2; x=c*(a.^k); stem(k,x,'filled')
3.复指数序列
对于复指数序列,其一般形式为f?k??rekj?k,可以通过调用下面绘制复指数序列时
域波形的MATLAB函数。
function dfzsu(n1,n2,r,w)
%n1:绘制波形的虚指数序列的起始时间序号 %n2:绘制波形的虚指数序列的终止时间序号 %w:虚指数序列的角频率 %r: 指数序列的底数 k=n1:n2;
f=(r*exp(i*w)).^k; Xr=real(f); Xi=imag(f); Xa=abs(f); Xn=angle(f);
subplot(2,2,1), stem(k,Xr,'filled'),title('实部'); subplot(2,2,3), stem(k,Xi,'filled'),title('虚部'); subplot(2,2,2), stem(k,Xa,'filled'),title('模'); subplot(2,2,4), stem(k,Xn,'filled'),title('相角');
4.单位抽样序列
可以通过借助MATLAB中的零矩阵函数zeros表示。全零矩阵zeros(1,N)产生一个由N个零组成的列向量,对于有限区间的??k?可以通过以下MATLAB程序表示。
% 单位抽样序列实现程序 k=-30:30;
delta=[zeros(1,30),1,zeros(1,30)]; stem(k,delta)
程序运行结果如图1–2所示。
单位抽样序列的波形10.90.80.70.60.50.40.30.20.10-30-20-10010203010.90.80.70.60.50.40.30.20.10-30-20-100102030单位阶跃序列的波形
图1–2 单位抽样序列波形 图1–3 单位阶跃序列波形
5.单位阶跃序列
可以通过借助MATLAB中的单位矩阵函数ones表示。单位矩阵ones(1,N)产生一个由N个
1组成的列向量,对于有限区间的u?k?可以通过以下MATLAB程序表示。
% 单位阶跃序列实现程序 k=-30:30;
uk=[zeros(1,30),ones(1,31)]; stem(k,uk)
程序运行结果如图1–3所示。
6.Matlab函数、及其调用方法
在MATLAB语言中,M文件有两种形式:脚本和函数。
? 脚本没有输入/输出参数,只是一些函数和命令的组合。它可以在MATLAB环境下直接
执行,也可以访问存在于整个工作空间内的数据。由脚本建立的变量在脚本执行完后仍将保留在工作空间中可以继续对其进行操作,直到使用clear命令对其清除为止。
? 函数是MATLAB语言的重要组成部分。MATLAB提供的各种工具箱中的M文件几乎都
是以函数的形式给出的。函数接收输入参数,返回输出参数,且只能访问该函数本身工作空间中的变量,从命令窗或其他函数中不能对其工作空间的变量进行访问。读者可以在信号处理的基本理论和MATLAB信号处理工具箱函数的基础上,自己编写一些子程序以便调用。 (1) 函数结构
MATLAB语言中提供的函数通常由以下五个部分组成:
? 函数定义行:以function开头,函数名(必须与文件名相同)及函数输入输出参数在此定
义;
? H1行:第一注释行,供lookfor和help在线帮助使用;
? 函数帮助文件;通常包括函数输入输出参数的含义,调用格式说明;
? 函数体:它包括进行运算和赋值的所有MATLAB程序代码。函数体中可以包括流程
控制、输入/输出、计算、赋值、注释以及函数调用和脚本文件调用等。 在函数体中完成对输出参数的计算; ? 注释。
这五个部分中最重要的是函数定义行和函数体。函数定义行是一个MATLAB函数所必需的,其他各部分的内容可以没有,这种函数称为空函数。
例:function dszsu(c,a,k1,k2) %c:指数序列的幅度 %a:指数序列的底数
%k1:绘制序列的起始序号 %k2:绘制序列的终止序号
k=k1:k2; %定义序列的起止范围 x=c*(a.^k); %实指数序列的运算 stem(k,x,'filled') %画图
此函数为自定义的实现实数序列的函数,此函数包括有函数定义行,函数帮助文件,函数体,注释四部分。 2.函数调用
函数调用的过程实际上就是参数传递的过程。例如,在一个脚本文件里调用函数“max”可采用如下面的方式进行。
n=1:20;?
a=sin(2*pi*n/20);? [Y,I]=max(a);
该调用过程把变量“a”传给了函数中的输入参数“x”,然后把函数运算的返回值传给输出参数“Y”和“I”。其中,Y是a序列的最大值,I是最大值Y对应的坐标值。
在数字信号处理的基本理论和MATLAB信号处理工具箱函数的基础上,可以自己编写一些子程序以便调用。
(1)单位抽样序列?(n?n0)的生成函数impseq.m function [x,n]=impseq(n0,ns,nf)
n=[ns:nf];x=[(n-n0)==0]; %序列起点为ns,终点为nf,在n=n0处生成一个单位脉冲。 (2)单位阶跃序列u(n?n0)的生成函数stepseq.m
function [x,n]=stepseq(n0,ns,nf)
n=[ns:nf];x=[(n-n0)>=0]; %序列起点为ns,终点为nf,在n=n0处生成单位阶跃。
三、实验内容
1.画出正弦序列sin(?k),计算其周期性,并根据画出的序列图进行验证。 2.在一幅图柄中画出四个实指数波形ca,其中c?2,a值分别为
n275353,,?,?,并分4444析a取值不同时实指数序列的收敛性。 3.画出虚指数波形ejk?4,ej2k,分析这两个序列的周期性。
kj?k4.画出复指数序列波形f?k??re,其中(1)r?1.7,???4。(2)r?0.7,???6。
(3)r?1,???3。分析当r>1时,当0 5.编写程序来产生下列基本脉冲序列。 (1)单位抽样序列,起点ns=0,终点nf=10,在n0=3处有一单位脉冲。 (2)单位阶跃序列,起点ns=0,终点nf=10,在n0=3前为0,在n0=3后为1。 四、实验要求 1.每个实验内容都要求建立一个脚本文件来实现。 2.在实验内容实现时,学习函数文本的建立和调用。 3.在实验报告中写出完整的自编程序,并给出实验结果和对应的分析。 4.在绘制图形时要求图形的完整性,每个图形都要有图标标示。 五、思考题 1.无限长信号和周期信号在计算机中是如何表示的? 2.离散时间信号和连续时间信号区别是什么? 3.如何实现连续时间信号的离散化,离散化后是否会有误差存在? 实验2 序列的基本运算 一、实验目的 1.加深对序列基本运算的理解 2.掌握MATLAB中常用序列基本运算的实现方法 3.继续熟悉MATLAB中M文件的使用和调用函数方法 二、实验方法与示例 1.加法 对于离散序列来说,序列相加是将信号对应时间序号的值逐项相加,在这里不能像连续时间信号那样用符号运算来实现,而必须用向量表示的方法,即在MATLAB中离散序列的相加需表示成两个向量的相加,因而参加运算的两序列向量必须具有相同的维数。下面为实现离散序列相加的MATLAB实用子程序。 function [f,k]=lsxj(f1,f2,k1,k2) %实现f(k)=f1(k)+f2(k),f1,f2,k1,k2是参加运算的二离散序列及其对应的时间序列向量,f和k为返回%的和序列及其对应的时间序列向量 k=min(min(k1),min(k2)):max(max(k1),max(k2));%构造和序列长度 s1=zeros(1,length(k));s2=s1; %初始化新向量 s1(find((k>=min(k1))&(k<=max(k1))==1))=f1;%将f1中在和序列范围内但又无定义的点赋值为零 s2(find((k>=min(k2))&(k<=max(k2))==1))=f2;%将f2中在和序列范围内但又无定义的点赋值为零 f=s1+s2; %两长度相等序列求和 stem(k,f,'filled') axis([(min(min(k1),min(k2))-1),(max(max(k1),max(k2))+1),(min(f)-0.5),(max(f)+0.5)]) 2.乘法 与离散序列加法相似,这里参加运算的两序列向量必须具有相同的维数。下面为实现离散时间信号相乘的MATLAB实用子程序。 function [f,k]=lsxc(f1,f2,k1,k2) %实现f(k)=f1(k)+f2(k),f1,f2,k1,k2是参加运算的二离散序列及其对应的时间序列向%量,f和k为返回的和序列及其对应的时间序列向量 k=min(min(k1),min(k2)):max(max(k1),max(k2));%构造和序列长度 s1=zeros(1,length(k));s2=s1; %初始化新向量 s1(find((k>=min(k1))&(k<=max(k1))==1))=f1;%将f1中在和序列范围内但又无定义的点赋值为零 s2(find((k>=min(k2))&(k<=max(k2))==1))=f2;%将f2中在和序列范围内但又无定义的%点赋值为零 f=s1.*s2; %两长度相等序列求积 stem(k,f,'filled') axis([(min(min(k1),min(k2))-1),(max(max(k1),max(k2))+1),(min(f)-0.5),(max(f)+0.5)]) 3.移位 序列移位y(n)?x(n?n0)的生成函数sigshift.m可以用下面的MATLAB程序实现。 function [y,n]=sigshift(x,m,n0)