数字信号实验.docx
《数字信号实验.docx》由会员分享,可在线阅读,更多相关《数字信号实验.docx(28页珍藏版)》请在冰点文库上搜索。
数字信号实验
实验一:
信号的表示
一、实验目的:
1、了解MATLAB程序设计语言的基本特点,熟悉MATLAB软件运行
环境。
2、掌握各种信号的建模方式。
3、掌握各种信号的图形表示方法。
4、掌握变量等有关概念,具备初步的将一般数学模型转化为对应的计算机
模型并进行处理的能力
二、实验设备:
PC机
MATLAB7.0软件
三、实验内容
学习使用MATLAB7.0软件。
学习信号的图形表示方法,掌握各种信号的建
模方式。
实现单位采样序列δ(n)、单位阶跃序列u(n)、矩形序列()NRn、三角波、
方波、锯齿波、Sinc函数。
四、参考实例:
常用的MATLAB绘图语句有figure、plot、subplot、stem等,图形修饰语具有title、axis、
text等。
(1)figure语句
figure有两种用法。
当只有一句figure命令时,程序会创建一个新的图形窗口,并返回
一个整数型的窗口编号。
当采用figure(n)时,表示将第n个图形窗口作为当前的图形窗口,
将其显示在所有窗口的最前面。
如果该图形窗口不存在,则新建一个窗口,并赋以编号n。
(2)plot语句
线形绘图函数。
用法为plot(x,y,’s’)。
参数x为横轴变量,y为纵轴变量,s用以控制图
形的基本特征如颜色、粗细等,通常可以省略,常用方法如表1-1所示。
表1-1plot命令的参数及其含义
参数含义参数含义参数含义
y黄色.点-实线
m紫色o圆:
虚线
c青色x打叉-.点划线
r红色+加号--破折线
g绿色*星号^向上三角形
b蓝色s正方形<向左三角形
w白色d菱形>向右三角形
k黑色v向下三角形p五角星形
(3)subplot语句
subplot(m,n,i)是分割显示图形窗口命令,它把一个图形窗口分为m行n列共m×n个小
窗口,并指定第i个小窗口为当前窗口。
(4)二维统计分析图
在MATLAB中,二维统计分析图形很多,常见的有条形图、阶梯图、杆图和填充图等,
所采用的函数分别是:
bar(x,y,选项)
stairs(x,y,选项)
stem(x,y,选项)
fill(x1,y1,选项1,x2,y2,选项2,…)
例1-1分别以条形图、阶梯图、杆图和填充图形式绘制曲线y=2sin(x)。
程序如下:
x=0:
pi/10:
2*pi;
y=2*sin(x);
subplot(2,2,1);bar(x,y,'g');
title('bar(x,y,''g'')');axis([0,7,-2,2]);
subplot(2,2,2);stairs(x,y,'b');
title('stairs(x,y,''b'')');axis([0,7,-2,2]);
subplot(2,2,3);stem(x,y,'k');
title('stem(x,y,''k'')');axis([0,7,-2,2]);
subplot(2,2,4);fill(x,y,'y');
title('fill(x,y,''y'')');axis([0,7,-2,2]);
0246
-2
-1
0
1
2
bar(x,y,'g')
0246
-2
-1
0
1
2
stairs(x,y,'b')
0246
-2
-1
0
1
2
stem(x,y,'k')
0246
-2
-1
0
1
2
fill(x,y,'y')
(5)图形保持
holdon/off命令控制是保持原有图形还是刷新原有图形,不带参数的hold命令在两种状
态之间进行切换。
例1-2采用图形保持,在同一坐标内绘制曲线y1=0.2e-0.5xcos(4πx)和y2=2e-0.5xcos(πx)。
《数字信号处理实验》
第3页共39页
程序如下:
x=0:
pi/100:
2*pi;
y1=0.2*exp(-0.5*x).*cos(4*pi*x);
plot(x,y1)
holdon
y2=2*exp(-0.5*x).*cos(pi*x);
plot(x,y2);
holdoff
01234567
-1.5
-1
-0.5
0
0.5
1
1.5
2
(6)绘图修饰命令
title(图形名称)
xlabel(x轴说明)
ylabel(y轴说明)
text(x,y,图形说明)
legend(图例1,图例2,…)
例1-3在0≤x≤2π区间内,绘制曲线y1=2e-0.5x和y2=cos(4πx),并给图形添加图形标注。
程序如下:
x=0:
pi/100:
2*pi;
y1=2*exp(-0.5*x);
y2=cos(4*pi*x);
plot(x,y1,x,y2)
title('xfrom0to2{\pi}');%加图形标题
xlabel('VariableX');%加X轴说明
ylabel('VariableY');%加Y轴说明
text(0.8,1.5,'曲线y1=2e^{-0.5x}');%在指定位置添加图形说明
text(2.5,1.1,'曲线y2=cos(4{\pi}x)');
legend(‘y1’,‘y2’)%加图例
01234567
-1
-0.5
0
0.5
1
1.5
2
xfrom0to2π
VariableX
VariableY
曲线y1=2e-0.5x
曲线y2=cos(4πx)
y1
y2
(7)MATLAB常用信号生成函数:
•★ZEROS
•功能:
产生全零阵列
•调用格式:
X=ZEROS(N)%产生N行N列的全零矩阵
•X=ZEROS(M,N)%产生M行N列的全零矩阵
•★ONES
•功能:
产生全1阵列
•调用格式:
X=ONES(N)%产生N行N列的全1矩阵
•X=ONES(M,N)%产生M行N列的全1矩阵
•★SINC
•功能:
辛格函数
•调用格式:
Y=SINC(X)%
•★RECTPULS
•功能:
产生矩形脉冲信号
•调用格式:
Y=RECTPULS(T)%产生高度为1、宽度为1、关于T=0对称的矩形
脉冲
•Y=RECTPULS(T,W)%产生高度为1、宽度为W、关于T=0对称的矩形脉冲
•★RAND
•功能:
产生伪随机序列
•调用格式:
Y=RAND(1,N)%产生[0,1]上均匀分布的随机序列
•Y=RANDN(1,N)%产生均值为0,方差为1的白噪声序列
•★SAWTOOTH
•功能:
产生周期锯齿波或三角波
•调用格式:
Y=SAWTOOTH(T)%产生幅值为+1,-1,以2为周期的方波
•Y=SAWTOOTH(T,WIDTH)%产生幅值为+1,-1,以WIDTH*2为周期的
方波
•★SQUARE
•功能:
产生方波
•调用格式:
Y=SQUARE(T)%产生幅值为+1,-1,以2为周期的锯齿波
•Y=SQUARE(T,DUTY)%产生幅值为+1,-1,以占空比为DUTY的方波
•例:
t=0:
.0001:
.0625;
•y=SQUARE(2*pi*30*t,80);plot(t,y)%产生一个占空比为80%的方波
•★FLIPLR
•功能:
序列左右翻转
•调用格式:
Y=FLIPLR(X)
•%X=123翻转后321
•456654
•★CUMSUM、SUM
•功能:
计算序列累加
•调用格式:
Y=CUMSUM(X)%向量X元素累加,记录每一次的累加结果,而SUM
只记录最后的结果
五、实验报告
(1)实现单位采样序列δ(n)、单位阶跃序列u(n)、矩形序列()NRn,并用图形显
示。
写出程序及输出图形
单位采样序列δ(n)
n=-5:
10;
y=[zeros(1,5),1,zeros(1,10)];
stem(n,y)
axis([-5,10,0,2]);
单位阶跃序列u(n)
n=-5:
10;
y=[zeros(1,5),ones(1,11)];
stem(n,y,'r')
axis([-5,10,0,2]);
矩形序列()NRn
n=-5:
10;
y=[zeros(1,5),ones(1,5),zeros(1,6)];
plot(n,y)
stem(n,y)
axis([-5,10,0,2]);
title('矩形序列');
(2)实现三角波、方波、锯齿波、Sinc函数,并用图形显示。
写出程序及输出
图形
三角波
fs=10000;
t=-1:
1/fs:
1;
w=0.4;
x=tripuls(t,w);
plot(t,x)
title('三角波');
方波
t=-2*pi:
0.001:
2*pi;
x=square(t);
plot(t,x);
xlabel('t'),ylabel('x=square(t)');
锯齿波
x=0:
0.01:
5;
y=1-mod(x,1);
plot(x,y)
title('锯齿波')
Sinc函数
clear
n=-5:
0.5:
10;
y=sin(0.5*pi*n);
stem(n,y,'g')
title('正弦序列');
实验二:
FFT频谱分析及应用
一、实验目的:
1、通过实验加深对FFT的理解;
2、熟悉应用FFT对典型信号进行频谱分析的方法。
二、实验设备:
PC机
MATLAB7.0软件
三、实验内容
使用MATLAB程序实现信号频域特性的分析。
涉及到离散傅立叶变换
(DFT)、快速傅立叶变换(FFT)及信号频率分辨率等知识点。
四、实验原理与方法
在各种信号序列中,有限长序列占重要地位。
对有限长序列可以利用离散傅
立叶变换(DFT)进行分析。
DFT不但可以很好的反映序列的频谱特性,而且易于
用快速算法(FFT)在计算机上进行分析。
有限长序列的DFT是其z变换在单位圆上的等距离采样,或者说是序列傅
立叶的等距离采样,因此可以用于序列的谱分析。
FFT是DFT的一种快速算法,
它是对变换式进行一次次分解,使其成为若干小数据点的组合,从而减少运算量。
在MATLAB信号处理工具箱中的函数fft(x,n),可以用来实现序列的N点
快速傅立叶变换。
经函数fft求得的序列一般是复序列,通常要求出其幅值和相位。
MATLAB中
提供了求复数的幅值和相位的函数:
abs、angle,这些函数一般和fft同时使用。
五、实验报告
(1)模拟信号x(t)=2sin(4πt)+5cos(8πt),以t=0.01n(n=0:
N−1)进行采样,
求:
○1N=40点FFT的幅度频谱,从图中能否观察出信号的2个频谱分量?
N=128;n=0:
N-1;
t=0.01*n;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
k=0:
N/2;w=2*pi/N*k;
X=fft(x,N);
magX=abs(X(1:
N/2+1));
subplot(2,1,1);stem(n,x,'.');title('128点FFT的幅度频谱');
subplot(2,1,2);plot(w/pi,magX);title('FFTN=128');
xlabel('f(unit:
pi)');ylabel('|X|');grid
○2提高采样点数,如N=128,再求该信号的幅度频谱,此时幅度频谱发生了什
么变化?
信号的2个模拟频率和数字频率各为多少?
FFT频谱分析结果与理论上是否一致?
N=40;n=0:
N-1;
t=0.01*n;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
k=0:
N/2;w=2*pi/N*k;
X=fft(x,N);
magX=abs(X(1:
N/2+1));
subplot(2,1,1);stem(n,x,'.');title('40点FFT的幅度频谱');
subplot(2,1,2);plot(w/pi,magX);title('FFTN=40');
xlabel('f(unit:
pi)');ylabel('|X|');grid
(2)一个连续信号含三个频谱分量,经采样得以下序列:
x(n)=sin(2π×0.15n)+cos(2π×(0.15+df)n)+cos(2π×(0.15+2df)n)
○1N=64,df分别为116、1/64,观察其频谱;
○2N=64、128,df为1/64,做128点得FFT,其结果有何不同?
N=64;n=0:
N-1;
df=1/16;x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n);
k=0:
N/2;w=2*pi/N*k;
X=fft(x,N);
magX=abs(X(1:
N/2+1));
subplot(2,1,1);stem(n,x,'.');title('信号x(n)');
subplot(2,1,2);plot(w/pi,magX);title('频谱N=64');
xlabel('f(unit:
pi)');ylabel('|x|');grid
N=64;n=0:
N-1;
df=1/64;x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n);
k=0:
N/2;w=2*pi/N*k;
X=fft(x,N);
magX=abs(X(1:
N/2+1));
subplot(2,1,1);stem(n,x,'.');title('信号x(n)');
subplot(2,1,2);plot(w/pi,magX);title('频谱N=64');
xlabel('f(unit:
pi)');ylabel('|x|');grid
N=128;n=0:
N-1;
df=1/64;x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n);
k=0:
N/2;w=2*pi/N*k;
X=fft(x,N);
magX=abs(X(1:
N/2+1));
subplot(2,1,1);stem(n,x,'.');title('信号x(n)');
subplot(2,1,2);plot(w/pi,magX);title('频谱N=128');
xlabel('f(unit:
pi)');ylabel('|x|');grid
(3)被噪声污染得信号,比较难看出所包含得频率分量,如一个由50Hz和120Hz
正弦信号构成的信号,受零均值随机噪声的干扰,数据采样率为1000Hz,试用
FFT函数来分析其信号频率成分,要求:
○1画出时域波形;○2分析信号功率谱密度。
t=0:
0.001:
0.8;x=sin(2*pi*50*t)+cos(2*pi*120*t);
y=x+1.5*randn(1,length(t));
subplot(3,1,1);plot(t,x);
subplot(3,1,2);plot(t,y);
%title('pressanykey,continue...');
%pause;
Y=fft(y,512);
P=Y.*conj(Y)/512;
f=1000*(0:
255)/512;
subplot(3,1,3);plot(f,P(1:
256));
注:
在MATLAB中,可用函数rand(1,N)产生均值为0,方差为1,长度为
N的高斯随机序列。
九、参考程序
程序1:
N=40;n=0:
N-1;
t=0.01*n;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
k=0:
N/2;w=2*pi/N*k;
X=fft(x,N);
magX=abs(X(1:
N/2+1));
subplot(2,1,1);stem(n,x,'.');title('signalx(n)');
subplot(2,1,2);plot(w/pi,magX);title('FFTN=40');
xlabel('f(unit:
pi)');ylabel('|X|');grid
程序3:
t=0:
0.001:
0.8;x=sin(2*pi*50*t)+cos(2*pi*120*t);
y=x+1.5*randn(1,length(t));
subplot(3,1,1);plot(t,x);
subplot(3,1,2);plot(t,y);
%title('pressanykey,continue...');
%pause;
Y=fft(y,512);
P=Y.*conj(Y)/512;
f=1000*(0:
255)/512;
subplot(3,1,3);plot(f,P(1:
256));
实验三:
信号的运算-卷积
一、实验目的:
1、掌握信号的线性卷积运算。
2、掌握信号的循环卷积运算。
3、掌握信号循环卷积计算线性卷积的条件。
二、实验设备:
PC机
MATLAB7.0软件
三、实验内容
学习使用MATLAB7.0软件进行建模。
学习信号的卷积运算的MATLAB实
现。
实现信号的线性卷积运算、应用DFT实现线性卷积运算、验证循环卷积计
算线性卷积的条件。
四、参考实例:
如果信号x(n)=x1(n)⊗x2(n)
利用循环卷积计算,用circonvt函数实现如下:
functiony=circonvt(x1,x2,N)
if(length(x1)>N|length(x2)>N)
error('N必须大于等于x的长度');
end
x1=[x1zeros(1,N-length(x1))];
x2=[x2zeros(1,N-length(x2))];
X1=fft(x1,N);X2=fft(x2,N);X=X1.*X2;
y=ifft(X,N);y=real(y);
如果信号12x(n)=x(n)∗x(n)
利用线性卷积计算,用conv函数实现如下:
y=conv(x1,x2)
五、实验报告
(1)假设卷积下面信号
X(n)=
0≤n<13
0else
h(n)=
10≤n<12
0else
选定循环卷积的长度为N=21。
确定1y(n)=x(n)⊗h(n)的哪些数值与线性卷积2y(n)=x(n)*h(n)
结果中的数值相同。
编写程序代码并输出图形,并分析错误数据的原因,怎样才能使两者数
据相同
n1=0:
1:
12;
x1=0.9.^n1;
h=ones(1,12);
h=[0h];
N=length(x1)+length(h)-1;
n=0:
N-1;
ny=0:
20;
y1=circonvt(x1,h,21);
y2=circonvt(x1,h,N);
x1=[x1zeros(1,N-length(x1))];
h=[hzeros(1,N-length(h))];
X1=fft(x1,N);
H=fft(h,N);
X=X1.*H;
x=ifft(X);
x=real(x);
subplot(2,2,1);stem(n,x1);title('x1(n)');axis([0,33,0,1]);
subplot(2,2,2);stem(n,h);title('h(n)');axis([0,33,0,1]);
subplot(2,2,3);stem(ny,y1,'fill');title('21点循环卷积');axis([0,33,0,8]);
holdon;subplot(2,2,4);stem(n,x);title('线性卷积');axis([0,33,0,8]);
subplot(2,2,3);stem(n,x,'r','--');axis([0,33,0,8]);
holdoff
(2)假设卷积下面信号
X(n)=
0≤n<13
0else
h(n)=
19≤n<21
0else
选定循环卷积的长度为N=21。
确定1y(n)=x(n)⊗h(n)的哪些数值与线性卷积2y(n)=x(n)*h(n)
结果中的数值相同。
编写程序代码并输出图形,怎样才能使两者数据相同。
并分析既然h(n)
自开始就有零点,好点和差点在哪里?
n1=0:
1:
12;
x1=0.9.^n1;
h=ones(1,12);
h=[zeros(1,9)h];
N=length(x1)+length(h)-1;
n=0:
N-1;
ny=0:
20;
y1=circonvt(x1,h,21);
y2=circonvt(x1,h,N);
x1=[x1zeros(1,N-length(x1))];
h=[hzeros(1,N-length(h))];
X1=fft(x1,N);
H=fft(h,N);
X=X1.*H;
x=ifft(X);
x=real(x);
subplot(2,2,1);stem(n,x1);title('x1(n)');axis([0,33,0,1]);
subplot(2,2,2);stem(n,h);title('h(n)');axis([0,33,0,1]);
subplot(2,2,3);stem(ny,y1,'fill');title('21点循环卷积');axis([0,33,0,8]);
holdon;subplot(2,2,4);stem(n,x);title('线性卷积');axis([0,33,0,8]);
subplot(2,2,3);stem(n,x,'r','--');axis([0,33,0,8]);
holdoff
(3)已知系统响应为h(n)=sin(0.2n)+cos(0.5n)0≤n<20,输入为x(n)=exp(0.2n)0≤n<10,
画出用DFT方法实现求系统输出的系统框图,编写用DFT实现的程序代码并输
出图形
functiony=circonvt(x1,x2,N)
if(length(x1)>N||length(x2)>N)
error('N必须大于等于x的长度');
end
x1=[x1zeros(1,N-length(x1))];
x2=[x2zeros(1,N-length(x2))];
X1=fft