实验目标
(1) 熟悉MATLAB的基本应用环境,包括一些常用的windows,调试程序的步骤。
(2)熟悉MATLAB中用于信号生成和绘制生成信号的一些基本内置命令
(3) 进一步了解一此离散时间信号。
项目1.1单位样本和单位步骤序列(必填)
长度为N的单位脉冲序列δn可以使用MATLAB命令:u = [1,-1];可以产生长度为N并延迟M个样本的δ[n–M ],其中M < N。使用MATLAB命令 ud = [zeros(1,M) 1 zeros(1,N - M - 1)];同样,单位阶跃序列可以使用MATLAB命令 s = [ones(1,N)]。延迟的单位阶跃序列可以类似于延迟的单位脉冲序列生成使用的方式生成。
Q1.1运行程序P1.1生成单位样本序列并显示:
%清除前面的图形
clf;
% 产生一个从 -10 到 20的向量
n = -10:20;
%产生单位采样序列
s = [zeros(1,10) 1 zeros(1,20)];
% 绘制单位采样序列
stem(n,s);
xlabel('时间索引n');ylabel('振幅');
title('单位采样序列');
axis([-10 20 0 1.2]);
Q1.2命令clf、axis、tltle、xlabel和ylabel的用途是什么?
答:clf:清除前面的图形。
axis:对坐标轴进行标定。
tltle: 作用是添加标题。
xlabel和ylabel: 用于给x、y轴贴上标。
Q1.3修改程序P1.1以生成延迟10个单位的采样序列。运行修改后的程序并显
示生产的序列。
%清除前面的图形
clf;
% 产生一个从 -10 到 20的向量
n = -10:20;
%产生单位采样序列
s = [zeros(1,20) 1 zeros(1,10)];
% 绘制单位采样序列
stem(n,s);
xlabel('时间索引n');ylabel('振幅');
title('延迟10个单位的单位采样序列');
axis([-10 20 0 1.2]);
Q1.4修改程序P1.1以生成单位步长序列u[n]。运行修改后的编程并显示生成的序列。
%清除前面的图形
clf;
% 产生一个从 -10 到 20的向量
n = -10:20;
%产生单位步长序列
s = [zeros(1,10) 1 ones(1,20)];
% 绘制单位步长序列
stem(n,s);
xlabel('时间索引n');ylabel('振幅');
title('单位步长序列 ');
axis([-10 20 0 1.2]);
Q1.5修改程序P1.1以生成延迟的单位步长序列u[n-5]。运行修改后的程序,然后显示生成的序列。
%清除前面的图形
clf;
% 产生一个从 -10 到 20的向量
n = -10:20;
%产生单位步长序列
s = [zeros(1,15) 1 ones(1,15)];
% 绘制单位步长序列
stem(n,s);
xlabel('时间索引n');ylabel('振幅');
title('延迟5个单位的单位步长序列 ');
axis([-10 20 0 1.2]);
项目1.2指数信号(可选)
另一个基本的离散时间序列是指数序列,可以使用MATLAB运算符.^和exp生成。
Q1.6运行程序P1.2.1,生成复值指数序列。
c =-(1/12)+(pi/6)*i;
K = 2;
n = 0:40;
x=K*exp(c*n);
subplot(2,1,1);
stem(n,real(x));
xlabel('时间索引n ');ylabel('振幅 ');
title('实数部分 ');
subplot(2,1,2);
stem(n,imag(x));
xlabel('时间索引n');ylabel('振幅');
title('虚数部分 ');
Q1.7哪个参数控制这个序列的增长率或衰减率?哪一个参数控制这个序列的幅座?
答:参数c控制该序列的增长或衰减率;参数 k 控制该序列的振幅。
Q1.8如果参数c变为 (1/12) + (pi/6) *会发生什么?
答:序列变成随时间索引n增长而衰减。
如图:
Q1.9运行real和imag的目的是什么?
答:函数real()、image()可分别求函数的实部、虚部。
Q1.10命令子地块的用途是什么?
答:subplot(m,n,p),subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,p表示图所在的位置,p=1表示从左到右从上到下的第一个位置。
Q1.11运行程序P1.2.1并生成实值指数序列。
% Program P1.3% Generation of a real-valued exponential sequenct
clf;
n = 0:35;a = 1.2; K = 0.2;
x = K*a.^n;
stem(n,x);
xlabel('时间索引n');ylabel('振幅');
Q1.12个参数控制这个序列的增长率或衰退率?哪一个参数控制这个序列的幅度?
答:参数a控制该序列的增长或衰减率;参数 k 控制该序列的振幅。
Q1.13算术运算符^和.^之间的区别是什么?
答:^是以矩阵为操作数的乘方,.^是以矩阵中的每个元素为操作数的乘方
Q1.14如果参数a小于1,会发生什么情况? 使用再次运行程序P13参数a变为0.9并且参数K变为20。
答:如果参数a小于1,序列呈衰减。
使用再次运行程序P13参数a变为0.9并且参数K变为20:
% Program P1.3% Generation of a real-valued exponential sequenct
clf;
n = 0:35;a = 0.9; K = 20;
x = K*a.^n;
stem(n,x);
xlabel('时间索引n');ylabel('振幅');
Q1.15这个序列的长度是多少? 如何改变?
答:序列的长度是36,可以调节n 的取值范围。
项目1.3正弦序列(必需)
另一类非常有用的离散时间信号是实正弦序列。这种正弦序列可以在MATLAB中使用三角运算符cos和sin生成。
Q1.17运行程序P1.3生成正弦序列并显示。
% 正弦序列
n = 0:40;
f= 0.1;
phase = 0;
A=1.5;
arg = 2*pi*f*n-phase;
x = A*cos(arg);
clf;
% Clear old graph
stem(n,x);
% Plot the generated sequence
axis([0 40 -2 2]);
grid;
title('正选序列');
xlabel('时间索引n');ylabel('振幅');
axis;
Q1.18这个序列的频率是多少? 如何改变? 哪个参数控制这个序列的相位?哪个参数控制这个序列这个序列的周期是多少?
答:该序列的频率是0.1Hz;通过改变f的值可以此正弦序列的频率;参数 phase控制该序列的初相位;参数A控制该序列的振幅;该序列的周期是10s。
Q1.19这个序列的长度是多少? 如何改变?
答:该序列的长度是41个时间单位,通过改变n的参数可以改变该序列的长度
Q1.20 axis和grid命令的用途是什么?
答: axis 的作用是规定图像显示的横纵坐标的范围; grid的作用是显示图像上面的“网格”。
Q1.21修改程序P1.3,生成频率分别为0.9和1.1的正弦序列,然后这些新序列与问题Q1.17中生成的序列进行比较。对您的结果发表评论。
答:修改正弦序列的频率只需要改变程序中“f”的值即可,第一个改为f=0.9,第二个改为f=1.1,结果图像如下图。该图形与f-0.1时图形一样,因为f-0.1时该正弦序列的最小周期是2pi,当f-0.9与f—1.1时其周期正好是2pi的整数倍。
Q1.22用plot命令替换程序P1.3中的stem命令并运行再次启动程序。有什么区别?
答:原图像是离散的,新图像是连续的,说明 plot命令是用平滑的线将各点连接起来产生连续波,而stem命令则是用各点来产生离散波。
项目1.4随机信号(可选)
样本均匀分布在区间(0,1)中的长度为N的随机信号可以通过使用MATLAB命令x = rand(1,N)来生成;同样,长度为N的随机信号x[n]具有正态分布的零均值和单位方差样本,可以通过使用以下MATLAB命令x = randn(1,N)来生成;
Q1.23编写MATLAB程序,生成并显示长度为100的随机信号,其元素均匀分布在区间[-2,2]中。
Q1.24编写MATLAB程序,生成并显示长度75,该信号正态分布且均值为0,方差为3。
项目1.5信号平滑(必需)
数字信号处理应用的一个常见例子是去除噪声,被加性噪声破坏的信号成分。设s[n]是被随机噪声d[n]破坏的信号,导致噪声信号x[n] = s[n] + d[n]。目标是对x[n]进行操作以生成信号y[n],该信号y[n]是s[n]的合理近似值。为此,一种简单的方法是通过对n时刻样本周围的多个输入样本求平均值来产生输出样本,例如,三点移动平均算法由y[n]=(x[n1]+x[n]+x[n+1])/3给出。
Q1.25运行程序P1.5并生成所有相关信号。
%程序P1.5%平均信号平滑
clf;
R = 51;
d = 0.8*(rand(R,1)-0.5); %生成随机峰声
m =0:R-1;s = 2*m.*(0.9.^m); %生成末损坏的信号
x = s + d'; ;%产生噪声破坏信号
subplot(2,1,1);
plot(m,d', 'r-',m,s, 'g-',m,x, 'b-');
xlabel( '时间索引 n');ylabel('振幅');
legend('d[n]','s[n] ', 'x[n] ');
x1=[0 0 x];
x2=[0 x 0];
x3=[x 0 0];
y = (x1 + x2 + x3)/3;
subplot(2,1,2);
plot(m,y(2:R+1),'r-',m,s, 'g-');
legend('y[n] ','s[n] ');
xlabel('时间索引n');ylabel('振幅');
Q1.26未损坏信号s[n]的形式是什么?加性噪声d[n]的形式是什么?
答:未污染的信号S[n]的形式应该为S[n]= 2*m*(0.9^m)表达式所表示的图形,不过自变量的取值为0-50的整数,因此图形应该为一系列离散的点。加性噪声d[n]的形式应该为在区间( -0.4,0.4)中均匀分布长度为51的随机信号,且为列向量51*1。
Q1.27你能用x=s+d这个语句来产生噪声破坏的信号吗? 如果为什么不聪?
答:不能,因为s和d均是矩阵,d与s要想相加必须匹配,而矩阵d本身与矩阵s不匹配,必须把d转置变为d'才能与s进行相加。
Q1.28信号x1、x2和x3与信号x之间的关系是什么?
答:延时关系,信号x1相当于将信号x延迟一个时间单位,信号x2相当于不变,信号x3相当于将信号x提前一个时间单位。
Q1.29 legend命令的用途是什么?
答: legend命令使得对MATLAB所画的图标进行标注。
项目1.6复杂信号的产生(可选)
通过对简单信号进行基本运算,可以产生更复杂的信号。例如,可以通过用低频调制信号xH[n] = cos(ωHn)调制高频正弦信号xH[n] = cos(ωHn)来生成调幅信号。结果信号y[n]的形式为y[n] = A(1 + m · xL[n])xH[n] = A(1 + m · cos(ωLn)) cos(ωHn),其中m(称为调制指数)是一个数字,选择该数字是为了确保(1 + m xL[n])对所有n都是正数。
Q1.30运行程序P1.6,为各种载波信号x,[n]和调制信号x[n]的频率值,以及调制指数m的各种值。
% 程序P1.6%调福序列的生成
clf;
n = 0:100;
m = 0.4;fH = 0.1; fL = 0.01;
xH = sin(2*pi*fH*n);
xL = sin(2*pi*fL*n);
y =(1+m*xL).*xH;
stem(n,y);grid;
xlabel('时间索引n');ylabel('振幅');
Q1.31算术运算符*和.*之间的区别是什么?
答:“*”是进行两个标量的相乘,所得结果仍为一个标量;“.*”是长度相同的行向量(或者列向量相乘),所得结果仍为长度不变的行向量(或者列向量)。
Q1.32编写MATLAB程序生成方波和锯齿波序列。使用这些程序,生成并绘制序列。
t = 0:0.01:10;
%通过square产生一个方波序列,周期是2pi/2
f1 = square(2*t);
%绘制图形,放在子图1
subplot(4,1,1);
plot(t, f1);
%重新定义XY轴
axis([0,10,-1.5,1.5]);
%图形标识
title('2π方波');
t=0:0.001:1;
f=sawtooth(2*pi* 2 *t + (pi/2));
plot(t,f,'r','LineWidth',3);
grid on;
axis([-0.5,1.5, -1.5,1.5]);
title('锯齿波序列');