本实验涉及基本离散时间信号的生成,卷积运算,傅里叶变换及采样定理的证明。全部程序与实验报告点此下载
目录
实验原理
1、序列的概念
序列是本实验要研究的离散信号简称。一个在时域上连续的信号,在其定义域内的每一个时间都有一个值对应,对这个连续的信号进行采样,每间隔T取一个幅值,如此一来便得到了一个不连续的,只在这些采样的点有值的信号,这种信号即为离散时间信号。
常用的序列有单位脉冲序列(单位抽样序列)、单位阶跃序列、矩形序列等。
2、卷积运算
序列的常用运算包括移位、反褶、和、积、标乘、累加、差分运算等。
通过这些基本的运算,可以用来进行序列之间的卷积运算。卷积计算公式如下:
上式的运算关系称为卷积运算,式中*代表两个序列卷积运算。两个序列的卷积是一个序列与另一个序列反褶后逐次移位乘积之和,故称为离散卷积,也称两序列的线性卷积。其计算的过程包括以下4个步骤。
(1)反褶:先将x(n)和h(n)的变量n换成m,变成x(m)和h(m),再将h(m)以纵轴为对称轴反褶成h(-m)。
(2)移位:将h(-m)移位n,得h(n-m)。此处要注意n的正负值判断移位方向。
(3)相乘:将h(n-m)和x(m)的对应点值相乘。
(4)求和:将以上所有对应点的乘积累加起来,即得y(n)。
实验任务与方法
1、离散信号的产生
- 冲激序列即为除了n0处都为令,即n=n0时值为1,不等时为0。
- 阶跃序列即为在n≥n0取值为1,n<n0时取值为0。
- 矩形序列即为从n0开始,N个单位取值为1,其余位置取值为0,即n-n0≥0且((n0+N-1)-n)≥0的情况下取值为1.
- 在matlab中绘制正弦信号,首先确定其信号t的范围以及绘制点间隔,例如t=0:1:10,即为从0至10,每间隔1单位绘制一个点。之后将信号函数使用matlab语言表示出来,用plot或stem函数级即可绘制处该信号图像。
2、序列运算
3、采样定理
使用matlab绘制一个频谱图主要分为以下几步:
- 确定时域信号;
- 确定采样频率各采样点数,采样点数除采样频率可得采样部分的时间。采样频率选择需要满足采样定理,采样点数根据要采样的时间自行确定。
- 使用fft函数对信号进行快速傅里叶变换;
- 使用abs函数获得傅里叶变换后的幅值;
- 根据采样频率、点数、时域信号的时间序列求出频率序列。
- 使用plot函数绘制幅值随频率变换的图像。
以对x(t)=sin(t)的频谱绘制为例研究采样定理。按照采样定理,fs≥2f,fs应大于等于1/π
程序与结果
1 离散时间信号(序列)的产生
1.1 常用序列的绘制
绘制单位脉冲序列,单位阶跃序列,矩形序列。
我写了三个函数分别用于生成这三种函数。
function x = impseq(n0,n) %冲激信号函数
x = [(n-n0)==0];
function [x] = stepseq(n0,n) %阶跃
x = [(n-n0)>=0];
function [x] = rectseq(n0,n,N) %矩形
x = [(n-n0)>=0&((n0+N-1)-n)>=0];
figure('name','几种常用序列');
n=[-20:20];
x1=impseq(0,n);
subplot(311);
stem(n,x1);
title('单位脉冲序列');
x2=stepseq(0,n);
subplot(312);
stem(n,x2);
title('单位阶跃序列');
x3=rectseq(0,n,5);
subplot(313);
stem(n,x3);
title('矩形序列');
结果如图
1.2 正弦信号及其相关信号绘制
因为matlab中内置有正弦函数和指数函数,因此绘制正弦相关函数相对容易些,定义t的取值后,输入几种正弦信号,正弦衰减信号及谐波信号函数公式,使用stem函数或plot函数绘制其图像即可
t=-10:0.15:10;
x4=2*sin(pi/5*t+pi/3);
x5=2*cos(t-pi/3);
x6=2*sin(3*t).*cos(2*t-pi/3);
figure('name','三角函数'); %三个正余弦函数
subplot(2,2,1);
plot(t,x4,'-r*',t,x5,'-g*',t,x6,'-b*');
legend('2*sin(pi/5*t+pi/3)','2*cos(t-pi/3)','2*sin(3*t).*cos(2*t-pi/3)');
subplot(2,2,2);
stem(t,x4);
xlabel('2*sin(pi/5*t+pi/3)');
subplot(2,2,3);
stem(t,x5);
xlabel('2*cos(t-pi/3)');
subplot(2,2,4);
stem(t,x6);
xlabel('2*sin(3*t).*cos(2*t-pi/3)');
figure('name','正弦衰减') %正弦衰减信号
t=-20:0.1:10;
x7=2*exp(-0.5*t).*sin(2*pi*2*t);
subplot(211);
stem(t,x7);
subplot(212);
plot(t,x7);
figure('name','谐波信号') %谐波信号
t=-5:0.04:5;
x8=sin(2*pi*2*t)+0.5*sin(2*pi*2*2*t)+0.2*sin(2*pi*3*2*t);
subplot(211);
stem(t,x8);
subplot(212);
plot(t,x8);
结果输出:
正余弦信号:
正余弦衰减信号:
谐波信号:
2 序列运算
2.1 信号生成与卷积计算
使用前面的脉冲序列生成函数生成,通过基本运算生成两个信号,使用conv函数进行卷积计算,并通过序列长度计算卷积后的序列长度及起始位置。此题中应用序列长度应为5+4-1=8,起始位置为0+0=0。
a=5;
n=0:a-1;
x=impseq(0,n)+2*impseq(1,n)+3*impseq(2,n)+4*impseq(3,n)+5*impseq(4,n);
b=4;
n=0:b-1;
h=impseq(0,n)+2*impseq(1,n)+impseq(2,n)+2*impseq(3,n);
y = conv(x,h);
n=0:a+b-1-1;
stem(n,y);
运行结果:
2.2卷积函数
对于一个卷积运算,我们需要获得其卷积后信号的时间序列及幅值。而matlab自带的conv函数只能获得幅值的序列,而需要自行计算时间序列。该程序可绘制两个需要卷积的信号图像及卷积后的图像,两个信号可自行输入。
function [n,y]=cov2(x1,n1,x2,n2)
k1=n1(1)+n2(1);
k2=length(x1)+length(x2)-2;
y=conv(x1,x2);
n=k1:k1+k2;
subplot(311);
stem(n1,x1);
subplot(312);
stem(n2,x2);
subplot(313);
stem(n,y);
x1=input('第一个序列:x(n)=');
n1=input('第一个序列长度(如0:10)=');
x2=input('第二个序列2:h(n)=');
n2=input('第二个序列长度(如0:10)=');
[n,y]=cov2(x1,n1,x2,n2);
stem(n,y);
运行结果:
频谱绘制及采样定理
以对x(t)=sin(t)的频谱绘制为例研究采样定理。按照采样定理,fs≥2f,fs应大于等于1/π。分别以0.1,1/2π,1/π,1,10为采样频率绘制频谱
t=-4*pi:0.0001:4*pi;
x=sin(t);
subplot(611);
plot(t,x);
title('原图像');
fs=0.1;N=64;
n=0:N-1;t=n/fs;
x=sin(t);
y=fft(x,N);
mag=abs(y);
f=n*fs/N;
subplot(612),plot(f,mag);
title('fs=0.1');
fs=1/(2*pi);N=128;
n=0:N-1;t=n/fs;
x=sin(t);
y=fft(x,N);
mag=abs(y);
f=n*fs/N;
subplot(613),plot(f,mag);
title('fs=1/2π');
fs=1/pi;N=256;
n=0:N-1;t=n/fs;
x=sin(t);
y=fft(x,N);
mag=abs(y);
f=n*fs/N;
subplot(614),plot(f,mag);
title('fs=1/π');
fs=1;N=256;
n=0:N-1;t=n/fs;
x=sin(t);
y=fft(x,N);
mag=abs(y);
f=n*fs/N;
subplot(615),plot(f,mag);
title('fs=1');
fs=10;N=256;
n=0:N-1;t=n/fs;
x=sin(t);
y=fft(x,N);
mag=abs(y);
f=n*fs/N;
subplot(616),plot(f,mag);
title('fs=10');
运行结果:
从图中可看到,抽样频率小于1/π时,频谱图都出现了一定程度的失真,而在抽样频率等于1/π时,频谱图也有失真。这表示在对正弦信号抽样时不能完全按照2f进行采样。
讨论
本实验使用matlab软件实现了几种常用序列,正弦及其相关序列的生成,计算和绘制,并编写了了序列卷积运算的程序,在最后通过绘制正弦信号在不同抽样频率下的频谱图研究抽样定理,得出正弦信号的抽样不能完全按照抽样定理进行抽样,要根据不同情况具体分析。
除了本实验生成的集中序列外,我们还可以用matlab中的square函数生成周期方波信号,使用sawtooth函数生成三角波信号,甚至可以使用rand函数生成一个随机信号便于我们进行研究。这也体现出了matlab编程相比c编程在数字信号处理领域更加简洁方便的优势。虽然matlab编程语言以c编程语言为基础,但是因为matlab中内置函数的存在,很多工作不需要像c编程中一样自己编写,而只需要引用一个函数即可用一行代码完成。此外,它可以用一行程序完成rgb图像和灰度图像的转换,可以使用函数快速完成线形空间滤波,和图像增强,它有着方便制作的gui用户界面。因此除了数字信号处理,在图像处理,人机交互等领域,matlab也发挥着重要作用。
全部程序与实验报告点此下载