资源描述
信号与系统matlab实验
典型信号的表示和运算
本练习利用MATLAB进行信号的表示和运算。主要内容包括离散时间信号的表示,连续时间信号的数值表示,连续时间信号的符号表示和信号的运算。
1.1 离散时间信号的表示
1.1.1 有限长序列
一个时间序列可用一个序列数组和一个时间标号数组来表示。
例1-1:利用MATLAB表示序列。
% 序列数组(纵坐标)
x=[0 0 0 1 2 4 2 3 0 0 0];
% 时间标号数组(横坐标)
n=[-5 -4 -3 -2 -1 0 1 2 3 4 5];
% 绘制序列对应的波形
stem(n,x); xlabel('n');ylabel('x');
由stem绘制的波形图如图1-1所示。
图1-1 一个序列的波形图
注意:命令的尾部用了分号,用以除掉MATLAB不必要的回响。
1.1.2 单位样值序列
单位样值序列可以表示为
(1-1)
它可以用只有一个元素为1其余元素均为0的数组表示,如例1-3所示。
例1-3:
n=[-5:5];
x=[zeros(1,5) 1 zeros(1,5)];
stem(n,x);xlabel('n');ylabel('x');
单位样值序列波形图如图1-2所示。
图1-2 单位样值序列波形图
1.1.3 由已知序列得到另一个序列
(1) 取长序列中的一部分
例1-3:
nx=0:10;x=nx;
% 取序列nx的前5个值
ny=nx(1:5);
% 取序列x的前5个值
y=x(1:5);
subplot(2,1,1);stem(nx,x);xlabel('nx'); ylabel('x');axis([0 10 0 10]);
subplot(2,1,2);stem(ny,y);xlabel('ny'); ylabel('y'); axis([0 10 0 5]);
MATLAB执行结果见图1-3。
图1-3 例1-3结果图
(2) 组合一个新序列
例1-4:
n=0:5; x=n;
% 重复3次
y=[x x x];
ny=0:(length(y)-1);
% 序列间插0
z=[x 0 0 0 x 0 0 0 x 0 0 0];
nz=0:(length(z)-1);
subplot(2,1,1);stem(ny,y); axis([0 length(z) 0 5.5]);
xlabel('n'); ylabel('y');
subplot(2,1,2);stem(nz,z,'r'); axis([0 length(z) 0 5.5]);
xlabel('n'); ylabel('z');
MATLAB执行结果见图1-4。
图1-4 例1-4结果图
1.1.4 幂级数序列
(1-2)
幂指数序列可以利用power()函数来表示。
例1-5:
n=0:10;
x1=power(1.1,n);
subplot(2,2,1);stem(n,x1);legend('a=1.1');
x2=power(-1.1,n);
subplot(2,2,2);stem(n,x2);legend('a=-1.1');
x3=power(0.9,n);
subplot(2,2,3);stem(n,x3);legend('a=0.9');
x4=power(-0.9,n);
subplot(2,2,4);stem(n,x4);legend('a=-0.9');
1.1.5 正弦序列
, (1-3)
n=0:10;
例1-6:产生离散正弦序列, ,并画出其波形图。
n=0:10;x=sin(pi/4*n);
stem(n,x);xlabel(‘n’);ylabel(‘sin(\pi/n*n)’);
MATLAB执行结果见图1-5。
图1-5 例1-6结果图
例1-7:钢琴键盘上中音“1”对应的频率为262Hz。若抽样频率为8192Hz,请产生1秒钟的此频率信号并播放。
分析:信号的数字角频率为,其中为模拟信号的频率,为抽样频率。首先生成此频率的离散正弦信号,然后利用MATLAB的sound函数用来播放该数字音频信号。
sound函数具体用法如下:
n sound(y,fs) 在扬声器上以抽样频率fs来播放向量y中存储的音频信号,y值的取值范围假设为-1.0 <= y <= 1.0,超出这个范围将发生削波,当y为的矩阵时(N为整数),则播放立体声。
n sound(y) 采用默认的8192Hz的抽样频率来播放音频信号。
n sound(y,fs,bits) 如果硬件条件允许的话则使用bits比特/样值的量化参数来播放音频信号,大部分硬件平台支持bits=8或16。
解:
f=262;fs=8192;
omega=2*pi*f/fs;
n=0:fs-1;x=sin(n*omega);
sound(x,fs);
利用例1-7中方法,可以产生各音符对应的时域信号,将音符串接起来就可以生成乐曲了。下面给出了C大调各音符对应的频率值及其关系,其中=262Hz代表中音1的频率。
例1-8:《小蜜蜂》的简谱如图1-6所示,抽样频率取8192Hz,请生成此乐曲对应的离散正弦序列信号,并播放。
图1-6 《小蜜蜂》乐谱
MATLAB代码如下:
clc;close all;clear;
% 中音'1'的频率
f1=262;
% 采样率
fs=8192;
% 中音'2','3','4','5'的频率
f2=f1*power(2,2/12);f3=f1*power(2,4/12);
f4=f1*power(2,5/12);f5=f1*power(2,7/12);
N_zeros=300;
% 产生四分之一音符,1s
n=0:(fs/2-N_zeros-1);
x1=[sin(n*2*pi*f1/fs) zeros(1,N_zeros)];
x2=[sin(n*2*pi*f2/fs) zeros(1,N_zeros)];
x3=[sin(n*2*pi*f3/fs) zeros(1,N_zeros)];
x4=[sin(n*2*pi*f4/fs) zeros(1,N_zeros)];
x5=[sin(n*2*pi*f5/fs) zeros(1,N_zeros)];
% 产生八分之一音符,0.5s
n=0:(fs/2-N_zeros-1);
xh1=[sin(n*2*pi*f1/fs) zeros(1,N_zeros)];
xh2=[sin(n*2*pi*f2/fs) zeros(1,N_zeros)];
xh3=[sin(n*2*pi*f3/fs) zeros(1,N_zeros)];
xh4=[sin(n*2*pi*f4/fs) zeros(1,N_zeros)];
xh5=[sin(n*2*pi*f5/fs) zeros(1,N_zeros)];
% 产生二分之一音符,2s
n=0:(2*fs-N_zeros-1);
x_1=[sin(n*2*pi*f1/fs) zeros(1,N_zeros)];
x_3=[sin(n*2*pi*f3/fs) zeros(1,N_zeros)];
% 生成乐曲信号
notes=[xh5 xh3 x3 xh4 xh2 x2 xh1 xh2 xh3 xh4 xh5 xh5 x5];
notes=[notes xh5 xh3 x3 xh4 xh2 x2 xh1 xh3 xh5 xh5 x_3];
notes=[notes xh2 xh2 xh2 xh2 xh2 xh3 x4 xh3 xh3 xh3 xh3 xh3 xh4 x5];
notes=[notes xh5 xh3 x3 xh4 xh2 x2 xh1 xh3 xh5 xh5 x_1];
% 播放乐曲
sound(notes,fs);
1.1.6 离散复指数序列
例1-9:请产生离散复指数信号, 并绘制其波形图。
MATLAB代码如下:
n=[0:32];
w0=pi/8;x=exp(j*w0*n);
subplot(2,2,1);stem(n,real(x));xlabel('n');ylabel('real(x)');
subplot(2,2,2);stem(n,imag(x));xlabel('n');ylabel('imag(x)');
subplot(2,2,3);stem(n,abs(x));xlabel('n');ylabel('abs(x)');
subplot(2,2,4);stem(n,angle(x));xlabel('n');ylabel('angle(x)');
MATLAB执行结果如图1-7所示。
图1-7 例1-9结果图
1.1.7 单位阶跃序列
(1-4)
下面的MATLAB程序step_function()用于生成单位阶跃序列。
% step_function.m
function [n,x]=step_function(n1,n2,ns,A)
% n1 is the first location
% n2 is the last location
% ns is the step location
% A is the gain
n=n1:n2;
x=A*[zeros(1,(ns-n1)) ones(1,(n2-ns+1))];
h=stem(n,x);
set(h,'LineWidth',2);
title('step function');
函数调用:
[n,x]=step_function(-10,10,0,2)
1.1.8 矩形脉冲序列
(1-5)
例1-10:矩形脉冲可利用如下代码实现:
RN_length=20;
N=10;
RN=[ones(1,N),zeros(1,RN_length-N)];
1.2 连续时间信号的数值表示
1.2.1 用数值方法表示连续时间信号
本节讨论用MATLAB表示和分析连续时间信号。严格来说,只有用符号推理的方法才能分析连续时间信号与系统。用数值方法是不能表示连续信号的,因为它给出的是各个样本点的数据。只有当样本点取得很密时才可看成连续信号。所谓密,是相对信号变化的快慢而言。以下均假定相对于采样点密度而言,信号变化足够慢。
(1) 单位冲激信号
(1-6)
单位冲激函数无法直接用MATLAB描述,可以把它看作是宽度为(程序中用dt),幅度为的矩形脉冲,即
(1-7)
表示在处的冲激。
例1-11:
clear;
t0=0;tf=5;dt=0.05;t1=1;
t=[t0:dt:tf];st=length(t);
n1=floor((t1-t0)/dt);
x1=zeros(1,st);x1(n1+1)=1/dt;
stairs(t,x1);grid on;
axis([0,5,0,25]);xlabel('t');ylabel('\delta(t-t_1)');
结果图形如图1-8所示。
图1-8 用MATLAB产生的单位冲激信号波形图
在例1-11中使用了几个新函数,说明如下:
n floor 向下取整
n stairs 画阶梯状图形
n grid on 显示网格线
(2) 单位阶跃函数
(1-8)
在跳变点处该函数值无定义或在处规定函数值。
例1-12:
clear;
t0=0;tf=5;dt=0.05;t1=1;
t=[t0:dt:tf];st=length(t);
n1=floor((t1-t0)/dt);
x2=[zeros(1,n1),ones(1,st-n1)];
stairs(t,x2);grid on;
axis([0,5,0,1.5]);xlabel('t');ylabel('u(t-t_1)');
结果图形如图1-9所示。
图1-9 用MATLAB产生的单位阶跃信号波形图
(3) 复指数信号
(1-9)
例1-13:
clear;t0=0;tf=5;dt=0.05;
t=[t0:dt:tf];
alpha=-0.5;w=10;x=exp((alpha+j*w)*t);
subplot(2,2,1);plot(t,real(x));
grid on;xlabel('t');ylabel('real part');
subplot(2,2,2);plot(t,imag(x));
grid on;xlabel('t');ylabel('imaginary part');
subplot(2,2,3);plot(t,abs(x));
grid on;xlabel('t');ylabel('abs');
subplot(2,2,4);plot(t,angle(x));
grid on;xlabel('t');ylabel('angle');
结果图形如图1-10所示。
图1-10 复指数信号波形图
信号的相位为,这是关于的线性函数。但是图1-10绘制的相位曲线是分段线性的,被去掉了2的整倍数,图形分布在区间,这种现象称为卷绕。这和实际的预期不一样。相位图出现卷绕是因为求复数函数的相位时使用了反正切atan函数,它的值域为。相位卷绕就好像是一根长长的线绕到了一个线轴上,真正的相位函数需要将这些线从轴上绕下来,再拉直,这个过程称为解卷绕。MATLAB提供了解卷绕的函数unwrap。例1-13中实现相位卷绕的代码如下:
x_ang_unwrap=unwrap(angle(x));
figure;plot(t,x_ang_unwrap);
grid on;xlabel('t');ylabel('angle');
解卷绕后的相位图如图1-11所示。
图1-11 解卷绕后的相位图
(4) 抽样信号
(1-10)
执行如下命令:
t=linspace(-3,3,7);
x=sin(t)./t
MATLAB返回:
x =
0.0470 0.4546 0.8415 NaN 0.8415 0.4546 0.0470
注:NaN不是一个数。这是因为运算中出现了sin(0)/0,即0比0型。MATLAB返回的结果中含有NaN不影响进一步的计算。
可以利用MATLAB提供的sinc函数来生成抽样信号。
例1-14:
t=linspace(-10,10,101);
x=sinc(t/pi);
plot(t,x); xlabel('t');ylabel('Sa(t)'); grid on;
MATLAB执行结果如图1-12所示。
图 1-12 抽样信号的波形
1.3 连续时间信号的符号表示
这里我们将通过几个例子来说明连续时间信号的符号表示。
例1-15:产生信号的符号表达式,并绘制时的波形图。
解:
syms t a w
x=exp(-a*t)*cos(w*t)*heaviside(t);
x1=subs(x,a,1);
x2=subs(x1,w,10);
ezplot(x2,[0,2*pi]);axis([0 2*pi -1 1]);
MATLAB绘制的结果图如图1-13所示。
图1-13 例1-15信号波形图
例1-16:绘制下列各时间函数的波形图,注意它们的区别。
(1) ;
(2) ;
(3) ;
(4) ;
解:
syms t
x1=t*(heaviside(t)-heaviside(t-1));
x2=t*heaviside(t-1);
x3=t*(heaviside(t)-heaviside(t-1))+heaviside(t-1);
x4=(t-1)*heaviside(t-1);
subplot(2,2,1);ezplot(x1,[0 3]);axis([0 3 0 3]);subplot(2,2,2);ezplot(x2,[0 3]);axis([0 3 0 3]);
subplot(2,2,3);ezplot(x3,[0 3]);axis([0 3 0 3]);subplot(2,2,4);ezplot(x4,[0 3]);axis([0 3 0 3]);
MATLAB绘制的结果图如图1-14所示。
图1-14 例1-16信号波形图
例1-17:绘出信号的偶分量和奇分量。
解:
MATLAB代码如下:
syms t;
x=exp(-(t-2))*(heaviside(t-2)-heaviside(t-3));
x_flip=subs(x,t,-t);x_even=(x+x_flip)/2;x_odd=(x-x_flip)/2;
subplot(2,2,1);ezplot(x,[-4 4]);axis([-4 4 -1.1 1.1]);
subplot(2,2,3);ezplot(x_flip,[-4 4]);axis([-4 4 -1.1 1.1]);
subplot(2,2,2);ezplot(x_even,[-4 4]);axis([-4 4 -1.1 1.1]);
subplot(2,2,4);ezplot(x_odd,[-4 4]);axis([-4 4 -1.1 1.1]);
MATLAB绘制的结果图如图1-15所示。
图1-15 例1-17信号波形图
1.4 信号的运算
1.4.1 信号的基本运算
MATLAB可以对信号做加、减、乘、除、乘以标量以及对信号取幂等运算,要求代表这些信号的向量都有相同的时间原点和相同的元素个数。
对于逐项地做乘(矩阵点乘)、除和取幂运算,必须要在该算符的前面放一个圆点,也就是要用.*符号来代替*来做逐项相乘。
例1-18:产生矩阵A和B,进行相乘运算,请观察各种运算的执行结果。
% exm5_18_product.m
A=[1 2 3;4 5 6;7 8 9];B=ones(3,3);
A*B % 矩阵乘
A.*B % 矩阵点乘
A.*A % 矩阵点乘
power(A,2) % 同A.*A
A.^2 % 同A.*A
A*A % 矩阵乘
1.4.2 累加运算
(1-11)
MATLAB提供了cumsum()函数用于实现累加运算,可以用来近似表示连续信号的运动积分。
例1-19:
% exm5_19_cumsum.m
x= 1:10;
cumsum(x)
MATLAB执行结果:
ans =
1 3 6 10 15 21 28 36 45 55
1.4.3 信号的能量和平均功率
离散信号的能量 (1-12)
离散信号的平均功率 (1-13)
例1-20:求信号的能量和平均功率。
n=0:20;
x=exp(j*pi/8*n);
E=sum(x.*conj(x)) % sum():求和函数
P=E/length(x)
MATLAB执行结果为:
E =
21
P =
1
1.5 小结
本章练习了离散信号的数值表示、连续信号的数值和符号表示以及信号的运算。用到的主要函数如表1-1所示。
表1-1 本章MATLAB函数
函数名称
功能
linspace
产生等间隔数据
power
产生幂指数函数
sound
播放音频信号
floor
向下取整
stairs
画阶梯状图形
grid on
显示网格线
unwrap
解卷绕
sinc
产生sinc函数
cumsum
累加函数
习题:
1. 产生离散衰减正弦序列, ,并画出其波形图。
2. 用MATLAB生成信号, 和都是实数,,画波形图。观察并分析和的变化对波形的影响。
3. 某频率为的正弦波可表示为,对其进行等间隔抽样,得到的离散样值序列可表示为,其中称为抽样间隔,代表相邻样值间的时间间隔,表示抽样频率,即单位时间内抽取样值的个数。抽样频率取,信号频率分别取5Hz, 10Hz, 20Hz和30Hz。请在同一张图中同时画出连续信号和序列的波形图,并观察和对比分析样值序列的变化。可能用到的函数为plot, stem, hold on。
4. 用MATLAB产生音阶信号,并播放,抽样频率可设为8000 Hz。
5. 利用MATLAB产生信号和,请画出信号和信号的波形图。
参考文献:
尹霄丽, 张健明. MATLAB在信号与系统中的应用. 清华大学出版社. 北京:2015.
答案
产生离散衰减正弦序列, ,并画出其波形图。
n=0:10;
x=sin(pi/4*n).*0.8.^n;
stem(n,x);xlabel( 'n' );ylabel( 'x(n)' );
用MATLAB生成信号, 和都是实数,,画波形图。观察并分析和的变化对波形的影响。
t=linspace(-4,7);
a=1;
t0=2;
y=sinc(a*t-t0);
plot(t,y);
t=linspace(-4,7);
a=2;
t0=2;
y=sinc(a*t-t0);
plot(t,y);
t=linspace(-4,7);
a=1;
t0=2;
y=sinc(a*t-t0);
plot(t,y);
三组对比可得a越大最大值越小,t0越大图像对称轴越往右移
某频率为的正弦波可表示为,对其进行等间隔抽样,得到的离散样值序列可表示为,其中称为抽样间隔,代表相邻样值间的时间间隔,表示抽样频率,即单位时间内抽取样值的个数。抽样频率取,信号频率分别取5Hz, 10Hz, 20Hz和30Hz。请在同一张图中同时画出连续信号和序列的波形图,并观察和对比分析样值序列的变化。可能用到的函数为plot, stem, hold on。
fs = 40;
t = 0 : 1/fs : 1 ;
% ƵÂÊ·Ö±ðΪ5Hz,10Hz,20Hz,30Hz
f1=5;
xa = cos(2*pi*f1*t) ;
subplot(1, 2, 1) ;
plot(t, xa) ;
axis([0, max(t), min(xa), max(xa)]) ;
xlabel('t(s)') ;ylabel('Xa(t)') ;line([0, max(t)],[0,0]) ;
subplot(1, 2, 2) ;stem(t, xa, '.') ;
line([0, max(t)], [0, 0]) ;
axis([0, max(t), min(xa), max(xa)]) ;
xlabel('n') ;ylabel('X(n)') ;
频率越高,图像更加密集。
用MATLAB产生音阶信号,并播放,抽样频率可设为8000 Hz。
利用MATLAB产生信号和,请画出信号和信号的波形图。
clc;close all;clear;
f1=262;fs=8000;f2=293;f3=329;f4=349;f5=392;f6=440;f7=493;f8=523;
N_zeros=300;
n=0:(fs/2-N_zeros-1);
x1=[sin(n*2*pi*f1/fs) zeros(1,N_zeros)];
x2=[sin(n*2*pi*f2/fs) zeros(1,N_zeros)];
x3=[sin(n*2*pi*f3/fs) zeros(1,N_zeros)];
x4=[sin(n*2*pi*f4/fs) zeros(1,N_zeros)];
x5=[sin(n*2*pi*f5/fs) zeros(1,N_zeros)];
x6=[sin(n*2*pi*f6/fs) zeros(1,N_zeros)];
x7=[sin(n*2*pi*f7/fs) zeros(1,N_zeros)];
x8=[sin(n*2*pi*f8/fs) zeros(1,N_zeros)];
notes=[x1 x2 x3 x4 x5 x6 x7 x8 ];
sound(notes,fs);
展开阅读全文