信号处理实验指导书V2
信号处理实验指导书V2
信号处理实验指导书V2
课程编号: Z612SB0011
实验指导书
南昌大学信息工程学院
电子信息工程系通信教研室课程组
2019-10-8
前 言
1. 简介
信号处理实验是信号与系统\数字信号处理课程重要的实践性学习环节。本实验教学目
标是通过实验使学生更好的掌握信号处理的基本理论和方法;熟悉应用快速傅里叶变换算
法进行谱分析;掌握数字滤波器设计,提高其运用数字信号处理的应用能力等。第一部分
主要包括:Matlab 基础、典型信号的产生、微分方程和差分方程的求解、傅里叶级数展开、
傅里叶变换及其在通信系统中的应用、连续和离散时间信号的卷积和 Z 变换。第二部分主
要包括周期信号频谱测量及线性时不变连续时间系统模拟;模拟\数字低通滤波器设计与特
性测量;信号采集与处理的综合设计实验。
《信号处理实验》是的重要实践环节,巩固和加深信号处理基础知识的理解,提高综
合运用所学知识的能力。在独立设计分析方案,准确分析实验结果,设计调试程序等方面
培养学生工程能力。通过应用设计实验提高学习者的开发能力和创新能力。
课程目标 1:使学生能够了解信号处理的广泛应用,掌握确知信号与线性时不变系统的基
本分析和设计方法。
课程目标 2:使学生掌握以数字滤波器为代表的线性时不变离散时间系统的设计和实现方
法。能运用工程科学基本原理分析复杂工程问题,以获得有效结论。
课程目标 4:通过循序渐进、适当综合的教学和实践活动,为学生从事通信工程领域中的
研究与应用提供必要的理论基础和方法训练。通过实验使学生了解现代编程工具在信号与
系统分析中的应用。
2. 主要内容
实验的主要内容为:MATLAB 语言基础编程、时间信号和系统在时域\频域的分析、
傅里叶变换的计算及其应用、信号的取样理论及其应用、模拟\数字滤波器设计和信号采集
处理经典实际应用等。实验采用 MATLAB 为编程环境,分六个单元由浅入深地通过对基
本原理的验证、基本技术的应用、设计与实现使学生进一步深化对相关理论和方法的理解。
实验前,学生必须预习实验指导教师指定的实验内容,编制实验程序;实验课开始由
教师简要讲解实验目的、基本原理、实验关键点及注意事项;然后学生严格按实验操作规
程进行实验;实验结束后,学生必须书写实验报告,实验报告应包括实验名称、实验者姓
名、实验目的、实验原理、程序清单、实验步骤、实验数据及分析等。实验课程内容和学
时分配如下:
1. MATLAB 语言基础编程(6 学时、理论授课/实验)
MATLAB 编程基础、典型信号的产生、微分方程和差分方程的求解、傅里叶级数展开、
傅里叶变换、动态仿真工具 Simulink 编程。
2. 系统响应及系统稳定性(验证性,3 学时)
(1) 采用时域求解的方法,仿真计算确知信号激励线性时不变系统的输出。
(2) 掌握求系统响应的方法;掌握系统的时域特性;分析、观察及检验系统的稳定性。
3. 时域采样与频域采样(验证性,3 学时)
(1)验证时域采样理论与频域采样理论。
(2)掌握模拟信号采样前后频谱的变化,以及如何选择采样频率才能使采样后的信号不
丢失信息
(3)掌握频率域采样会引起时域周期化的概念,以及频率域采样定理及其对频域采样点
数选择的指导作用。
4. 用 FFT 对信号作频谱分析(验证性,3 学时)
学习用 FFT 对周期信号(不同占空比的周期方波等)、非周期信号(衰减包络的双边
带调制信号等)进行谱分析,了解可能出现的分析误差及其原因,以便正确应用 FFT。
1. 模拟滤波器设计及特性测试(设计性,3 学时)
基于巴特沃斯原型设计有源低通滤波器。
6. IIR 数字滤波器设计及软件实现(设计性,3 学时)
(1)熟悉用双线性变换法设计 IIR 数字滤波器的原理与方法;
(2)学会调用 MATLAB 信号处理工具箱中滤波器设计函数(或滤波器设计分析工具
FDATOOL)设计各种 IIR 数字滤波器,学会根据滤波需求确定滤波器指标参数。
(3)掌握 IIR 数字滤波器的 MATLAB 实现方法。
(4)通过观察滤波器输入输出信号的时域波形及其频谱,建立数字滤波的概念。
7. FIR 数字滤波器设计与软件实现(设计性,3 学时)
(1)掌握用窗函数法设计 FIR 数字滤波器的原理和方法。
(2)掌握用等波纹最佳逼近法设计 FIR 数字滤波器的原理和方法。
(3)掌握 FIR 滤波器的快速卷积实现原理。
(4)学会调用 MATLAB 函数设计与实现 FIR 滤波器。
8. 数字信号处理在双音多频拨号系统中的应用(综合性,4 学时)
(1)仿真产生拨号系统的双音多频信号。
(2)掌握检测双音多频信号的常用方法,戈泽尔算法,的原理及其仿真实现。
(3)分析检测算法中的六个要求:采样频率、变换点数、记录时间长度、频率分辨率、
谱分析的频谱范围以及检测频率的准确性。然后选择合适的参数。
(4)评估检测方法在加性高斯信道系统中的性能。
9. 信号采集以及处理(综合性,4 学时)
(1)信号采集(A、B 两种方案可选)
A)声音信号:声信号设计为 3~5kHz 范围内的线性调频或跳频信号,由 MATLAB 生成
并播放,人声作为噪声;MATLAB 使用声卡采集空传带噪的声信号;
B) 生物医学信号:使用光电模块将心脏律动关联的人体浅表皮肤反射信号转换为电信
号,使用采集卡或可存储示波器采集光电模块的模拟输出。
(2)信号处理:A 或 B 信号的特征提取以及时频分析;根据信号和噪声的频域分布特点,
提出合适的滤波器指标,设计并验证滤波器性能。
3. 实验报告格式要求
一、.实验目的:
1、了解常用时域离散信号及其特点
二、.实验原理:
1、时域离散信号的概念
在时间轴的离散点上取值的信号,称为离散时间信号。通常,离散时间信号用 x(n)表
示,其幅度可以在某一范围内连续取值。由于信号处理设备或装置(如计算机、专用的信
号处理芯片等)均以有限位的二进制数来表示信号的幅度,因此,信号的幅度也必须离散
化。我们把时间和幅度均取离散值的信号称为时域离散信号或数字信号。
在 MATLAB 语言中,时域离散信号可以通过编写程序直接产生。
2、常用时域离散信号的生成
1) 单位抽样序列
单位抽样序列的表示式为
1 n=0 1 n=k
(n) = 或 (n − k ) =
0 n0 0 n0
以下三段程序分别用不同的方法来产生单位抽样序列。
n1= -5;n2=5;n0=0;
n=n1:n2;
x=[n==n0];
stem(n,x,'filled');
axis([n1,n2,0,1.1*max(x)]);
xlabel('时间(n)');ylabel('幅度 x(n)');
title('单位脉冲序列');
0.8
幅度x(n)
0.6
0.4
0.2
0
-5 -4 -3 -2 -1 0 1 2 3 4 5
时间 (n)
图 1-1
n1=-5;n2=5;k=0;
n=n1:n2;
nt=length(n);(取参数的长度)
nk=abs(k-n1)+1;{取绝对值}
x=zeros(1,nt);{(行、列)}(zeros 生成零矩阵)
x(nk)=1;
例 1-3 生成移位的单位脉冲序列。
n1=-5;n2=5;n0=2;
n=n1:n2;
x=[(n-n0)==0];
stem(n,x,'filled');
axis([n1,n2,0,1.1*max(x)]);
xlabel('时间(n)');ylabel('幅度 x(n)');
title('单位脉冲序列');
运行结果如图 1-2 所示
单位脉冲序列
1
0.8
幅度x(n)
0.6
0.4
0.2
0
-5 -4 -3 -2 -1 0 1 2 3 4 5
时间 (n)
图 1-2
2) 单位阶跃序列
单位阶跃序列表示式为
1 n0 1 n0
u (n)= 或 u (n-k )=
0 n0 0 n0
以下三段程序分别用不同的方法来产生单位阶跃序列。
n1=-2;n2=8;n0=0;
n=n1:n2;
x=[n>=n0];
stem(n,x,'filled');
axis([n1,n2,0,1.1*max(x)]);
xlabel('时间(n)');ylabel('幅度 x(n)');
title('单位阶跃序列');
box
0.8
幅度x(n)
0.6
0.4
0.2
0
-2 -1 0 1 2 3 4 5 6 7 8
时间 (n)
图 1-3
n1=-2;n2=8;k=0;
n=n1:n2;
nt=length(n);
nk=abs(k-n1)+1;
x=[zeros(1,nk-1),ones(1,nt-nk+1)];
例 1-6 生成移位的单位阶跃序列。
n1=-10;n2=10;n0=4;
n=n1:n2;
x=[(n-n0)>=0];
stem(n,x,'filled');
axis([n1,n2,0,1.1*max(x)]);
xlabel('时间(n)');ylabel('幅度 x(n)');
title('移位的单位阶跃序列');
box
0.8
幅度x(n)
0.6
0.4
0.2
0
-10 -8 -6 -4 -2 0 2 4 6 8 10
时间 (n)
图 1-4
3) 实指数序列
n1=-10;n2=10;a1=0.5;a2=2;
na1=n1:0;x1=a1.^na1;
na2=0:n2;x2=a2.^na2;
subplot(2,2,1);plot(na1,x1);(图形窗口)
title('实指数信号(a<1)');
subplot(2,2,3);stem(na1,x1,'filled');
title('实指数序列(a<1)');
subplot(2,2,2);plot(na2,x2);
title('实指数信号(a>1)');
subplot(2,2,4);stem(na2,x2,'filled');
title('实指数序列(a<1)');
box
1000 1000
500 500
0 0
-10 -5 0 0 5 10
1000 1000
500 500
0 0
-10 -5 0 0 5 10
图 1-5
4)复指数序列
复指数序列的表示式为 x(n)=e(σ+jω)n
ejωn=cos(ωn)+jsin(ωn)
其实部为余弦序列,虚部为正弦序列。
n1=30;a=-0.1;w=0.6;
n=0:n1;
x=exp((a+j*w)*n);
subplot(2,2,1);plot(n,real(x));
title('复指数信号的实部');
subplot(2,2,3);stem(n,real(x),'filled');
title('复指数序列的实部');
subplot(2,2,2);plot(n,imag(x));
title('复指数信号的虚部');
subplot(2,2,4);stem(n,imag(x),'filled');
title('复指数序列的虚部');
box
程序运行结果如图 1-6 所示
复指数信号的实部 复指数信号的虚部
1 1
0.5
0.5
0
0
-0.5
-1 -0.5
0 10 20 30 0 10 20 30
复指数序列的实部 复指数序列的虚部
1 1
0.5
0.5
0
0
-0.5
-1 -0.5
0 10 20 30 0 10 20 30
图 1-6
5)正(余)弦序列
正(余)弦序列的表示式为 x(n)=Umsin(ω0n+Θ)
f=1;Um=1;nt=2;
N=32;T=1/f;
dt=T/N;
n=0:nt*N-1;
tn=n*dt;
x=Um*sin(2*f*pi*tn);
subplot(2,1,1);plot(tn,x);
axis([0,nt*T,1.1*min(x),1.1*max(x)]);
ylabel('x(t)');
subplot(2,1,2);stem(tn,x);
axis([0,nt*T,1.1*min(x),1.1*max(x)]);
ylabel('x(n)');
box
程序运行结果如图 1-7 所示
0.5
x(t)
-0.5
-1
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
0.5
x(n)
-0.5
-1
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
图 1-7
6)矩形波序列
f=5000;nt=2;
N=16;T=1/f;
dt=T/N;
n=0:nt*N-1;
tn=n*dt;
x=square(2*f*pi*tn,25)+1;
subplot(2,1,1);plot(tn,x);
axis([0,nt*T,1.1*min(x),1.1*max(x)]);
ylabel('x(t)');
subplot(2,1,2);stem(tn,x);
axis([0,nt*T,1.1*min(x),1.1*max(x)]);
ylabel('x(n)');
box
1.5
x(t)
0.5
0
0 1 2 3 4
-4
x 10
1.5
x(n)
0.5
0
0 1 2 3 4
-4
x 10
三、.实验内容:
1、阅读并上机验证实验原理部分的例题程序,理解每一条语句的含义。
改变例题中的有关参数(如信号的频率、周期、幅度、显示时间的取值范围、采样点
数等)
,观察对信号波形的影响。
2、编写程序,产生以下离散序列:
(1)f(n)=δ(n) (-3<n<4)
(2)f(n)=u(n) (-5<n<5)
(4)f(n)=3sin(nП/4) (0<n<20)
四、.实验预习:
2、根据实验内容预先编写实验程序。
3、预习思考题:产生单位脉冲序列和单位阶跃序列各有几种方法?如何使用?
五、实验报告
1、列写调试通过的实验程序,打印实验程序产生的曲线图形。
1. 实验目的:
1) 加深对离散系统的差分方程、单位脉冲响应、单位阶跃响应和卷积分析方法的理
解。
3)掌握求解离散时间系统的单位脉冲响应、单位阶跃响应、线性卷积以及差分方程
的程序的编写方法,了解常用子函数的调用格式。
4)分析、观察及验证系统稳定性。
2. 实验原理及方法:
在时域中,描写系统特性的方法是差分方程和单位脉冲响应,在频域可以用系统函数
描述系统特性。已知输入信号可以由差分方程、单位脉冲响应或系统函数求出系统对于该
输入信号的响应,本实验仅在时域求解。在计算机上适合用递推法求差分方程的解,最简
单的方法是采用MATLAB语言的工具箱函数filter函数。也可以用MATLAB语言的工具箱
函数conv函数计算输入信号和系统的单位脉冲响应的线性卷积,求出系统的响应。
系统的时域特性指的是系统的线性时不变性质、因果性和稳定性。重点分析实验系统
的稳定性,包括观察系统的暂态响应和稳定响应。
系统的稳定性是指对任意有界的输入信号,系统都能得到有界的系统响应。或者系统
的单位脉冲响应满足绝对可和的条件。系统的稳定性由其差分方程的系数决定。
实际中检查系统是否稳定,不可能检查系统对所有有界的输入信号,输出是否都是有
界输出,或者检查系统的单位脉冲响应满足绝对可和的条件。可行的方法是在系统的输入
端加入单位阶跃序列,如果系统的输出趋近一个常数(包括零),就可以断定系统是稳定
的。系统的稳态输出是指当n→∞时,系统的输出。如果系统稳定,信号加入系统后,系统
输出的开始一段称为暂态效应,随n的加大,幅度趋于稳定,达到稳态输出。
注意在以下实验中均假设系统的初始状态为零。
x[n] y[n]
Discrete-time
systme
N M
其输入、输出关系可用以下差分方程描述: a
k =0
k y[n − k ] = bk x[n − m]
k =0
2、用函数 impz 和 dstep 求解离散系统的单位脉冲响应和单位阶跃响应。
满足初始条件 y(-1)=0,x(-1)=0,求系统的单位脉冲响应和单位阶跃响应。
解: 将 y(n)项的系数 a0 进行归一化,得到
y(n)+1/3y(n-2)=1/6x(n)+1/2x(n-1)+1/2x(n-2)+1/6x(n-3)
程序清单如下:
a=[1,0,1/3,0];
b=[1/6,1/2,1/2,1/6];
N=32;
n=0:N-1;
hn=impz(b,a,n);
gn=dstep(b,a,n);
subplot(1,2,1);stem(n,hn,'k');
title('系统的单位序列响应');
ylabel('h(n)');xlabel('n');
axis([0,N,1.1*min(hn),1.1*max(hn)]);
subplot(1,2,2);stem(n,gn,'k');
title('系统的单位阶跃响应');
ylabel('g(n)');xlabel('n');
axis([0,N,1.1*min(gn),1.1*max(gn)]);
0.4 1
0.9
0.3
0.8
h(n)
g(n)
0.2 0.7
0.6
0.1
0.5
0 0.4
0.3
-0.1
0.2
0 10 20 30 0 10 20 30
n n
图 2-1
注意:原式非标准形式,必须化为标准形式后再列出系数 b,a。
程序清单如下:
x01=0;y01=0;
a=[1,0,0,0,-1/3,0,0];
b=[1/6,0,-1/2,0,1/2,0,-1/6];
N=32;n=0:N-1;
xi=filtic(b,a,0);
x1=[n==0];
hn=filter(b,a,x1,xi);
x2=[n>=0];
gn=filter(b,a,x2,xi);
subplot(1,2,1);stem(n,hn,'k');
title('系统的单位序列响应');
ylabel('h(n)');xlabel('n');
axis([0,N,1.1*min(hn),1.1*max(hn)]);
subplot(1,2,2);stem(n,gn,'k');
title('系统的单位阶跃响应');
ylabel('g(n)');xlabel('n');
axis([0,N,1.1*min(gn),1.1*max(gn)]);
系统的单位序列响应 系统的单位阶跃响应
0.6
0.2
0.4
0.1
0.2
0
h(n)
g(n)
0
-0.1
-0.2
-0.2
-0.4
-0.3
0 10 20 30 0 10 20 30
n n
图 2-2
求解两个序列的卷积和,关键在于如何确定卷积结果的时宽区间。MATLAB 提供的
求卷积函数 conv 默认两个序列的序号均从 n=0 开始,卷积结果 y 对应的序列的序号也从
n=0 开始。
n1=0:20;
f1=0.8.^n1;
subplot(2,2,1);stem(n1,f1,'filled');
title('f1(n)');
n2=0:10;
N2=length(n2);
f2=ones(1,N2);
subplot(2,2,2);stem(n2,f2,'filled');
title('f2(n)');
y=conv(f1,f2);
subplot(2,1,2);stem(y,'filled');
f1(n) f2(n)
1 1
0.8 0.8
0.6 0.6
0.4 0.4
0.2 0.2
0 0
0 5 10 15 20 0 5 10
0
0 5 10 15 20 25 30 35
图 2-3
2)非零起始序列的卷积运算:
由卷积原理可知,若待卷积的两个序列序号分别为 {x(n);nx=nxs:nxf},{h(n);
nh=nhs:nhf},则卷积和 y(n)的序号起点和终点分别为:nys=nxs+nhs,nyf=nxf+nhf。据此
可定义通用卷积函数 convu:
function[y,ny]=convu(h,nh,x,nx)
nys=nh(1)+nx(1);nyf=nh(end)+nx(end);
y=conv(h,x);ny=nys:nyf;
程序清单如下:
n1=0:10;f1=0.5*n1;
n2=-2:10;nt=length(n2);
f2=ones(1,nt);
[y,ny]=convu(f1,n1,f2,n2);
subplot(2,2,1);stem(n1,f1);
subplot(2,2,2);stem(n2,f2);
subplot(2,1,2);stem(ny,y);
5 1
4 0.8
3 0.6
2 0.4
1 0.2
0 0
0 5 10 -5 0 5 10
30
20
10
0
-5 0 5 10 15 20
图 2-4
3)卷积积分的动态过程演示:
为了更深入地理解序列卷积的原理,下面提供一段演示卷积和的动态过程的程序。
程序清单如下:
clf;
nf1=0:20;
f1=0.8.^n1;
lf1=length(n1);
nf2=0:10;
lf2=length(n2);
f2=ones(1,lf2);
m=max(lf2,lf1);
if lf2>lf1 nf2=0;nf1=lf2-lf1;
else nf2=0;lf1=0;
end;
lt=m;
u=[zeros(1,lt),f2,zeros(1,nf2),zeros(1,lt)];
t1=(-lt+1:2*lt);
f1=[zeros(1,2*lt),f1,zeros(1,nf1)];
hf1=fliplr(f1);
N=length(hf1);
y=zeros(1,3*lt);
for k=0:2*lt
p=[zeros(1,k),hf1(1:N-k)];
y1=u.*p;
yk=sum(y1);
y(k+lt+1)=yk;
subplot(4,1,1);stem(t1,u);
subplot(4,1,2);stem(t1,p);
subplot(4,1,3);stem(t1,y1);
subplot(4,1,4);stem(k,yk);
axis([-20,50,0,5]);hold on
pause(2);
end
0.5
0
-15 -10 -5 0 5 10 15 20 25 30
1
0.5
0
-15 -10 -5 0 5 10 15 20 25 30
1
-1
-15 -10 -5 0 5 10 15 20 25 30
5
0
-20 -10 0 10 20 30 40 50
图 2-5
程序清单如下:
N=16;
n=0:N-1;
x=[ones(1,N/4),zeros(1,3*N/4)];
subplot(2,2,1);stem(n,x);
a=[1,0,1/3,0,];
b=[1/6,1/2,1/2,1/6];
hn=impz(b,a,n);
subplot(2,2,2);stem(n,hn);
y=conv(x,hn);
subplot(2,1,2);stem(y);
程 序 运 行 结 果 如 图 2-6 所 示 :
1 0.6
0.8
0.4
0.6
0.2
0.4
0
0.2
0 -0.2
0 5 10 15 0 5 10 15
1.5
0.5
-0.5
0 5 10 15 20 25 30 35
图 2-6
n 1
输入两个正弦叠加的序列 x = sin + sin(10n) ,求该系统的响应。
2 3
程序清单如下:
nx=0:8*pi;
x=sin(nx/2)+sin(10*nx)/3;
subplot(3,1,1);stem(nx,x);
a=[1,-0.34319,0.60439,-0.20407];
b=[0.1321,0.3963,0.3963,0.1321];
nh=0:9;h=impz(b,a,nh);
subplot(3,1,2);stem(nh,h);
y=dlsim(b,a,x);
subplot(3,1,3);stem(y);
程序运行结果如图 2-7 所示
-2
0 5 10 15 20 25
0.5
-0.5
0 1 2 3 4 5 6 7 8 9
1
-1
0 5 10 15 20 25 30
图 2-7
程序清单如下:
a=[1,-1.5,0.5];
b=1;
N=20;n=0:N-1;
x=0.25.^n;
x0=zeros(1,N);
y01=[4,10];
xi=filtic(b,a,y01);
y0=filter(b,a,x0,xi);
xi0=filtic(b,a,0);
y1=filter(b,a,x,xi0);
y=filter(b,a,x,xi);
y2=((1/3)*(1/4).^n+(1/2).^n+(2/3)).*ones(1,N);
subplot(2,3,1);stem(n,x);
title('输入信号 x(n)');
subplot(2,3,2);stem(n,y0);
title('系统的零输入响应');
subplot(2,3,3);stem(n,y1);
title('系统的零状态响应');
subplot(2,2,3);stem(n,y);
subplot(2,2,4);stem(n,y2);
title('经典法求得的完全响应');
0.8
0 2
0.6
0.4
-1 1
0.2
0 -2 0
0 10 20 0 10 20 0 10 20
用 filter求得的完全响应 经典法求得的完全响应
2 2
1.5 1.5
1 1
0.5 0.5
0 0
0 5 10 15 20 0 5 10 15 20
图 2-8
一个求解频率响应的实用函数。
function[db,mag,pha,grd,w]=freqz_m(b,a);
[H,w]=freqz(b,a,1000,'whole');
H=(H(1:501))';w=(w(1:501))';
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
grd=grpdelay(b,a,w);
例 2-9 已知某离散时间系统的系统函数为
0.1321 + 0.3963z −2 + 0.3963z −4 + 0.1321z −6
H ( z) =
1 − 0.34319 z −2 + 0.60439 z −4 − 0.20407 z −6
程序清单如下:
b=[0.1321,0,0.3963,0,0.3963,0,0.1321];
a=[1,0,-0.34319,0,0.60439,0,-0.20407];
[db,mag,pha,grd,w]=freqz_m(b,a);
subplot(2,2,1);plot(w/pi,mag);grid
axis([0,1,1.1*min(mag),1.1*max(mag)]);
title('幅频特性(V)');
xlabel('\omega/\pi');ylabel('幅度(V)');
subplot(2,2,2);plot(w/pi,pha);grid;
axis([0,1,1.1*min(pha),1.1*max(pha)]);
xlabel('\omega/\pi');ylabel('相位');
title('相频特性');
subplot(2,2,3);plot(w/pi,db);grid
axis([0,1,-100,5]);
title('幅频特性(dB)');
subplot(2,2,4);plot(w/pi,grd);grid
axis([0,1,0,10])
title('群时延');
相位
0.6
0
0.4
0.2 -2
0 0.5 1 0 0.5 1
/ /
幅频特性( dB) 群时延
0 10
-50 5
-100 0
0 0.5 1 0 0.5 1
三、实验内容及步骤
x 2 ( n) = u ( n)
b) 求出系统的单位冲响应,画出其波形。
(3)给定系统的单位脉冲响应为
形。
(4)给定一谐振器的差分方程为
b) 给定输入信号为
求出系统的输出响应,并画出其波形。
实验预习:
4.思考题
(1) 如果输入信号为无限长序列,系统的单位脉冲响应是有限长序列,可否用线性卷
积法求系统的响应? 如何求?
(2)如果信号经过低通滤波器,把信号的高频分量滤掉,时域信号会有何变化,用前
面第一个实验结果进行分析说明。
5.实验报告要求
(1)简述在时域求系统响应的方法。
(2)简述通过实验判断系统稳定性的方法。分析上面第三个实验的稳定输出的波形。
(3)对各实验所得结果进行简单分析和解释。列出本实验提出的有关 MATLAB 函数
在调用时应注意的问题。
(4)简要回答思考题。
(5)打印要求的各信号波形。
实验 3 时域采样与频域采样
1. 实验目的
时域采样理论与频域采样理论是数字信号处理中的重要理论。要求掌握模拟信号采样
前后频谱的变化,以及如何选择采样频率才能使采样后的信号不丢失信息;要求掌握频率
域采样会引起时域周期化的概念,以及频率域采样定理及其对频域采样点数选择的指导作
用。
2. 实验原理与方法
时域采样定理的要点是:
1
Xˆ a ( j) = FT [ xˆ a (t )] = X a ( j − jn s )
T n = −
b) 采样频率 s 必须大于等于模拟信号最高频率的两倍以上,才能使采样信号
的
频谱不产生频谱混叠。
利用计算机计算上式并不方便,下面我们导出另外一个公式,以便用计算机上进行实验。
xˆ a (t ) = x a (t ) (t − nT )
n = −
对上式进行傅立叶变换,得到:
Xˆ a ( j) = [ x a (t ) (t − nT )]e − jt dt
−
n = −
= x a (t ) (t − nT )e − jt dt
−
n = −
在上式的积分号内只有当 t = nT 时,才有非零值,因此:
Xˆ a ( j) = x
n = −
a (nT )e − jnT
上式中,在数值上 x a (nT ) = x(n) ,再将 = T 代入,得到:
Xˆ a ( j) = x ( n )e
n = −
− j n
j
上式的右边就是序列的傅立叶变换 X (e ) ,即
Xˆ a ( j) = X (e j ) =T
上式说明理想采样信号的傅立叶变换可用相应的采样序列的傅立叶变换得到,只要将自变
量 ω 用 T 代替即可。
频域采样定理的要点是:
a) 对信号 x(n)的频谱函数 X(ejω)在[0,2π]上等间隔采样 N 点,得到
X N (k ) = X (e j ) = 2 k N
, k = 0,1, 2, , N −1
区序列,公式为:
xN (n) = IDFT[ X N (k )]N = [ x(n + iN )]RN (n)
i =−
长度 M 短,因此。 xN ( n) 与 x(n)不相同。
在数字信号处理的应用中,只要涉及时域或者频域采样,都必须服从这两个采样理论
的要点。
对比上面叙述的时域采样原理和频域采样原理,得到一个有用的结论,这两个采样理
论具有对偶性:“时域采样频谱周期延拓,频域采样时域信号周期延拓”。因此放在一起进
行实验。
3. 实验内容及步骤
(1)时域采样理论的验证。
−t
给定模拟信号, x a (t ) = Ae sin( 0 t )u (t )
图 3.1 x a (t ) 的幅频特性曲线
现用 DFT(FFT)求该模拟信号的幅频特性,以验证时域采样理论。
安照 x a (t ) 的幅频特性曲线,选取三种采样频率,即 Fs =1kHz,300Hz,200Hz。
观测时间选 T p = 50ms 。
为使用 DFT,首先用下面公式产生时域离散信号,对三种采样频率,采样序列按
X(k)=FFT[x(n)] , k=0,1,2,3,-----,M-1
2
式中 k 代表的频率为 k = k。
M
要求: 编写实验程序,计算 x1 ( n) 、 x 2 (n) 和 x3 (n) 的幅度特性,并绘图显示。观察
分析频谱混叠失真。
(2)频域采样理论的验证。
给定信号如下:
n + 1 0 n 13
x(n) = 27 − n 14 n 26
0 其它
和 16 点,得到 X 32 (k )和X 16 (k ) :
X 32 (k ) = X (e j ) 2 , k = 0,1, 2, 31
= k
32
X 16 (k ) = X (e j ) 2 , k = 0,1, 2, 15
= k
16
j
分别画出 X (e ) 、X 32 (k )和X 16 (k ) 的幅度谱,并绘图显示 x(n)、x32 (n)和x16 (n) 的波形,
进行对比和分析,验证总结频域采样理论。
提示:频域采样用以下方法容易变程序实现。
j
① 直接调用 MATLAB 函数 fft 计算 X 32 (k ) = FFT[ x(n)]32 就得到 X (e ) 在 [0,2 ] 的
32 点频率域采样
j
② 抽取 X 32 (k ) 的偶数点即可得到 X (e ) 在 [0,2 ] 的 16 点频率域采样 X16 (k ) ,即
X16 (k ) 。
4.思考题:
j
如果序列 x(n)的长度为 M,希望得到其频谱 X (e ) 在 [0,2 ] 上的 N 点等间隔采样,
当 N<M 时,如何用一次最少点数的 DFT 得到该频谱采样?
5. 实验报告及要求
a) 运行程序打印要求显示的图形, 。
b) 分析比较实验结果,简述由实验得到的主要结论
c) 简要回答思考题
d) 附上程序清单和有关曲线。
附:实验程序清单
1 时域采样理论的验证程序清单
% 时域采样理论验证程序 exp2a.m
Tp=64/1000; %观察时间 Tp=64 微秒
%产生 M 长采样序列 x(n)
% Fs=1000;T=1/Fs;
Fs=1000;T=1/Fs;
M=Tp*Fs;n=0:M-1;
A=444.128;alph=pi*50*2^0.5;omega=pi*50*2^0.5;
xnt=A*exp(-alph*n*T).*sin(omega*n*T);
Xk=T*fft(xnt,M); %M 点 FFT[xnt)]
yn='xa(nT)';subplot(3,2,1);
tstem(xnt,yn); %调用自编绘图函数 tstem 绘制序列图
box on;title('(a) Fs=1000Hz');
k=0:M-1;fk=k/Tp;
subplot(3,2,2);plot(fk,abs(Xk));title('(a) T*FT[xa(nT)],Fs=1000Hz');
xlabel('f(Hz)');ylabel('幅度');axis([0,Fs,0,1.2*max(abs(Xk))])
%=================================================
% Fs=300Hz 和 Fs=200Hz 的程序与上面 Fs=1000Hz 完全相同。
2 频域采样理论的验证程序清单
%频域采样理论验证程序 exp2b.m
M=27;N=32;n=0:M;
%产生 M 长三角波序列 x(n)
xa=0:floor(M/2); xb= ceil(M/2)-1:-1:0; xn=[xa,xb];
Xk=fft(xn,1024); %1024 点 FFT[x(n)], 用于近似序列 x(n)的 TF
X32k=fft(xn,32) ;%32 点 FFT[x(n)]
x32n=ifft(X32k); %32 点 IFFT[X32(k)]得到 x32(n)
X16k=X32k(1:2:N); %隔点抽取 X32k 得到 X16(K)
x16n=ifft(X16k,N/2); %16 点 IFFT[X16(k)]得到 x16(n)
subplot(3,2,2);stem(n,xn,'.');box on
title('(b) 三角波序列 x(n)');xlabel('n');ylabel('x(n)');axis([0,32,0,20])
k=0:1023;wk=2*k/1024; %
subplot(3,2,1);plot(wk,abs(Xk));title('(a)FT[x(n)]');
xlabel('\omega/\pi');ylabel('|X(e^j^\omega)|');axis([0,1,0,200])
k=0:N/2-1; subplot(3,2,3);stem(k,abs(X16k),'.');box on
title('(c) 16 点频域采样');xlabel('k');ylabel('|X_1_6(k)|');axis([0,8,0,200])
n1=0:N/2-1; subplot(3,2,4);stem(n1,x16n,'.');box on
title('(d) 16 点 IDFT[X_1_6(k)]');xlabel('n');ylabel('x_1_6(n)');axis([0,32,0,20])
k=0:N-1; subplot(3,2,5);stem(k,abs(X32k),'.');box on
title('(e) 32 点频域采样');xlabel('k');ylabel('|X_3_2(k)|');axis([0,16,0,200])
n1=0:N-1; subplot(3,2,6);stem(n1,x32n,'.');box on
title('(f) 32 点 IDFT[X_3_2(k)]');xlabel('n');ylabel('x_3_2(n)');axis([0,32,0,20])
实验 4 用 FFT 对信号作频谱分析
1. 实验目的:
2. 实验原理
用 FFT 对信号作频谱分析是学习数字信号处理的重要内容。经常需要进行谱分析的信
号是模拟信号和时域离散信号。对信号进行谱分析的重要问题是频谱分辨率 D 和分析误
差。频谱分辨率直接和 FFT 的变换区间 N 有关,因为 FFT 能够实现的频率分辨率是 2 / N ,
因此要求 2 / N D 。可以根据此式选择 FFT 的变换区间 N。误差主要来自于用 FFT 作
频谱分析时,得到的是离散谱,而信号(周期信号除外)是连续谱,只有当 N 较大时离散
谱的包络才能逼近于连续谱,因此 N 要适当选择大一些。
周期信号的频谱是离散谱,只有用整数倍周期的长度作 FFT,得到的离散谱才能代表
周期信号的频谱。如果不知道信号周期,可以尽量选择信号的观察时间长一些。
对模拟信号进行谱分析时,首先要按照采样定理将其变成时域离散信号。如果是模拟
周期信号,也应该选取整数倍周期的长度,经过采样后形成周期序列,按照周期序列的谱
分析进行。
相关概念与 Matlab
1、离散傅里叶变换(DFT)
(1)DFT 与 IDFT
在实际中常常使用有限长序列。如果有限长序列为 x(n),则该序列的离散傅里叶变换
对可表示为
N-1
X(k)=DFT[x(n)] = x(n)WNnk k=0,1,2, ,N-1
n=0
1 N-1
x(n)=IDFT[X(k)]=
N k=0
X(k)WN-nk n=0,1,2, ,N-1
从离散傅里叶变换定义式可以看出,有限长序列在时域上是离散的,在频域上也是离
2π
-j
散的,式中 WN =e N
,即仅在单位圆上 N 个等间距的点上取值,这为使用计算机进行处
理带来了方便。
① 画出序列傅里叶变换对应的|X(k)|和 arg[X(k)]图形。
② 画出 x(n)图形,并与 IDFT[X(k)]图形进行比较。
程序清单如下:
xn=[0,1,2,3,4,5,6,7];
N=length(xn);
n=0:N-1;
k=0:N-1;
Xk=xn*exp(-j*2*pi/N).^(n'*k);
x=(Xk*exp(j*2*pi/N).^(n'*k))/N;
subplot(2,2,1);stem(n,xn);
title('x(n)');axis([-1,N,1.1*min(xn),1.1*max(xn)]);
subplot(2,2,2);stem(n,abs(x));
title('IDFT|X(k)|');axis([-1,N,1.1*min(x),1.1*max(x)]);
subplot(2,2,3),stem(k,abs(Xk));
title('|X(k)|');axis([-1,N,1.1*min(abs(Xk)),1.1*max(abs(Xk))]);
subplot(2,2,4),stem(k,angle(Xk));
title('arg|X(k)|');axis([-1,N,1.1*min(angle(Xk)),1.1*max(angle(Xk))]);
6 6
4 4
2 2
0
0 2 4 6 8 0 2 4 6 8
|X(k)| arg|X(k)|
30
2
20
0
10 -2
0 2 4 6 8 0 2 4 6 8
图 4-4
将周期序列的傅里叶级数变换对和有限长序列的离散傅里叶变换对进行比较可见,两
nk
者的区别仅仅是将周期序列 x(n) 换成了有限长序列 x(n),同时,由于式中 WN 的周期性,
因而有限长序列的离散傅里叶变换实际上隐含着周期性。
① 画出主值序列周期序列的波形。
程序清单如下:
xn=[0,1,2,3,4,5,6,7];
N=length(xn);
m=0:N-1;
n=0:4*N-1;
k=0:4*N-1;
xn1=xn(mod(n,N)+1);
Xk=xn1*exp(-j*2*pi/N).^(n'*k);
subplot(2,2,1);stem(m,xn);
title('x(n)');
subplot(2,2,2);stem(n,xn1);
title('周期序列');
subplot(2,2,3),stem(k,abs(Xk));
title('|X(k)|');axis([-1,4*N,1.1*min(abs(Xk)),1.1*max(abs(Xk))]);
subplot(2,2,4),stem(k,angle(Xk));
title('arg|X(k)|');axis([-1,4*N,1.1*min(angle(Xk)),1.1*max(angle(Xk))]);
上的情况也一样。从这个意义上说,周期序列只有有限个序列值有意义。
若离散时间非周期序列为 x(n),则它的离散傅里叶变换(DTFT)对定义为
DTFT[x(n)]=X(e jω )= x(n)e -jωn
n=-
1 π
2π -π
IDTFT[X(e jω )]=x(n)= X(e jω )e jωn dω
jω jω jω ( ) jω
其中 X(e ) 称为序列的频谱。可表示为 X(e )= X(e ) e , X(e ) 称为序列的幅
x(n) 周期序列
8 8
6 6
4 4
2 2
0 0
0 2 4 6 8 0 10 20 30 40
|X(k)| arg|X(k)|
120
2
100
80
0
60
40 -2
20
0 10 20 30 0 10 20 30
图 4-5
( )
度谱, e 称为序列的相位谱。
由 DTFT 的定义可见,序列在时域是离散的、非周期的,在频域是连续的、周期的。
jω
与有限长序列相比, X(e ) 仅在单位圆上取值,X(k)是在单位圆上 N 个等间距的点上
jω
取值。因此,连续谱 X(e ) 可由离散谱 X(k)经插值后得到。
要求:
① 画出序列 x(n)的图形。
jω ( )
② 画出由 DTFT 求出的幅度谱 X(e ) 和相位谱 e 的图形。
程序清单如下:
xn=[0,1,2,3,4,5,6,7];
N=length(xn);
n=0:N-1;
w=linspace(-2*pi,2*pi,500);
X=xn*exp(-j*n'*w);
subplot(3,1,1);stem(n,xn);box on;
title('x(n)');
subplot(3,1,2);plot(w,abs(X));
title('|X(e^j\omega)|');axis([-2*pi,2*pi,1.1*min(abs(X)),1.1*max(abs(X))]);
subplot(3,1,3),plot(w,angle(X));
title('e^\phi(\omega)');axis([-2*pi,2*pi,1.1*min(angle(X)),1.1*max(angle(X))]);
x(n)
10
0
0 1 2 3 4 5 6 7
|X(e )|
j
30
20
10
-6 -4 -2 0 2 4 6
e ()
2
0
-2
-6 -4 -2 0 2 4 6
图 4-6
jω
与图 4-4 相比,两者有一定差别。主要原因在于,该例进行 DTFT 时, X(e ) 在单位
x(n) IDFT|X(k)|
6 6
4 4
2 2
0 0
0 50 100 0 50 100
|X(k)| arg|X(k)|
30
2
20
0
10 -2
0 50 100 0 50 100
图 4-7
程序清单如下:
N=100
xn=[0,1,2,3,4,5,6,7,zeros(1,N-8)];
n=0:N-1;
k=0:N-1;
Xk=xn*exp(-j*2*pi/N).^(n'*k);
x=(Xk*exp(j*2*pi/N).^(n'*k))/N;
subplot(2,2,1);stem(n,xn);
title('x(n)');axis([-1,N,1.1*min(xn),1.1*max(xn)]);
subplot(2,2,2);stem(n,abs(x));
title('IDFT|X(k)|');axis([-1,N,1.1*min(x),1.1*max(x)]);
subplot(2,2,3),stem(k,abs(Xk));
title('|X(k)|');axis([-1,N,1.1*min(abs(Xk)),1.1*max(abs(Xk))]);
subplot(2,2,4),stem(k,angle(Xk));
title('arg|X(k)|');axis([-1,N,1.1*min(angle(Xk)),1.1*max(angle(Xk))]);
2、FFT
由理论学习可知,DFT 是唯一在时域和频域均离散的变换方法,它适用于有限长序列。
尽管这种变换方法是可以用于数值计算的,但如果只是简单地按照定义进行数据处理,当
序列长度很大时,将占用很大的内存空间,且运算时间很长。
程序清单如下:
n1=0;n2=7;n0=4;
n=n1:n2;N=length(n);
xn=[(n-n0)>=0];
subplot(2,2,1);stem(n,xn);
title('x(n)');
k=0:N-1;
Xk=fft(xn,N);
subplot(2,1,2);stem(k,abs(Xk));
title('Xk=DFT(xn)');
xn1=ifft(Xk,N);
subplot(2,2,2);stem(n,xn1);
title('x(n)=IDFT(Xk)');
x(n) x(n)=IDFT(Xk)
1 1
0.8 0.8
0.6 0.6
0.4 0.4
0.2 0.2
0 0
0 2 4 6 8 0 2 4 6 8
Xk=DFT(xn)
4
0
0 1 2 3 4 5 6 7
图 4-9
① 对有限长序列进行谱分析
jω
一个序号从 n1 到 n2 的时域有限长序列 x(n),它的频谱 X(e ) 定义为它的离散傅里叶
2π
ωk =k( )=kdω
N
式中: dω 为数字频率的分辨率;k 取对应-(N-1)/2 到(N-1)/2 区间的整数。
在实际使用中,往往要求计算出信号以模拟频率为横坐标的频谱,此时对应的模拟频
率为
ωk 2π 2π
Ωk = =k( )=k( )=kD
Ts NTs L
程序清单如下
Fs=10;
xn=[1,2,3,2,1];
N=length(xn);
D=2*pi*Fs/N;
k=floor(-(N-1)/2:(N-1)/2);
X=fftshift(fft(xn,N));
subplot(1,2,1);plot(k*D,abs(X),'o:');
title('幅度频谱');xlabel('rad/s');
subplot(1,2,2);plot(k*D,angle(X),'o:');
title('相位频谱');xlabel('rad/s');
8
2
7
6 1
5
0
4
3 -1
2
-2
1
0 -3
-40 -20 0 20 40 -40 -20 0 20 40
rad/s rad/s
图 4-10
Fs=10;N=1000;
xn=[1,2,3,2,1];
Nx=length(xn);
xn=[1,2,3,2,1,zeros(1,N-Nx-1)];
D=2*pi*Fs/N;
k=floor(-(N-1)/2:(N-1)/2);
X=fftshift(fft(xn,N));
subplot(1,2,1);plot(k*D,abs(X));
title('幅度频谱');xlabel('rad/s');
subplot(1,2,2);plot(k*D,angle(X));
title('相位频谱');xlabel('rad/s');
8 3
7
2
6
1
5
0
4
-1
3
-2
2
1 -3
0 -4
-40 -20 0 20 40 -40 -20 0 20 40
rad/s rad/s
图 4-11
例 4-9 已知一个矩形窗函数序列为
1 |n|≤5
x(n)=
0 |n|>5
xn=[ones(1,6),zeros(1,N-11),ones(1,5)]
程序清单如下:
Ts=0.5;C=[32,64,512];
for r=0:2;
N=C(r+1);
xn=[ones(1,6),zeros(1,N-11),ones(1,5)];
D=2*pi/(N*Ts);
k=floor(-(N-1)/2:(N-1)/2);
X=fftshift(fft(xn,N));
subplot(3,2,2*r+1);plot(k*D,abs(X));
subplot(3,2,2*r+2);stairs(k*D,angle(X));
end
15 4
10
2
5
0 0
-10 -5 0 5 10 -10 -5 0 5 10
15 4
10
2
5
0 0
-10 -5 0 5 10 -10 -5 0 5 10
15 5
10
0
5
0 -5
-10 -5 0 5 10 -10 -5 0 5 10
图 4-12
如果将 x(n)的输入写成
xn=[ones(1,11),zeros(1,N-11)];
10 2
8 1
6 0
4 -1
2 -2
0 -3
-10 -5 0 5 10 -10 -5 0 5 10
图 4-13
② 对无限长序列进行谱分析
用 FFT 进行无限长序列的频谱分析,首先要将无限长序列截断成一个有限长序列。序
列长度的取值对频谱有较大的影响,带来的问题是引起频谱的泄漏和波动。
程序清单如下:
Fs=20;C=[8,16,128];
for r=0:2;
N=C(r+1);
n=0:N-1;
xn=exp(-0.5*n);
D=2*pi*Fs/N;
k=floor(-(N-1)/2:(N-1)/2);
X=fftshift(fft(xn,N));
subplot(3,2,2*r+1);plot(k*D,abs(X));
axis([-80,80,0,3]);
subplot(3,2,2*r+2);stairs(k*D,angle(X));
axis([-80,80,-1,1]);
end
程序运行结果如图 4-14 所示。由图可见,N 值取得越大,即序列保留的越长,曲线精
度越高。
3 1
2
0
1
0 -1
-50 0 50 -50 0 50
3 1
2
0
1
0 -1
-50 0 50 -50 0 50
3 1
2
0
1
0 -1
-50 0 50 -50 0 50
图 4-14
xa(t)=e-0.01t(sin2t+sin2.1t+sin2.2t) t>0
该题选择了三个非常接近的正弦信号,为了将各频率成分区分出来,在满足奈奎斯特
定理的条件下确定采样周期,选择三组数据,分别是 Ts=0.5s,0.25s,0.125s;再确定 N
值,分别选择 N=256 和 N=2048。观察不同 Ts 和 N 的组合对频谱分析的影响。
程序清单如下:
T0=[0.5,0.25,0.125,0.125];
N0=[256,256,2048,2048];
for r=1:4;
Ts=T0(r);N=N0(r);
n=0:N-1;
xn=exp(-0.5*n);
D=2*pi/(N*Ts);
xa=exp(-0.01*n*Ts).*(sin(2*n*Ts)+sin(2.1*n*Ts)+sin(2.2*n*Ts));
k=floor(-(N-1)/2:(N-1)/2);
Xa=Ts*fftshift(fft(xa,N));
[r,Xa(1)]
subplot(2,2,r);plot(k*D,abs(Xa));
axis([1,3,1.1*min(abs(Xa)),1.1*max(abs(Xa))]);
end
Ts=0.5,N=256 Ts=0.25,N=256
40
25
30 20
20 15
10
10
5
40 40
30 30
20 20
10 10
图 4-15
由图 4-15 可以得出以下结论:
三、实验步骤及内容
(1)对以下序列进行谱分析。
x1 (n) = R4 (n)
n + 1, 0n3
x 2 (n) = 8 − n, 4n7
0 , 其它n
4 − n, 0n3
x3 (n) = n − 3, 4n7
0, 其它n
选择 FFT 的变换区间 N 为 8 和 16 两种情况进行频谱分析。分别打印其幅频特性曲线。
并进行对比、分析和讨论。
(2)对以下周期序列进行谱分析。
x4 (n) = cos n
4
x5 (n) = cos( n / 4) + cos( n /8)
选择 FFT 的变换区间 N 为 8 和 16 两种情况分别对以上序列进行频谱分析。分别打印
其幅频特性曲线。并进行对比、分析和讨论。
(3)对模拟周期信号进行谱分析
特性,并进行分析和讨论。
预习:自学以上 DFT 与 FFT 实验与代码
4.思考题
(1)对于周期序列,如果周期不知道,如何用 FFT 进行谱分析?
(2)如何选择 FFT 的变换区间?(包括非周期信号和周期信号)
5.实验报告要求
1、列写调试通过的实验程序,打印实验程序产生的曲线图形。
3、给出思考题答案。
实验 5 模拟滤波器分析设计及特性测试
1. 实验目的
学习模拟滤波器的网络分析和频响特性测量;根据给定的滤波器指标设计巴特沃斯型
低通滤波器。
1. 了解 RC 无源和有源滤波器的种类、基本结构及其特性。
2. 推导 RC 无源和有源滤波器的系统函数。
3. 用扫频法测试滤波器的幅频特性。
4. 绘制滤波器的幅频特性曲线,。
2. 模拟滤波器分析和设计
1. 模拟滤波器的传输函数
根据模拟滤波器的 S 域模型和对应的网络结构,可得实际系统的传输函数为:
式中 P( s −1 ) 和 Q( s −1 ) 分别代表分子、分母的 s 负幂次方多项式。因此:
1
Y (s) = P(s −1 ) F ( s)
Q(s −1 )
(3)
1
令:X = F (s) (4)
Q( s −1 )
X = F (s) − b1s −1 X + + bn s −n X
(6)
a2 均用标量乘法器,负号可用倒相器,求和用加法器。值得注意的问题是,积分运算单元
有积分时间常数 ,即积分运算单元的实际传递函数为 s −1 / ,所示标量乘法器的标量
u2 (s) 1
H (S ) = =
u1 (s) 1 + 1 s −1
RC
(8)
如 RC 值等于积分器的时间常数 ,则可以用图 6(b)所示的模拟装置来模拟,该装置只用
了一个加法器和一个积分时间常数为 的反相积分器。
附:用信号流图法,有
据此信号的流图可画出图 2 所示的模拟系统的方框图。
图 6-1 模拟框图
图 6-2 系统模拟框图
图 6-3 一阶 RC 电路模拟
(a) 一阶 RC 电路;(b) 模拟电路
R = 5.1K R = 5.1K
U1 U2
C = 0.047 F
2.RC 低通滤波器的频响特性的测量:
将信号源的输出(A)接实验板的 IN2,滤波后的输出信号 OUT2 接示波器的输入(B) 。
根据被测电路的参数及系统的幅频特性,将输入信号的频率从低到高逐次改变十 次以上
(幅度保持 Vipp=10v) , 逐个测量输出信号的峰峰值大小(Vopp) 及 Φ(ω),并将测量数据
填入表二:
表二
Vi(V) 10 10 10 10 10 10 10 10 10 10
f(Hz)
Vo(v)
φ(ω)
1.实验目的
(1)熟悉用双线性变换法设计 IIR 数字滤波器的原理与方法;
(2)学会调用 MATLAB 信号处理工具箱中滤波器设计函数(或滤波器设计分析工具
fdatool)设计各种 IIR 数字滤波器,学会根据滤波需求确定滤波器指标参数。
(3)掌握 IIR 数字滤波器的 MATLAB 实现方法。
(3)通过观察滤波器输入输出信号的时域波形及其频谱,建立数字滤波的概念。
2.实验原理
设计 IIR 数字滤波器一般采用间接法(脉冲响应不变法和双线性变换法),应用最广泛
的是双线性变换法。基本设计过程是:①先将给定的数字滤波器的指标转换成过渡模拟滤
波器的指标; ②设计过渡模拟滤波器;③将过渡模拟滤波器系统函数转换成数字滤波器
的系统函数。MATLAB 信号处理工具箱中的各种 IIR 数字滤波器设计函数都是采用双线性
变换法。第六章介绍的滤波器设计函数 butter、cheby1 、cheby2 和 ellip 可以分别被调用
来直接设计巴特沃斯、切比雪夫 1、切比雪夫 2 和椭圆模拟和数字滤波器。本实验要求读
者调用如上函数直接设计 IIR 数字滤波器。
本实验的数字滤波器的 MATLAB 实现是指调用 MATLAB 信号处理工具箱函数 filter
对给定的输入信号 x(n)进行滤波,得到滤波后的输出信号 y(n) 。
3. 实验内容及步骤
(1)调用信号产生函数 mstg 产生由三路抑制载波调幅信号相加构成的复合信号 st,
该函数还会自动绘图显示 st 的时域波形和幅频特性曲线,如图 6.1 所示。由图可见,三路
信号时域混叠无法在时域分离。但频域是分离的,所以可以通过滤波的方法在频域分离,
这就是本实验的目的。
弦波信号频率,且满足 f c f 0 。由上式可见,所谓抑制载波单频调幅信号,就是 2 个正
4.信号产生函数 mstg 清单
function st=mstg
%产生信号序列向量 st,并显示 st 的时域波形和频谱
%st=mstg 返回三路调幅信号相加形成的混合信号,长度 N=1600
N=1600 %N 为信号 st 的长度。
Fs=10000;T=1/Fs;Tp=N*T; %采样频率 Fs=10kHz,Tp 为采样时间
t=0:T:(N-1)*T;k=0:N-1;f=k/Tp;
fc1=Fs/10; %第 1 路调幅信号的载波频率 fc1=1000Hz,
fm1=fc1/10; %第 1 路调幅信号的调制信号频率 fm1=100Hz
fc2=Fs/20; %第 2 路调幅信号的载波频率 fc2=500Hz
fm2=fc2/10; %第 2 路调幅信号的调制信号频率 fm2=50Hz
fc3=Fs/40; %第 3 路调幅信号的载波频率 fc3=250Hz,
fm3=fc3/10; %第 3 路调幅信号的调制信号频率 fm3=25Hz
xt1=cos(2*pi*fm1*t).*cos(2*pi*fc1*t); %产生第 1 路调幅信号
xt2=cos(2*pi*fm2*t).*cos(2*pi*fc2*t); %产生第 2 路调幅信号
xt3=cos(2*pi*fm3*t).*cos(2*pi*fc3*t); %产生第 3 路调幅信号
st=xt1+xt2+xt3; %三路调幅信号相加
fxt=fft(st,N); %计算信号 st 的频谱
%====以下为绘图部分, 绘制 st 的时域波形和幅频特性曲线====================
subplot(3,1,1); plot(t,st);grid;xlabel('t/s');ylabel('s(t)');
axis([0,Tp/8,min(st),max(st)]);title('(a) s(t)的波形')
subplot(3,1,2); stem(f,abs(fxt)/max(abs(fxt)),'.');grid;title('(b) s(t)的频谱')
axis([0,Fs/5,0,1.2]);
xlabel('f/Hz');ylabel('幅度')
5.实验程序框图如图 6.2 所示,供读者参考。
调用 filter,用三个滤波器分别对信号 st 进行滤波,分离
出三路不同载波频率的调幅信号 y1(n)、y2(n)和 y3(n)
End
图 6.2 实验 4 程序框图
6.思考题
(1)请阅读信号产生函数 mstg,确定三路调幅信号的载波频率和调制信号频率。
(2)信号产生函数 mstg 中采样点数 N=800,对 st 进行 N 点 FFT 可以得到 6 根理想
谱线。如果取 N=1000,可否得到 6 根理想谱线?为什么?N=2000 呢?请改变函数 mstg
中采样点数 N 的值,观察频谱图验证您的判断是否正确。
(3)修改信号产生函数 mstg,给每路调幅信号加入载波成分,产生调幅(AM)信号,
重复本实验,观察 AM 信号与抑制载波调幅信号的时域波形及其频谱的差别。
7.实验报告要求
(1)简述实验目的及原理。
(2)画出实验主程序框图,打印程序清单。
(3)绘制三个分离滤波器的损耗函数曲线。
(4)绘制经过滤波分理出的三路调幅信号的时域波形。
(5)简要回答思考题。
滤波器参数及实验程序清单
1、滤波器参数选取
观察图 10.4.1 可知,三路调幅信号的载波频率分别为 250Hz、500Hz、1000Hz。带宽
(也可以由信号产生函数 mstg 清单看出)分别为 50Hz、100Hz、200Hz。所以,分离混合
信号 st 中三路抑制载波单频调幅信号的三个滤波器(低通滤波器、带通滤波器、高通滤波
器)的指标参数选取如下:
对载波频率为 250Hz 的条幅信号,可以用低通滤波器分离,其指标为
1.实验目的
(1)掌握用窗函数法设计 FIR 数字滤波器的原理和方法。
(2)掌握用等波纹最佳逼近法设计 FIR 数字滤波器的原理和方法。
(3)掌握 FIR 滤波器的快速卷积实现原理。
(4)学会调用 MATLAB 函数设计与实现 FIR 滤波器。
2. 实验内容及步骤
(1)认真复习第七章中用窗函数法和等波纹最佳逼近法设计 FIR 数字滤波器的原理;
(2)调用信号产生函数 xtg 产生具有加性噪声的信号 xt,并自动显示 xt 及其频谱,
如图 7.1 所示;
Fs=1000,T=1/Fs
xt=xtg
产生信号 xt, 并显示 xt 及其频谱
用窗函数法或等波纹最佳逼近法
设计 FIR 滤波器 hn
对信号 xt 滤波:yt=fftfilt(hn,xt)
1、计算并绘图显示滤波器损耗函数
2、绘图显示滤波器输出信号 yt
End
图 7.2 实验程序框图
4.思考题
(1)如果给定通带截止频率和阻带截止频率以及阻带最小衰减,如何用窗函数法设计线
性相位低通滤波器?请写出设计步骤.
1. 实验目的
理解 DFT 应用,熟悉参数选择等 DFT 分析在工程应用中的细节。
2、实验原理
双音多频(Dual Tone Multi Frequency, DTMF)信号是音频电话中的拨号信号,由
美国 AT&T 贝尔公司实验室研制,并用于电话网络中。这种信号制式具有很高的拨号速度,
且容易自动监测识别,很快就代替了原有的用脉冲计数方式的拨号制式。这种双音多频信
号制式不仅用在电话网络中,还可以用于传输十进制数据的其它通信系统中,用于电子邮
件和银行系统中。这些系统中用户可以用电话发送 DTMF 信号选择语音菜单进行操作。
DTMF 信号系统是一个典型的小型信号处理系统,它要用数字方法产生模拟信号并进
行传输,其中还用到了 D/A 变换器;在接收端用 A/D 变换器将其转换成数字信号,并进
行数字信号处理与识别。为了系统的检测速度并降低成本,还开发一种特殊的 DFT 算法,
称为戈泽尔(Goertzel)算法,这种算法既可以用硬件(专用芯片)实现,也可以用软件实现。
下面首先介绍双音多频信号的产生方法和检测方法,包括戈泽尔算法,最后进行模拟实验。
下面先介绍电话中的 DTMF 信号的组成。
在电话中,数字 0~9 的中每一个都用两个不同的单音频传输,所用的 8 个频率分成高
频带和低频带两组,低频带有四个频率:679Hz,770Hz,852Hz 和 941Hz;高频带也有四个
频率:1209Hz,1336Hz,1477Hz 和 1633Hz.。每一个数字均由高、低频带中各一个频率构成,
770Hz 4 5 6 B
852Hz 7 8 9 C
942Hz * 0 # D
DTMF 信号在电话中有两种作用,一个是用拨号信号去控制交换机接通被叫的用户电话
机,另一个作用是控制电话机的各种动作,如播放留言、语音信箱等。
电话中的双音多频(DTMF)信号的产生与检测
(1)双音多频信号的产生
数不能随意选取,要根据对信号频谱分析的要求进行确定。这里对信号频谱分析也有三个
要求: (1)频率分辨率, (2)谱分析的频谱范围,
(3)检测频率的准确性。
1. 频谱分析的分辨率
观察要检测的 8 个频率,相邻间隔最小的是第一和第二个频率,间隔是 73Hz,要求
按键的时间大于 40ms。
2 频谱分析的频率范围
要检测的信号频率范围是 697~1633Hz,但考虑到存在语音干扰,除了检测这 8 个频率
外,还要检测它们的二次倍频的幅度大小,波形正常且干扰小的正弦波的二次倍频是很小
的,如果发现二次谐波很大,则不能确定这是 DTMF 信号。这样频谱分析的频率范围为
3 检测频率的准确性
这是一个用 DFT 检测正弦波频率是否准确的问题。序列的 N 点 DFT 是对序列频谱
函数在 0~ 2 区间的 N 点等间隔采样,如果是一个周期序列,截取周期序列的整数倍周
期,进行 DFT,其采样点刚好在周期信号的频率上,DFT 的幅度最大处就是信号的准确频
率。分析这些 DTMF 信号,不可能经过采样得到周期序列,因此存在检测频率的准确性问
题。
率误差见表 10.6.2。
表 10.6.2
8 个基频 最 近 的 DFT 的 绝对误差 二次谐波 对应的 最近的 绝对误差
Hz 整数 k 值 k值 Hz k值 整数 k 值
697 17.861 18 0.139 1394 35.024 35 0.024
770 19.531 20 0.269 1540 38.692 39 0.308
852 21.833 22 0.167 1704 42.813 43 0.187
941 24.113 24 0.113 1882 47.285 47 0.285
1209 30.981 31 0.019 2418 60.752 61 0.248
1336 34.235 34 0.235 2672 67.134 67 0.134
1477 37.848 38 0.152 2954 74.219 74 0.219
1633 41.846 42 0.154 3266 82.058 82 0.058
4 DTMF 信号的产生与识别仿真实验
下面先介绍 MATLAB 工具箱函数 goertzel,然后介绍 DTMF 信号的产生与识别仿真实
验程序。Goerztel 函数的调用格式额为
Xgk=goertzel(xn,K)
xn 是被变换的时域序列,用于 DTMF 信号检测时,xn 就是 DTMF 信号的 205 个采样值。
K 是要求计算的 DFT[xn]的频点序号向量, 用 N 表示 xn 的长度,
则要求 1≤K≤N。 由表 10.2.2
可知,如果只计算 DTMF 信号 8 个基频时,
K=[18,20,22,24,31,34,38,42],
如果同时计算 8 个基频及其二次谐波时,
K=[18,20,22,24,31,34,35,38,39,42,43,47,61,67,74,82]。
Xgk 是变换结果向量,其中存放的是由 K 指定的频率点的 DFT[x(n)]的值。设 X(k)=
数据分析
运行程序,根据提示键入 6 位电话号码 123456,回车后可以听见 6 位电话号码对应的
DTMF 信号的声音,并输出相应的 6 幅频谱图如图 10.10.1 所示,左上角的第一个图在 k=18
和 k=31 两点出现峰值,所以对应第一位号码数字 1。最后显示检测到的电话号码 123456。
图 10.6.1 6 位电话号码 123456 的 DTMF 信号在 8 个近似基频点的 DFT 幅度
(1) 实验内容
① 运行仿真程序 exp6.m,任意送入 6 位电话号码,打印出相应的幅度谱。观察程
序运行结果,对照表 10.10.1 和表 10.10.2,判断程序谱分析的正确性。
② 分析该仿真程序,将产生、检测和识别 6 位电话号码的程序改为能产生、检测
和识别 8 位电话号码的程序,并运行一次,打印出相应的幅度谱和 8 位电话号码。
实验内容及部分运行结果
1、实验内容① 6 位电话号码的 DTMF 双频拨号信号的生成和检测程序清单 exp6.m
已经在实验指导中给出。运行程序,并输入 6 位电话号码 123456,则输出相应的 6 幅频谱
图如图 10.10.1 所示,左上角的第一个图在 k=18 和 k=31 两点出现峰值,所以对应第一位
号码数字 1。其他 5 个图请读者对照表 10.10.1 和表 10.10.2,确定确定其对应的数字,验
证程序输出的电话号码“123456”是正确的。
2、实验内容② 只要对 6 位电话号码检测程序 exp6.m 作如下修改,即可产生、检测
和识别 8 位电话号码。
(1)将第 8 行改为 TN=input('键入 8 位电话号码= ');
(2)将第 10~12 行改为
for l=1:8;
d=fix(TN/10^(8-l));
TN=TN-d*10^(8-l);
(3)将第 26 行改为 subplot(4,2,l);
(4)将第 36 行改为 TNr=TNr+tm(r,s-4)*10^(8-l);
修改后的程序为 exp6_8.m,程序清单见程序集。运行程序 exp6_8.m,输入输入 8 位
电话号码 87654321,则输出相应的 8 幅频谱图如图 10.10.2 所示。最后显示检测到
的电话号码 87654321。
100 100
|X(k)|
|X(k)|
50 50
0 0
10 20 30 40 50 10 20 30 40 50
k k
100 100
|X(k)|
50 |X(k)| 50
0 0
10 20 30 40 50 10 20 30 40 50
k k
100 100
|X(k)|
|X(k)|
50 50
0 0
10 20 30 40 50 10 20 30 40 50
k k
100 100
|X(k)|
|X(k)|
50 50
0 0
10 20 30 40 50 10 20 30 40 50
k k
一、实验目的
1. 以音频信号为例,熟悉模拟信号数字处理过程,进一步理解 数字信号处理概
念。
2. 掌握运用 Matlab 实现对音频信号的时频分析方法;
3. 初步掌握数字音频信号合成的方法。
4. 掌握运用 Matlab 设计 IIR 和 FIR 滤波系统的方法;
5. 掌握运用 Matlab 实现对加噪的音频信号进行去噪滤波的方法。锻炼学生运用所学
知识独立分析问题解决问题的能力,培养学生创新能力。
二、原理与 Matlab 相关工具
1. Matlab 录音
调用 audiorecorder 与 audiowrite 配套等相关函数(Matlab 版本要求 2014 以上)录音。例
程如下:
R = audiorecorder( 44100, 16 ,1) ;
%创建一个保存音频信息的对象,它包含采样率,时间和录制的音频信息等等。
%44100 表示采样为 44100Hz(可改为 8000, 11025, 22050 等,此数值越大,录入的声音质
量越好,相应需要的存储空间越大)
%16 为用 16bits 存储,2 为两通道即立体声(也可以改为 1 即单声道) 。
record(R);
%开始录制,此时对着麦克风说话即可。
pause(R);
%暂停录制。
play(R)
%播放录制的声音。
resume(R);
%继续录制.
stop(R);
%停止录制
myspeech = getaudiodata(R);
%得到以 n*2 列数字矩阵存储的刚录制的音频信号。
%对这个矩阵你就可以用各种滤波器进行处理,或者把它和别的音频混音等等。你也可以
画出它的波形(如果时间较长画波形可能会花点时间)。
plot(myspeech)
figure
plot(abs(fft(myspeech))) %画出信号谱密度
%画出波形
%如果你想保存可以使用
Myspeech = myspeech + sinwav;
wavwrite(myspeech,44100,16,'myspeech');
%myspeech 表示要存入的波形矩阵,44100 表采样率,16 为以 16bits 存储,'myspeech'为
存储的文件名。
三、实验任务与步骤
1. 音频信号的采集
音频信号的采集可以用 Matlab 录制或通过 Windows 自带的录音机录制一段音频信
号(尽量保证无噪音、干扰小) ,时间最多为 1s。
音频信号产生:用 windows 播放器循环播放系统自带音频文件 ding.wav 或
Windows Ding.wav(在此电脑中搜索“ding.wav”即可得)。
2.音频信号的时域、频域分析
运用 Matlab 软件实现对音频信号的打开操作以及时域分析和频域分析,并画出相
应的图形,打印在实验报告中。
注意:此音频信号的频谱包含两条主要谱线,在进行频谱分析时,注意频谱的完整性,
利用 MATLAB 实现对两条主要谱线的定位并计算谱线所对应的模拟频率。
3. 音频信号的分解和合成
运用 Matlab 软件实现音频信号的分解与合成,将音频信号的频谱中两部分频谱成分进
行分解,分别绘制出分解后的两个信号的频谱图;然后将分解后的两个信号再合成为一个
新的信号,将合成后的新信号的时域、频域图与原来的信号时域、频域图相比较,绘制出
对比效果图。
4. 音频信号的回放
运用 Matlab 软件实现音频信号的回放,将合成后的新信号和原音频信号分别进行回
放,对比两个信号的声音效果。
5. 引入干扰信号
在原有的音频信号上,叠加一个频率为 100KHz 的正弦波干扰信号(幅度自定,
可根据音频信号幅度情况而定) 。
6. 数字滤波器设计
运用 Matlab 实现 IIR 或 FIR 滤波系统,要求加入干扰的音频信号经过滤波系统后,
能够滤除 100KHz 的干扰信号,同时保留原有的音频信号,要求绘制出滤波系统的频
谱图,同时绘制出滤波前后音频信号的时域、频域对比图。
四、实验报告要求
(1)对比录音数据与直接读取 ding 音频信号的时/频域波形。
(2)分析 ding 的录音音频中的最主要两个频率分量的频率值。
(3)在时域波形、频谱密度曲线和回放效果等方面对比 ding 原始信号和合成信号(由
(2)中 ding 两个主要频率分量合成),并分析差异的原因。
(3)在时域波形、频谱密度曲线和回放效果等方面对比滤波前后的信号,并分析差
异的原因。
附程序清单、打印实验内容要求绘图显示的曲线图。
附录 1 MATLAB 基础介绍
1.1.1、管理命令与函数
p=path 将搜索路径字符串值返回给字符串变量 p。
path(‘newdir’) 将搜索路径改变为字符串‘newdir’指定的路径。
rmpath(‘directory’) 删除‘directory’路径。
addpath(‘directory’) 增加‘directory’路径。
addpath(’dir1’,’dir2’,’dir3’,…);
addpath(‘newdir’,’begin’)相当于 path(‘newdir’,path);
2、doc 命令:读入超文本文件
what 列出当前目录下的上述文件;
1.1.2、变量和工作空间管理命令与函数
1、clear 命令:清除内存中的对象。语法格式为
clear 清除工作空间的所有变量;
2、disp( ):显示文本或数组。语法格式为
例 1.1
Z=[1+2i,2-2i,3-i;1+i,1+i,1-i;2-i,1+3i,4+i]
Z=
str='Good Morning'
str =
Good Morning
disp(Z)
disp(str)
Good Morning
3、length():计算向量长度。语法格式为
n=length(Z)
n=
l=length(str)
l=
12
:计算数组维数大小。语法格式为
4、size()
d=size(Z)
d=
3 3
>> [m,n]=size(Z)
m=
n=
>> m1=size(Z,1)
m1 =
>> m3=size(Z,3)
m3 =
>> m2=size(Z,2)
m2 =
3
[m,n]=size(str)
m=
n=
12
5、who,whos:列出内存中的变量目录。语法格式为
who 列出当前内存中的变量;
whos 列出当前内存值的变量、大小,以及是否有非零虚部;
who
Z d m m1 m2 m3 n str
>> whos
6、clc:清除工作窗中的所有显示内容。
1.2 运算符和特殊字符
1、“+”:加号或一元运算符正号;A+B,则 A 和 B 两矩阵必须有相同的大小,或其中之一
为标量,标量可以与任意大小的矩阵相加。
2、“-”:减号或一元运算符负号;A-B,则 A 和 B 两矩阵必须有相同的大小,或其中之一
为标量,标量可以被任意大小的矩阵减去。
3、“﹡”:矩阵乘法;C=A*B 为两矩阵线性代数的乘积,即
n
C (i, j ) = A(i, k )B (k , j )
k =1
11、关系运算符:<,>,<=,>=,==,~=分别表示“小于”“大于”“小于等于”“大于等于”“等于”“不
等于”;对数组进行关系运算时,对每个元素进行比较,运算结果是一个与数组大小一样
的由 0 和 1 构成的数组。<,>,<=,>=四种运算符只比较操作数实部,而==,~=既比较实部又
比较虚部。
12、逻辑运算符:︱,&,~,xor 分别表示“或”“与”“非”“异或”运算。
1.3 基本概念
变量
MATLAB 变量名遵循以下规则:
(1)必须以字母开头;
(2)字符长度不得超过 31 个;
(3)可以由字母、数字和下划线混合组成;
(4)区分大小写。
数值
MATLAB 中常用十进制数来表示一个数值,也可用科学计数法来表示。如:
矩阵
数组
从数的集合这个角度看,矩阵和数组并无不同,矩阵在某些情况下可视为二阶数组。但从
运算角度看,二者的运算规则并不完全相同,因此在运算中要注意区别。
函数
MATLAB 提供了丰富的内置函数,使用时可直接调用这些函数进行数据处理。函数由函数
名和参数组成,调用格式如下:
函数名(参数)
如 sin(t)
语句
MATLAB 采用命令行式的表达式语言,一个命令就是一条语句,其格式与手写的数学表达
式相似。在命令窗口输入语句并按回车键即可运行并输出结果。
MATLAB 语句采用以下两种形式表示:
表达式
变量=表达式
1.4 M 文件
MATLAB 的工作方式有两种:一种是交互式的指令操作方式,可在命令窗口直接输入命令
行后按回车键,此方式适用于简单运算与结果分析;另一种是 M 文件的编程工作方式,
适用于执行多条语句,解决复杂问题。
1、创建
2、保存与打开
单击 M 文件编辑器窗口工具栏中的“Save”图标按钮。系统默认的文件名是“Untitled.m”,用
户可重命名。系统默认的保存目录为“matlab 所在目录\work”。
3、执行
1.5 二维绘图
1、简单的二维曲线
y yellow s square
k black d diamond
v triangle (down)
^ triangle (up)
p pentagram
h hexagram
亦可在画完一条曲线后用“hold”命令保持住,再画下一条曲线。
2、离散序列图的绘制
1.6 图形处理
1.6.1 图形标注
1、坐标轴标注和图形标题
xlabel('string')
xlabel(fname)
xlabel(’...,'PropertyName',PropertyValue,...)
ylabel('string')
ylabel(fname)
zlabel('string')
zlabel(fname)
title('string')
titlel(fname)
title(’...,'PropertyName',PropertyValue,...)
例 x=1:0.1*pi:2*pi;
y=sin(x);
plot(x,y);
xlabel('x(0-2\pi)','fontweight','bold');
ylabel('y=sin(x)','fontweight','bold');
title('正弦函数','fontsize'12,'FontWeight','bold','fontname','隶书');
通过上述代码实现对坐标轴和图形的标注,如附图1-1所示:
正弦函数
1
0.8
0.6
0.4
0.2
y=sin(x)
-0.2
-0.4
-0.6
-0.8
-1
1 2 3 4 5 6 7
x(0-2 )
附图 1-1
\alpha α \lambda λ
\beta β \mu μ
\gamma γ \xi ξ
\delta δ \pi π
\epsilon ε \omega ω
\zeta ζ \tau τ
\eta η \sigma Σ
\theta θ \kappa κ
\leftarrow ← \uparrow ↑
2、用文本标注图形
在 MATLAB 语言中可以使用 text 或 gtext 命令对图形进行文本注释。使用 text 进行标注时
需要定义用于注释的文本字符串和放置注释的位置,而使用 gtext 命令进行标注可以使用
鼠标来选择标注文字放置的位置。调用格式如下:
text(x,y,'string')
text(x,y,z,'string')
text(x,y,z,'string','PropertyName',PropertyValue....)
text('PropertyName',PropertyValue....)
gtext('string')
gtext({'string1','string2','string3',...})
gtext({'string1';'string2';'string3';...})
在定义标注放置的位置可以通过函数的计算值来确定,而且标注中还可以实时地调用返回
值为字符串的函数,如 num2str 等,利用这些函数可以完成较为复杂的文本标注。
例 x=1:0.1*pi:2*pi;
y=sin(x);
plot(x,y);
xlabel('x(0-2\pi)','fontweight','bold');
ylabel('y=sin(x)','fontweight','bold');
title('正弦函数','fontsize',12,'fontweight','bold','fontname','隶书');
text(3*pi/4,sin(3*pi/4),'\leftarrowsin(t)=.707','fontsize',16)
text(pi,sin(pi),'\leftarrowsin(t)=0','fontsize',16);
text(5*pi/4,sin(5*pi/4),'\leftarrowsin(t)=-.707\rightarrow','HorizontalAlignment','right','f
ontsize',16);
用 text 命令标注的图形如附图 1-2 所示
正弦函数
1
0.8
sin(t)=.707
0.6
0.4
0.2
y=sin(x)
0 sin(t)=0
-0.2
-0.4
-0.6
sin(t)=-.707→
-0.8
-1
1 2 3 4 5 6 7
x(0-2 )
附图 1-2
例 x=1:0.1*pi:2*pi;
y=sin(x);
plot(x,y);
gtext('y=sin(x)','fontsize',12);
执行 gtext 命令后,出现“+”形,如附图 1-3 所示:
附图 1-3
通过“十”字形光标定位后最终图形如附图 1-4 所示
0.8
0.6
y=sin(x)
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
1 2 3 4 5 6 7
附图 1-4
3、图例标注
在对数值结果绘图时,经常会出现在一张图中绘制多条曲线的情况,这时用户可以使用
legend 命令为曲线添加图例以便区分它们。该函数能够为图形中所有的曲线进行自动标注,
并以输入变量作为标注文本。其调用格式如下:
legend('string1','string2',...)
legend(...,'Location',location)
其 中 'string1','string2' 等 分 别 标 注 对 应 绘 图 过 程 中 按 绘 制 先 后 顺 序 所 生 成 的 曲 线 ,
'Location',location 用于定义标注放置的位置。Location 可以是一个 1×4 的向量(left bottom
width height)或任意一个字符串之一。对图例位置标注定义如下:
标注的位置还可以通过定位代号来定义,代号说明如下:
0:自动定位,使得标注图标与图形重叠最少;
1:默认值,置于图形的右上角;
2:置于图形的左上角;
3:置于图形的左下角;
4:置于图形的右下角;
-1:置于图形的右外侧;
例 x=-pi:pi/20:pi;
plot(x,cos(x),'-ro',x,sin(x),'-.b');
legend('cos','sin',2);
通过上述示例代码可以用鼠标来调整图例标注的位置,图例标注效果如附图 1-5
1
cos
0.8 sin
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
-4 -3 -2 -1 0 1 2 3 4
附图 1-5
1.6.2 坐标轴的控制
在 MATLAB 中可以通过设置各种参数来实现对坐标轴的控制,其中的高级控制涉及到图
形句柄,这里只介绍初级的控制命令。
1、axis 函数控制坐标轴特征
该命令用于控制坐标轴的刻度范围及显示形式,调用格式如下:
axis’控制字符串’
其中[xmin xmax ymin ymax zmin zmax]用于定义坐标轴范围,控制字符串可以是以下的任
一表达式:
auto 自动模式,使得坐标轴范围能容下所有图形
manual 以当前的坐标轴范围限定图形的绘制,此后使用 hold on 命令再次绘图时保持
坐标轴范围不变
tight 将坐标范围限制在指定的数据范围内
fill 设置坐标范围和 PlotBoxAspectRatio 属性以使坐标满足要求
ij 将坐标设置成矩阵形式,原点在左上角
xy 将坐标设置成直角坐标系
equal 将各坐标轴的刻度设置成相同
image 与 equal 类似
square 设置绘图区为正方形
vis3d 使图形在旋转或拉伸过程中保持坐标轴比例不变
normal 解除对坐标轴的任何限制
off 取消对坐标轴的一切设置
on 恢复对坐标轴的一切设置
例 x=0:.025:pi/2;
plot(x,tan(x),'-ro')
使用 axis 命令设定坐标轴之前的图形如附图 1-6 所示:
50
45
40
35
30
25
20
15
10
0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6
附图 1-6
4.5
3.5
2.5
1.5
0.5
0
0 0.5 1 1.5
附图 1-7
2、zoom 函数控制坐标轴缩放,其调用格式如下:
zoom’控制字符串’
其中控制字符串可以是以下任一字符串:
on:允许对坐标轴缩放
off:禁止对坐标轴缩放
out:恢复到最初的坐标轴设置
reset:设置当前的坐标轴为最初值
xon:允许对 x 轴进行缩放
yon:允许对 y 轴进行缩放
3、grid 函数控制坐标网格
该命令用于绘制坐标网格,其调用格式如下:
grid on //给当前坐标轴添加网格线
例 x=0:0.1*pi:2*pi;
y=sin(x);
plot(x,y);
grid on
使用grid添加网格线后如附图1-8所示:
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
附图 1-8
4、box 函数控制坐标轴封闭
该命令用于在图形四周都能显示坐标,其调用格式如下:
box on
box off
box
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
附图 1-9
1.6.3 、图形数据取点
例 x=0:0.1*pi:2*pi;
y=sin(x);
plot(x,y);
[m,n]=ginput(1)
hold on
plot(m,n,'ro');
text(m(1),n(1),['m(1)=',num2str(m(1)),'n(1)=',num2str(n(1))]);
运行程序后取点前图形中会出现“+”光标,如附图 1-10 所示:
附图 1-10
0.8
0.6
0.4
0.2
m(1)=3.0081n(1)=0.11404
0
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
在 MATLAB 命令窗口会显示以下结果:
m=
3.0081
n=
0.11404
1.6.4 子图和图形保持
在绘图过程中,经常会碰到下面两种情形:在已存的一张图中添加新的曲线;将几个图形
在同一个图形窗口表现出来,但又不在同一个坐标系中绘制。MATLAB 为这两种需要分别
提供 hold 函数和 subplot 函数。用法如下:
【hold 函数】
hold on //启动图形保持功能,此后绘制的图形都添加到当前的图形窗口中,并自动调整
坐标轴范围
【subplot 函数】
该函数用于生成并控制多个坐标轴。把当前图形窗口分隔成几个矩形部分,不同的部分是
按行方向以数字进行标号的。每一部分有一坐标轴。常用调用格式如下:
subplot(m,n,p,'replace') //如果定义的坐标轴已存在,那么就删掉已有的,并创建一个新的
坐标轴
subplot(m,n,p,'align') //对齐坐标轴
3
1 1.5 2 2.5 3 3.5 4
4.5
3.5
2.5
1 1.5 2 2.5 3 3.5 4
附图 1-12
1 1
0.9 0.8
0.6
0.8
0.4
0.7
0.2
0.6
0
0 0.5 1
0.5
0.4 1
0.8
0.3
0.6
0.2
0.4
0.1 0.2
0 0
0 0.5 1 0 0.5 1
附图 1-13
1.7 矩阵元素的数学函数
1.7.1 三角函数
附表 1-1 三角函数
sin 正弦 sec 正割
cos 余弦 csc 余割
tan 正切 cot 余切
atanh 反双曲正切
1.7.2 指数和对数函数
附表 1-2 指数和对数函数
函数名 功能描述 函数名 功能描述
1.7.3 复数函数
附表 1-3 复数函数
imag 复数的虚部
1.7.4 截断和求余函数
附表 1-4 截断和求余函数
round 四舍五入
下例说明函数 fix(),floor(),ceil()和 round()的区别,具体代码如下:
a_fix =
-1 -1 1 1
a_floor =
-2 -2 1 1
a_ceil =
-1 -1 2 2
a_round =
-2 -1 1 2
c_rem =
2 -2 2 -2
c_mod =
2 -2 -6 6
求矩阵的符号使用函数 sign(),示例代码如下:
a=-2:2;
a_sign=sign(a)
代码运行结果如下:
a_sign =
-1 -1 0 1 1
1.8 基本数据分析函数
C=max(A),如果 A 是向量,返回向量中的最大值;如果 A 是
矩阵,返回一个包含各列最大值的行向量
C=max(A,B),返回矩阵 A 和 B 中较大的元素,矩阵 A 和 B 必
max 求最大值 须具有相同的大小
[C,I]=max(…),多返回最大值的下标
M=mean(A),如果 A 是向量,返回向量的平均值;如果 A 是
mean 求平均值 矩阵,返回一个包含各列平均值的行向量
MATLAB 提供了许多进行信号处理的工具箱函数,本附录仅给出部分在数字信号处
理教学中常用函数的说明。更多有关这些工具箱函数的使用可参考 help 文件。
为方便查阅,分组给出这些常用函数的说明。
一、波形产生
1、chirp:产生扫频余弦函数
2、diric:产生 Dirichlet 或周期 sinc 函数
3、gauspuls:产生高斯调制的正弦曲线脉冲
4、gmonopuls:产生高斯单脉冲
5、pulstran:产生一个脉冲序列
6、rectpuls:产生一个非周期的抽样方波
7、sawtooth:产生锯齿波或三角波
sin( t )
8、sinc:产生 sinc 函数,即
t
9、square:产生方波
10、tripuls:产生一个非周期的采样三角波
11、vco:压控振荡器
二、线性系统变换
1、latc2tf:由格形结构向传递函数转变
2、polystab:使多项式稳定
3、polyscal:多项式根乘以倍率
4、residuez:z 变换部分分式展开
5、sos2ss:级联二阶节向状态空间转换
6、sos2tf:级联二阶节向传递函数转换
7、sos2zp:级联二阶节向零增益转换
8、ss2sos:状态空间转换为二阶节级联
9、ss2tf:状态空间向传递函数转换
10、ss2zp:状态空间向零增益转换
11、tf2latc:传递函数向格形转换
12、tf2sos:传递函数向级联二阶节转换
13、tf2ss:传递函数向状态空间转换
14、tf2zp:传递函数向零增益转换
15、zp2sos:零增益向级联二阶节转换
16、zp2ss:零增益向状态空间转换
17、zp2tf:零增益向传递函数转换
三、系统分析
1、abs:取绝对值(幅值)
2、angle:取相角
3、freqs:模拟系统频率响应
4、freqspace:为频率响应设定频率间隔
5、freqz:数字滤波器频率响应
6、freqzplot:频率响应绘制
7、grpdelay:群迟延
8、impz:数字系统的冲激响应
9、zplane:离散系统的零极点图
四、滤波器实现
1、conv:卷积
2、conv2:二维卷积
3、deconv:解卷积
4、filtic:确定滤波器原始条件
5、filter:滤波器实现
6、filter2:二维滤波器实现
7、filtfilt:零相位滤波
8、fftfilt:重叠相加滤波器实现
9、latcfilt:格形滤波器实现
10、sosfilt:二阶节(biquad)滤波实现
五、FIR 滤波器设计
1、fir1:基于窗函数 FIR 滤波器设计
2、fir2:基于窗函数的任意响应 FIR 滤波器设计
3、fir1s:最小二乘法 FIR 滤波器设计
4、firrcos:升余弦 FIR 滤波器设计
5、intfilt:插值 FIR 滤波器设计
6、kaiserord:基于窗函数的 Kaiser 滤波器阶数选择
7、remez:Parks-McClellan 最优 FIR 滤波器设计
8、remezord:Parks-McClellan 最优 FIR 滤波器阶数估计
六、IIR 滤波器设计
1、butter:巴特沃斯滤波器设计
2、cheby1:切比雪夫Ⅰ型滤波器设计
3、cheby2:切比雪夫Ⅱ型滤波器设计
4、ellip:椭圆滤波器设计
5、maxfiat:归一化的巴特沃斯低通滤波器设计
6、yulewalk:耶鲁-沃克滤波器设计
7、buttord:巴特沃斯滤波器阶数选择
8、cheb1ord:切比雪夫Ⅰ型滤波器阶数选择
9、cheb2ord:切比雪夫Ⅱ型滤波器阶数选择
10、ellipord:椭圆滤波器阶数选择
七、模拟低通原型滤波器设计
1、besselap:贝塞尔滤波器原型
2、buttap:巴特沃斯滤波器原型
3、cheb1ap:切比雪夫Ⅰ型滤波器原型
4、cheb2ap:切比雪夫Ⅱ型滤波器原型
5、ellipap:椭圆滤波器原型
八、模拟低通滤波器设计
1、besself:贝塞尔模拟滤波器设计
2、butter:巴特沃斯滤波器设计
3、cheby1:切比雪夫Ⅰ型滤波器设计
4、cheby2:切比雪夫Ⅱ型滤波器设计
5、ellip:椭圆滤波器设计
九、模拟滤波器频带变换
1、lp2bp:低通向带通模拟滤波器变换
2、lp2bs:低通向带阻模拟滤波器变换
3、lp2hp:低通向高通模拟滤波器变换
4、lp2lp:低通向低通模拟滤波器变换
十、滤波器离散化
1、bilinear:双线性变换
2、impinvar:脉冲响应不变法模拟向数字的转换
十一、窗函数
1、boxcar:矩形窗函数
2、bartlett:Bartlett 窗函数
3、blackman:布莱克曼窗函数
4、chebwin:切比雪夫窗函数
5、hamming:汉明窗函数
6、hanning:汉宁窗函数
7、kaiser:凯赛尔窗函数
8、triang:三角窗函数
十二、变换
1、czt:线性调频 z 变换
2、dct:离散的余弦变换
3、fft:快速傅立叶变换
4、fft2:二维快速傅立叶变换
5、fftshift:交换矢量的一半
6、hilbert:希尔伯特变换
7、idct:离散的余弦逆变换
8、ifft:快速傅立叶逆变换
9、ifft2 维快速傅立叶逆变换
十三、图形用户界面工具
1、fdatool:滤波器分析设计工具
2、sptool:信号处理工具
附录 2 报告封面
《信号处理实验》
课程编号: Z612SB0011
实验报告
班级:
学号:
姓名:
教师:
提交日期:
实验地点:
南昌大学信息工程学院
电子信息工程系
(封面背面)
实验目录
一、 Matlab 基础:时域离散信号的产生
二、 信号、系统与系统响应
三、 用 FFT 作谱分析
四、 用双线性变换法设计 IIR 数字滤波器