You are on page 1of 106

《信号处理实验》

课程编号: Z612SB0011
实验指导书

南昌大学信息工程学院
电子信息工程系通信教研室课程组
2019-10-8
前 言

1. 简介

信号处理实验是信号与系统\数字信号处理课程重要的实践性学习环节。本实验教学目
标是通过实验使学生更好的掌握信号处理的基本理论和方法;熟悉应用快速傅里叶变换算
法进行谱分析;掌握数字滤波器设计,提高其运用数字信号处理的应用能力等。第一部分
主要包括:Matlab 基础、典型信号的产生、微分方程和差分方程的求解、傅里叶级数展开、
傅里叶变换及其在通信系统中的应用、连续和离散时间信号的卷积和 Z 变换。第二部分主
要包括周期信号频谱测量及线性时不变连续时间系统模拟;模拟\数字低通滤波器设计与特
性测量;信号采集与处理的综合设计实验。

《信号处理实验》是的重要实践环节,巩固和加深信号处理基础知识的理解,提高综
合运用所学知识的能力。在独立设计分析方案,准确分析实验结果,设计调试程序等方面
培养学生工程能力。通过应用设计实验提高学习者的开发能力和创新能力。

课程目标 1:使学生能够了解信号处理的广泛应用,掌握确知信号与线性时不变系统的基
本分析和设计方法。

课程目标 2:使学生掌握以数字滤波器为代表的线性时不变离散时间系统的设计和实现方
法。能运用工程科学基本原理分析复杂工程问题,以获得有效结论。

课程目标 3:基于 MATLAB 仿真计算,学生掌握离散傅里叶谱分析等经典算法和经典滤


波器设计方法,掌握根据具体问题提出指标、设计算法、完成功能的过程。

课程目标 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. 实验报告格式要求

课程共完成 9 个实验,每个实验后撰写报告,共 9 份。实验报告按学校统一格式,提


交的报告包括封面(模板参见本指导书附录 2)、目录(封面背面) 、9 份实验报告依序排
列,每份报告采用学校统一的实验报告纸。
报告要求简明扼要,主要内容为实验结果及其分析,并按照要求回答思考题。
实验报告要求手工书写,但输出图等实验结果可以打印。
不需要打印公版代码,但鼓励打印自主原创的核心代码(实现功能完整且配有清晰注
释才能被判为有效代码) 。
用 A4 纸打印附在每个报告后面。
每位同学用回形针简单固定实验报告(不要用装订针) ,班级按学号排序后提交。
实验 1 MATLAB 基础:时域离散信号的产生

一、.实验目的:

1、了解常用时域离散信号及其特点

2、掌握用 MATLAB 产生时域离散信号的方法

二、.实验原理:

1、时域离散信号的概念

在时间轴的离散点上取值的信号,称为离散时间信号。通常,离散时间信号用 x(n)表
示,其幅度可以在某一范围内连续取值。由于信号处理设备或装置(如计算机、专用的信
号处理芯片等)均以有限位的二进制数来表示信号的幅度,因此,信号的幅度也必须离散
化。我们把时间和幅度均取离散值的信号称为时域离散信号或数字信号。

在 MATLAB 语言中,时域离散信号可以通过编写程序直接产生。

2、常用时域离散信号的生成

1) 单位抽样序列

单位抽样序列的表示式为

1 n=0 1 n=k
 (n) =  或  (n − k ) = 
0 n0 0 n0

以下三段程序分别用不同的方法来产生单位抽样序列。

例 1-1 用 MATLAB 的关系运算式来产生单位抽样序列。

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('单位脉冲序列');

运行结果如图 1-1 所示:


单位脉冲序列
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-1

例 1-2 用 zeros 函数和抽样点直接赋值来产生单位抽样序列。

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-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 n0 1 n0
u (n)=  或 u (n-k )= 
0 n0 0 n0

以下三段程序分别用不同的方法来产生单位阶跃序列。

例 1-4 用 MATLAB 的关系运算式来产生单位阶跃序列。

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

运行结果如图 1-3 所示:


单位阶跃序列
1

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

例 1-5 用 zeros 和 ones 函数来产生单位阶跃序列。

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-4 相同。.

例 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

程序运行结果如图 1-4 所示:


移位的单位阶跃序列
1

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) 实指数序列

实指数序列的表示式为 x(n)=an 其中 a 为实数

例 1-7 编写产生 a=1/2 和 a=2 的实指数连续信号和离散序列的程序

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

程序运行结果如图 1-5 所示:


实指数信号( a<1) 实指数信号( a>1)
1500 1500

1000 1000

500 500

0 0
-10 -5 0 0 5 10

实指数序列( a<1) 实指数序列( a<1)


1500 1500

1000 1000

500 500

0 0
-10 -5 0 0 5 10

图 1-5

4)复指数序列

复指数序列的表示式为 x(n)=e(σ+jω)n

当 ω=0 时,x(n)为实指数序列;当 σ=0 时,x(n)为虚指数序列,即

ejωn=cos(ωn)+jsin(ωn)

其实部为余弦序列,虚部为正弦序列。

例 1-8 编写程序产生 σ=-0.1,ω=0.6 的复指数连续信号与离散序列。

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+Θ)

例 1-9 已知一时域周期性正弦信号的频率为 1Hz,振幅值为 1V。编写程序在图形窗


口上显示两个周期的信号波形,并对该信号的一个周期进行 32 点采样获得离散信号。

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)矩形波序列

MATLAB 提供有专门函数 square 用于产生矩形波。其调用格式如下:


x=square(t) :类似于 sin(t),产生周期为 2π,幅值为±1 的方波。

x=square(t,duty):产生指定周期的矩形波,其中 duty 用于指定占空比。

将 square 的参数 t 换成 n,且 n 取整数,则可以获得矩形序列。

例 1-10 一个周期性矩形信号频率为 5kHz,信号幅度在 0~2V 之间,占空比为 0.25,



编写程序生成该信号,要求在图形窗口上显示 2 个周期的信号波形;对信号的一个周期进
行 16 点采样获得离散信号。

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-8 所示;

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)

(3)f(n)= e(0.1+j1.6∏)n (0<n<16)

(4)f(n)=3sin(nП/4) (0<n<20)

3、一个连续的周期性方波信号频率为 200Hz,信号幅度在-1~+1V 之间,要求在图形


窗口上显示其两个周期的波形。以 4kHz 的频率对连续信号进行采样,编写程序生成连续
信号和其采样获得的离散信号波形。

四、.实验预习:

1、预先阅读附录部分的 MATLAB 基础介绍,认真阅读实验原理,明确本次实验任务,


读懂例题程序,了解实验方法。

2、根据实验内容预先编写实验程序。

3、预习思考题:产生单位脉冲序列和单位阶跃序列各有几种方法?如何使用?

五、实验报告

1、列写调试通过的实验程序,打印实验程序产生的曲线图形。

2、思考题:通过例题程序,你发现采样频率 Fs、采样点数 N、采样时间间隔 dt 在程


序编写中有怎样的联系?使用时需注意什么问题?
实验 2 系统响应及系统稳定性

1. 实验目的:

1) 加深对离散系统的差分方程、单位脉冲响应、单位阶跃响应和卷积分析方法的理
解。

2) 初步了解用 MATLAB 语言进行离散时间系统时域分析的基本方法。

3)掌握求解离散时间系统的单位脉冲响应、单位阶跃响应、线性卷积以及差分方程
的程序的编写方法,了解常用子函数的调用格式。

4)分析、观察及验证系统稳定性。

2. 实验原理及方法:
在时域中,描写系统特性的方法是差分方程和单位脉冲响应,在频域可以用系统函数
描述系统特性。已知输入信号可以由差分方程、单位脉冲响应或系统函数求出系统对于该
输入信号的响应,本实验仅在时域求解。在计算机上适合用递推法求差分方程的解,最简
单的方法是采用MATLAB语言的工具箱函数filter函数。也可以用MATLAB语言的工具箱
函数conv函数计算输入信号和系统的单位脉冲响应的线性卷积,求出系统的响应。
系统的时域特性指的是系统的线性时不变性质、因果性和稳定性。重点分析实验系统
的稳定性,包括观察系统的暂态响应和稳定响应。
系统的稳定性是指对任意有界的输入信号,系统都能得到有界的系统响应。或者系统
的单位脉冲响应满足绝对可和的条件。系统的稳定性由其差分方程的系数决定。
实际中检查系统是否稳定,不可能检查系统对所有有界的输入信号,输出是否都是有
界输出,或者检查系统的单位脉冲响应满足绝对可和的条件。可行的方法是在系统的输入
端加入单位阶跃序列,如果系统的输出趋近一个常数(包括零),就可以断定系统是稳定
的。系统的稳态输出是指当n→∞时,系统的输出。如果系统稳定,信号加入系统后,系统
输出的开始一段称为暂态效应,随n的加大,幅度趋于稳定,达到稳态输出。
注意在以下实验中均假设系统的初始状态为零。

1、离散 LSI 系统的响应与激励

由离散时间系统的时域分析方法可知,一个离散 LSI 系统的响应与激励可以用如下框


图表示:

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 求解离散系统的单位脉冲响应和单位阶跃响应。

例 2-1 已知描述某因果系统的差分方程为 6y(n)+2y(n-2)=x(n)+3x(n-1)+3x(n-2)+x(n-3)

满足初始条件 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)

分析上式可知,这是一个 3 阶系统,列出其 bk 和 ak 系数:

a0=1, a,1=0, a,2=1/3, a,3=0

b0=1/6,b,1=1/2, b,2=1/2, b,3=1/6

程序清单如下:

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)]);

程序运行结果如图 2-1 所示:


系统的单位序列响应 系统的单位阶跃响应
1.2
0.5
1.1

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

3、用函数 filtic 和 filter 求解离散系统的单位序列响应和单位阶跃响应。

例 2-2 已知描述某因果系统的差分方程为 6y(n)-2y(n-4)=x(n)-3x(n-2)+3x(n-4)-x(n-6),


满足初始条件 y(-1)=0,x(-1)=0,求系统的单位脉冲响应和单位阶跃响应。时间轴上 N 取
32 点。

注意:原式非标准形式,必须化为标准形式后再列出系数 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)]);

程序运行结果如图 2-2 所示:

系统的单位序列响应 系统的单位阶跃响应
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

4、用 MATLAB 实现线性卷积

1)用函数 conv 进行卷积运算:

求解两个序列的卷积和,关键在于如何确定卷积结果的时宽区间。MATLAB 提供的
求卷积函数 conv 默认两个序列的序号均从 n=0 开始,卷积结果 y 对应的序列的序号也从
n=0 开始。

例 2-3 已知两个序列 f1=0.8n (0<n<20)


,f2=u(n) (0<n<10),求两个序列的卷积和。

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');

程序运行结果如图 2-3 所示:

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)非零起始序列的卷积运算:

当两个序列不是从 0 开始时,必须对 conv 函数稍加扩展。

由卷积原理可知,若待卷积的两个序列序号分别为 {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;

例 2-4 已知序列 f1=0.5n (0<n<10),f2=u(n+2) (-2<n<10),求两个序列的卷积和。

程序清单如下:

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);

程序运行结果如图 2-4 所示:

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)卷积积分的动态过程演示:

为了更深入地理解序列卷积的原理,下面提供一段演示卷积和的动态过程的程序。

例 2-5 动态演示例 2-3 两个序列 f1=0.8n (0<n<20)


,f2=u(n) (0<n<10)的卷积和。

程序清单如下:

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;

elseif lf2<lf1 nf1=0;nf2=lf1-lf2;

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

程序运行结果如图 2-5 所示:

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

5、离散 LSI 系统时域响应的求解:

MATLAB 提供了多种方法求解离散 LSI 系统的响应:

1)用 conv 函数进行卷积积分,求任意输入的系统零状态响应;

例 2-6 已知描述某因果系统的差分方程为 6y(n)+2y(n-2)=x(n)+3x(n-1)+3x(n-2)+x(n-3),

满足初始条件 y(-1)=0,x(-1)=0。在该系统的输入端加一个矩形脉冲序列,其占空比为 0.25,


一个周期取 16 个采样点,求该系统的响应。

程序清单如下:

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

2)用 dlsim 函数求任意输入的系统零状态响应;

例 2-7 已知某 IIR 数字低通滤波器的系统函数为

0.1321+0.3963z-1 + 0.3963z −2 + 0.3121z −3


H(z)=
1 − 0.34319 z −1 + 0.60439 z −4 − 0.20407 z −3

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

3)用 filtic 和 filter 函数求任意输入的系统完全响应。

例 2-8 已知描述某系统的差分方程为 y(n)-1.5y(n-1)+0.5 y(n-2)=x(n) n≥0,满足初始


条件 y(-1)=4,y(-2)=10,求系统输入为 x(n)=(0.25)nu(n)时的零输入、零状态及全响应。

解 为了更深入地理解 filtic 和 filter 函数的用法,先用经典法求得系统完全响应表达


1 1 1 2
式: y (n) = [( ) + ( ) ]u (n) +
n n
u(n) ,并编写程序绘出其图形,以便与用 MATLAB
2 3 4 3
函数求解的结果进行对比。

程序清单如下:
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);

title('用 filter 求得的完全响应');

subplot(2,2,4);stem(n,y2);

title('经典法求得的完全响应');

程序运行结果如图 2-8 所示:


输入信号 x(n) 系统的零输入响应 系统的零状态响应
1 1 3

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

一个求解频率响应的实用函数。

在实际使用 freqz 进行离散系统频响特性分析时。通常需要求解幅频响应、相频响应、


群时延,幅频响应又分为绝对幅频和相对幅频两种表示方法。下面定义函数 freqz_m,利
用该函数,可方便求出上述各项。freqz_m 函数定义如下:

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

求该系统在 0~П 频率范围内的绝对幅频响应与相频响应、相对幅频响应与相频响应


及群时延。

程序清单如下:

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('群时延');

程序运行结果如图 2-9 所示:


幅频特性( V) 相频特性
1
2
0.8
幅度(V)

相位
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

三、实验内容及步骤

(1)编制程序,包括产生输入信号、单位脉冲响应序列的子程序,用 filter 函数或 conv


函数求解系统输出响应的主程序。程序中要有绘制信号波形的功能。
(2)给定一个低通滤波器的差分方程为

y(n) = 0.05x(n) + 0.05x(n − 1) + 0.9 y(n − 1)

输入信号 x1 (n) = R8 (n)

x 2 ( n) = u ( n)

a) 分别求出系统对 x1 (n) = R8 (n) 和 x 2 (n) = u (n) 的响应序列,并画出其波形。

b) 求出系统的单位冲响应,画出其波形。
(3)给定系统的单位脉冲响应为

h1 (n) = R10 (n)

h2 (n) =  (n) + 2.5 (n − 1) + 2.5 (n − 2) +  (n − 3)


用线性卷积法分别求系统 h1(n)和 h2(n)对 x1 (n) = R8 (n) 的输出响应,并画出波

形。
(4)给定一谐振器的差分方程为

y(n) = 1.8237 y(n − 1) − 0.9801y(n − 2) + b0 x(n) − b0 x(n − 2)

令 b0 = 1 / 100.49 ,谐振器的谐振频率为 0.4rad。

a) 用实验方法检查系统是否稳定。输入信号为 u (n) 时,画出系统输出波形。

b) 给定输入信号为

x(n) = sin(0.014n) + sin(0.4n)

求出系统的输出响应,并画出其波形。
实验预习:

1、认真阅读实验原理部分,明确实验目的,复习有关离散 LSI 系统的理论知识。

2、读懂实验原理部分的例题程序,熟悉与本实验有关的 MATLAB 函数。

3、根据实验内容预先编写实验程序,并思考本实验提出的有关 MATLAB 函数在调用


时应注意哪些问题。

4.思考题
(1) 如果输入信号为无限长序列,系统的单位脉冲响应是有限长序列,可否用线性卷
积法求系统的响应? 如何求?
(2)如果信号经过低通滤波器,把信号的高频分量滤掉,时域信号会有何变化,用前
面第一个实验结果进行分析说明。
5.实验报告要求
(1)简述在时域求系统响应的方法。
(2)简述通过实验判断系统稳定性的方法。分析上面第三个实验的稳定输出的波形。
(3)对各实验所得结果进行简单分析和解释。列出本实验提出的有关 MATLAB 函数
在调用时应注意的问题。
(4)简要回答思考题。
(5)打印要求的各信号波形。
实验 3 时域采样与频域采样

1. 实验目的
时域采样理论与频域采样理论是数字信号处理中的重要理论。要求掌握模拟信号采样
前后频谱的变化,以及如何选择采样频率才能使采样后的信号不丢失信息;要求掌握频率
域采样会引起时域周期化的概念,以及频率域采样定理及其对频域采样点数选择的指导作
用。
2. 实验原理与方法
时域采样定理的要点是:

a) 对模拟信号 x a (t ) 以间隔 T 进行时域等间隔理想采样,形成的采样信号的频

谱 Xˆ ( j) 是原模拟信号频谱 X a ( j) 以采样角频率  s (  s = 2 / T )


为周期进行周期延拓。公式为:

1 
Xˆ a ( j) = FT [ xˆ a (t )] =  X a ( j − jn s )
T n = −

b) 采样频率  s 必须大于等于模拟信号最高频率的两倍以上,才能使采样信号


频谱不产生频谱混叠。
利用计算机计算上式并不方便,下面我们导出另外一个公式,以便用计算机上进行实验。

理想采样信号 xˆ a (t ) 和模拟信号 x a (t ) 之间的关系为:


xˆ a (t ) = x a (t )   (t − nT )
n = −

对上式进行傅立叶变换,得到:

 
Xˆ a ( j) =  [ x a (t )   (t − nT )]e − jt dt
−
n = −

 
=  x a (t ) (t − nT )e − jt dt
−
n = −

在上式的积分号内只有当 t = nT 时,才有非零值,因此:

Xˆ a ( j) = x
n = −
a (nT )e − jnT
上式中,在数值上 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

则 N 点 IDFT[ X N ( k ) ]得到的序列就是原序列 x(n)以 N 为周期进行周期延拓后的主值

区序列,公式为:

xN (n) = IDFT[ X N (k )]N = [  x(n + iN )]RN (n)
i =−

b) 由上式可知,频域采样点数 N 必须大于等于时域离散信号的长度 M(即 N≥M),才

能使时域不产生混叠,则 N 点 IDFT[ X N ( k ) ]得到的序列 xN ( n) 就是原序列 x(n),

即 xN ( n) =x(n)。如果 N>M, xN ( n) 比原序列尾部多 N-M 个零点;如果 N<M,z

则 xN ( n) =IDFT[ X N ( k ) ]发生了时域混叠失真,而且 xN ( n) 的长度 N 也比 x(n)的

长度 M 短,因此。 xN ( n) 与 x(n)不相同。

在数字信号处理的应用中,只要涉及时域或者频域采样,都必须服从这两个采样理论
的要点。
对比上面叙述的时域采样原理和频域采样原理,得到一个有用的结论,这两个采样理
论具有对偶性:“时域采样频谱周期延拓,频域采样时域信号周期延拓”。因此放在一起进
行实验。
3. 实验内容及步骤
(1)时域采样理论的验证。
−t
给定模拟信号, x a (t ) = Ae sin( 0 t )u (t )

式中 A=444.128,  =50 2 π,  0 =50 2 πrad/s,它的幅频特性曲线如图 3.1

图 3.1 x a (t ) 的幅频特性曲线

现用 DFT(FFT)求该模拟信号的幅频特性,以验证时域采样理论。

安照 x a (t ) 的幅频特性曲线,选取三种采样频率,即 Fs =1kHz,300Hz,200Hz。

观测时间选 T p = 50ms 。

为使用 DFT,首先用下面公式产生时域离散信号,对三种采样频率,采样序列按

顺序用 x1 ( n) , x 2 (n) , x3 (n) 表示。

x(n) = xa (nT ) = Ae −nT sin( 0 nT )u (nT )

因为采样频率不同,得到的 x1 ( n) , x 2 (n) , x3 (n) 的长度不同, 长度(点数)

用公式 N = T p  Fs 计算。选 FFT 的变换点数为 M=64,序列长度不够 64 的尾部加零。

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 其它

编写程序分别对频谱函数 X (e j ) = FT[ x(n)] 在区间 [0,2 ] 上等间隔采样 32

和 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

再分别对 X 32 (k )和X 16 (k ) 进行 32 点和 16 点 IFFT,得到 x32 (n)和x16 (n) :

x32 (n) = IFFT[ X 32 (k )]32 , n = 0,1, 2, ,31

x16 (n) = IFFT[ X16 (k )]16 , n = 0,1, 2, ,15

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 ) = X 32 (2k ) , k = 0,1, 2, ,15 。


3 当然也可以按照频域采样理论,先将信号 x(n)以 16 为周期进行周期延拓,取其主值

j
,再对其进行 16 点 DFT(FFT),得到的就是 X (e ) 在 [0,2 ] 的 16 点频率域采样
区(16 点)

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. 实验目的:

1、加深对周期序列 DFS、有限长序列 DFT 和 FFT 的基本概念及理论的理解。

2、掌握用 MATLAB 语言求解 FFT 的以及相应反变换的方法。

3、学习用 FFT 对连续信号和时域离散信号进行谱分析的方法,了解可能出现的分析


误差及其原因,以便正确应用 FFT。

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

从离散傅里叶变换定义式可以看出,有限长序列在时域上是离散的,在频域上也是离

-j
散的,式中 WN =e N
,即仅在单位圆上 N 个等间距的点上取值,这为使用计算机进行处
理带来了方便。

由有限长序列的傅里叶变换和逆变换定义可知,DFT 和 DFS 的变换公式非常相似,


因此,在程序编写上也基本一致。

例 4-4 已知 x(n)=[0,1,2,3,4,5,6,7],求其 DFT 和 IDFT。要求:

① 画出序列傅里叶变换对应的|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))]);

程序运行结果如图 4-4 所示。由图可见,与周期序列不同,有限长序列本身是仅有 N


点的离散序列,相当于周期序列的主值部分。因此,其频谱也对应序列的主值部分,是长
度为 N 的离散序列。
x(n) IDFT|X(k)|

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

(2)DFT 与 DFS 的联系

将周期序列的傅里叶级数变换对和有限长序列的离散傅里叶变换对进行比较可见,两
nk
者的区别仅仅是将周期序列 x(n) 换成了有限长序列 x(n),同时,由于式中 WN 的周期性,

因而有限长序列的离散傅里叶变换实际上隐含着周期性。

例 4-5 已知周期序列的主值 x(n)=[0,1,2,3,4,5,6,7],求 x(n)的周期重复次数为 4 次时的


DFS。要求:

① 画出主值序列周期序列的波形。

② 画出周期序列傅里叶变换对应的 X(k) 和[ X(k) ]的图形。

程序清单如下:

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))]);

程序运行结果如图 4-5 所示。与例 4-4 相比,


有限长序列 x(n)可以看成是周期序列 x(n)

的一个周期;反之,周期序列 x(n) 可以看成是有限长序列以 N 为周期的周期延拓。频域

上的情况也一样。从这个意义上说,周期序列只有有限个序列值有意义。

(3)DFT 与 DTFT 的联系

若离散时间非周期序列为 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 的定义可见,序列在时域是离散的、非周期的,在频域是连续的、周期的。


与有限长序列相比, X(e ) 仅在单位圆上取值,X(k)是在单位圆上 N 个等间距的点上


取值。因此,连续谱 X(e ) 可由离散谱 X(k)经插值后得到。

例 4-6 求有限长序列 x(n)=[0,1,2,3,4,5,6,7]的 DTFT,将( -2π,2π )区间分成 500 份。

要求:

① 画出序列 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))]);

程序运行结果如图 4-6 所示:

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

与图 4-4 相比,两者有一定差别。主要原因在于,该例进行 DTFT 时, X(e ) 在单位

圆上取 250 个点进行分割;而图 4-4 进行 DFT 时,X(k)是在单位圆上以 N=8 的等间距取



值,X(k)的序列长度与 X(e ) 相比不够长。若将 x(n)=[0,1,2,3,4,5,6,7]补零拓展至长度

N=100,再求其 DFT,如图 4-7 所示。与例 4-6 相比,|X(k)|和 arg[X(k)]图形接近 X(e jω ) 和

e ( ) 的图形。注意图 4-7 对应 [0,2π] 区间。

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

(1)MATLAB 提供的 FFT 函数

由理论学习可知,DFT 是唯一在时域和频域均离散的变换方法,它适用于有限长序列。
尽管这种变换方法是可以用于数值计算的,但如果只是简单地按照定义进行数据处理,当
序列长度很大时,将占用很大的内存空间,且运算时间很长。

快速傅里叶变换是用于 DFT 运算的高效快速算法的统称,FFT 只是其中的一种。FFT


主要有时域抽取算法和频域抽取算法,基本思想是将一个长度为 N 的序列分解成多个段序
列,如基 2 算法、基 4 算法等,大大地缩短了 DFT 的时间。有关详细理论可参考教材。

MATLAB 提供了进行 FFT 的函数 fft 和 ifft 分别用于计算 DFT 和 IDFT。

例 4-7 已知一个长度为 8 的时域离散信号,n1=0,n2=7,在 n0=4 前为 0,n0 以后为


1.对其进行 FFT 变换,作时域信号及 DFT、IDFT 的图形。

程序清单如下:

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)');

程序运行结果如图 4-8 所示:

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

(2)用 FFT 进行频谱分析

① 对有限长序列进行谱分析


一个序号从 n1 到 n2 的时域有限长序列 x(n),它的频谱 X(e ) 定义为它的离散傅里叶

变换,且在 Nyquist 频率范围内有界并连续。序列的长度为 N,则 N=n2-n1+1。计算 x(n)


jω jωk
的 DFT 得到的是 X(e ) 的 N 个样本点 X(e ) 。其中数字频率为


ωk =k( )=kdω
N
式中: dω 为数字频率的分辨率;k 取对应-(N-1)/2 到(N-1)/2 区间的整数。

在实际使用中,往往要求计算出信号以模拟频率为横坐标的频谱,此时对应的模拟频
率为

ωk 2π 2π
Ωk = =k( )=k( )=kD
Ts NTs L

式中:D 为模拟频率的分辨率或频率间隔;Ts 为采样信号的周期,Ts=1/Fs;定义信号的长


度 L=NTs。

在使用 FFT 进行 DFT 的高校运算时,


一般不直接用 n 从 n1 到 n2 的 x(n),
而是取 x(n)

的主值区间(n=0,1,…,N-1)的数据,经 FFT 将产生 N 个数据,定位在 k=0,1,…,N-1 的数


字频率点上,即对应[0,2 π ]。如果要显示[- π , π ]范围的频谱,则可以使用 fftshift(X)进行
位移。

例 4-8 已知有限长序列 x(n)=[1,2,3,2,1],其采样频率 Fs=10Hz。请使用 FFT 计


算其频谱。

程序清单如下

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');

程序运行结果如图 4-10 所示:


幅度频谱 相位频谱
9 3

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

由图 4-10 可知,当有限长序列的长度 N=5 时,频谱的样本点数也为 5,频率点之间的


间距非常大,即分辨率很低。及时使用了 plot 命令的插值功能,显示出的曲线仍是断续的,
与真实曲线有较大误差。改变分辨率的基本方法是给输入序列补零,即增加频谱的密度。
这种方法只是改善了图形的是在分辨率,并不增加频谱的细节信息。

将上述有限长序列 x(n)[1,2,3,2,1]末尾补零到 N=1000 点,将程序改为:

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');

程序的运行结果如图 4-11 所示,由图可见,图形的分辨率提高,曲线几乎是连续的频


谱了。
幅度频谱 相位频谱
9 4

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

采样周期 Ts=0.5s,要求用 FFT 求其频谱。

由于该序列是一个实的偶序列,因而补零时需要仔细分析。假定按 N=32 补零,则主


值区域在 n=0~31,FFT 的输入应为

xn=[ones(1,6),zeros(1,N-11),ones(1,5)]

即原来 n=[-5:-1]的前五个点移到 n=[27:31]中去了。

下面考虑分别用 N=32、64、512,观察不同 N 值代入对频谱的影响。

程序清单如下:

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

程序运行结果如图 4-12 所示:

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)];

相当于起点不是取自 n=0 而是 n=-5,计算的是 x(n-5)的频谱。幅度频谱不受影响,相位频


谱引入一个线性相位-5ω,如图 4-13 所示。
12 3

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 进行无限长序列的频谱分析,首先要将无限长序列截断成一个有限长序列。序
列长度的取值对频谱有较大的影响,带来的问题是引起频谱的泄漏和波动。

例 4-10 已知一个无限长序列为 x(n)=e-0.5n (n≥0), x(n)=0(n<0),采样频率 Fs=20Hz,要


求用 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

例 4-11 用 FFT 计算下列连续时间信号的频谱,并观察选择不同的 Ts 和 N 值对频谱


特性的影响。

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

程序运行结果如图 4-15 所示。

Ts=0.5,N=256 Ts=0.25,N=256
40
25
30 20
20 15
10
10
5

1 1.5 2 2.5 3 1 1.5 2 2.5 3


Ts=0.125,N=2048 Ts=0.125,N=2048

40 40
30 30
20 20
10 10

1 1.5 2 2.5 3 1 1.5 2 2.5 3

图 4-15

由图 4-15 可以得出以下结论:

(1)N 同样取 256,当 Ts 越大时,时域信号的长度 L=NTs 保留的越长,分辨率越高,


频谱特性误差越小;反之,则分辨率越低,频谱特性误差越大,甚至丢失某些信号分量。

(2)Ts 相同,当 N 越大时,在[0,2 π ]范围内等间隔抽样点数越多,且时域信号的长


度 L=NTs 保留的越长,分辨率越高,频谱特性误差越小;在[0,2 π ]范围内等间隔抽样点数
越少,时域信号的长度 L=NTs 保留的越短,分辨率越低,频谱特性误差越大,甚至可能漏
掉某些重要的信号分量,称为栅栏效应。

三、实验步骤及内容

(1)对以下序列进行谱分析。
x1 (n) = R4 (n)
n + 1, 0n3

x 2 (n) = 8 − n, 4n7
0 , 其它n

4 − n, 0n3

x3 (n) = n − 3, 4n7
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)对模拟周期信号进行谱分析

x6 (t ) = cos8 t + cos16 t + cos 20 t


选择 采样频率 Fs = 64Hz ,变换区间 N=16,32,64 三种情况进行谱分析。分别打印其幅频

特性,并进行分析和讨论。
预习:自学以上 DFT 与 FFT 实验与代码
4.思考题
(1)对于周期序列,如果周期不知道,如何用 FFT 进行谱分析?
(2)如何选择 FFT 的变换区间?(包括非周期信号和周期信号)

(3)当 N=8 时, x 2 (n) 和 x3 (n) 的幅频特性会相同吗?为什么?N=16 呢?

5.实验报告要求
1、列写调试通过的实验程序,打印实验程序产生的曲线图形。

2、列出本实验提出的有关 MATLAB 函数在调用时应注意的问题。

3、给出思考题答案。
实验 5 模拟滤波器分析设计及特性测试

1. 实验目的
学习模拟滤波器的网络分析和频响特性测量;根据给定的滤波器指标设计巴特沃斯型
低通滤波器。
1. 了解 RC 无源和有源滤波器的种类、基本结构及其特性。
2. 推导 RC 无源和有源滤波器的系统函数。
3. 用扫频法测试滤波器的幅频特性。
4. 绘制滤波器的幅频特性曲线,。

2. 模拟滤波器分析和设计
1. 模拟滤波器的传输函数
根据模拟滤波器的 S 域模型和对应的网络结构,可得实际系统的传输函数为:

Y (s) a0 s n + a1s n−1 + + an


H ( s) = = n (1)
F ( s) s + b1s n−1 + + bn
分子、分母同乘以 s − n 得:

Y (s) a0 + a1s −1 + + an s −n P(s −1 )


H ( s) = = = (2)
F (s) 1 + b1s −1 + + bn s −n Q(s −1 )

式中 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 )

则 : F (s) = XQ(s−1) = X + b1s−1 X + + bn s −n X


(5)

X = F (s) − b1s −1 X + + bn s −n X 

(6)

Y (s) = P(s−1) X = a0 X + a1s −1 X + + an s −n X


(7)
根据式(6)可以画出如图 6-1 所示的模拟框图。在该图的基础上考虑式(7)就可以画出

如图 6-2 所示系统模拟框图。在连接模拟电路时, s −1 用积分器, −b1 、 −b2 、 −b3 及 a0 、 a1 、

a2 均用标量乘法器,负号可用倒相器,求和用加法器。值得注意的问题是,积分运算单元
有积分时间常数  ,即积分运算单元的实际传递函数为 s −1 /  ,所示标量乘法器的标量

−b1 , −b2 , , −bn 应分别乘以  1 , 2 , , n 。同理, a0 , a1, , an 应分别乘以  0 , 1, 2 , , n 。

此外,本实验采用的积分器是反相积分器,即传递函数为 − s −1 /  ,所以 a0 , a1, , an 还应

分 别 乘 以 (−1)0 ,(−1)1,(−1) 2 , ,(−1) n , 同 理 , b1, b2 , , bn 也 应 分 别 乘

(−1)1,(−1)2 , ,(−1)n 。对于图 6(a)所示的电路,其电压传输函数为:

u2 (s) 1
H (S ) = =
u1 (s) 1 + 1 s −1
RC
(8)
如 RC 值等于积分器的时间常数  ,则可以用图 6(b)所示的模拟装置来模拟,该装置只用
了一个加法器和一个积分时间常数为  的反相积分器。
附:用信号流图法,有

Y (s) a0 s n + a1s n−1 + + an


H ( s) = = n
F ( s) s + b1s n−1 + + bn
整理成梅森(Mason)公式形式,得:
Y (s) a0 s n + a1s n −1 + + an
H (S ) = =
F (s) 1 −  −b s −1 − − bn s − n 
 1 
(9)
由 Mason 公式的含义,可画出此系统的信号流图如图 4 所示,其中和可以用加法器实现,

s −1 可以用积分器实现,常数 a0 , a1, , an 及 b1, b2 , , bn 可以用标量乘法器实现。因此,根

据此信号的流图可画出图 2 所示的模拟系统的方框图。
图 6-1 模拟框图

图 6-2 系统模拟框图

图 6-3 一阶 RC 电路模拟
(a) 一阶 RC 电路;(b) 模拟电路
R = 5.1K  R = 5.1K 

U1 U2
C = 0.047  F

图 6-4 系统信号流图 图 6-5 RC 低通电路

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)
φ(ω)

3.用 Matlab 分析 RC 低通网络的幅频特性


分析计算 RC 低通网络的系统函数 H(S),并用 freqs 计算系统的幅频特性。分析计算结
果中的频率对应关系,逐个得到输出信号的峰峰值大小(Vopp)及 Φ(ω) ,并将测量数据填
入表三。
表三
Vi(V) 10 10 10 10 10 10 10 10 10 10
f(Hz)
Vo(v)
φ(ω)
七、实验仪器:
函数发生器一台 ,双踪示波器一台,实验板一块
八、实验报告要求:
1.叙述实验内容及实验步骤;
2.整理实验数据,并以㏒ f 为横坐标,Vo/Vi 为纵坐标,绘制三种滤波器的幅频特性曲
线;以㏒ f 为横坐标, φ(ω)为纵坐标,绘制三种滤波器的相频特性曲线;并将测得的各滤
波器的截止频率与理论值进行比较。
3. 对比 Matlab 中计算得到的幅频特性与实验测量值,并分析两个结果差异处的原因。
实验 6 IIR 数字滤波器设计及软件实现

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 所示。由图可见,三路
信号时域混叠无法在时域分离。但频域是分离的,所以可以通过滤波的方法在频域分离,
这就是本实验的目的。

图 6.1 三路调幅信号 st 的时域波形和幅频特性曲线


(2)要求将 st 中三路调幅信号分离,通过观察 st 的幅频特性曲线,分别确定可以分
离 st 中三路抑制载波单频调幅信号的三个滤波器(低通滤波器、带通滤波器、高通滤波器)
的通带截止频率和阻带截止频率。要求滤波器的通带最大衰减为 0.1dB,阻带最小衰减为
60dB。
提示:抑制载波单频调幅信号的数学表示式为
1
s(t ) = cos(2 f 0t ) cos(2 f ct ) = [cos(2 ( f c − f 0 )t ) + cos(2 ( f c + f 0 )t )]
2
其中, cos(2 f ct ) 称为载波,fc 为载波频率, cos(2 f 0t ) 称为单频调制信号,f0 为调制正

弦波信号频率,且满足 f c  f 0 。由上式可见,所谓抑制载波单频调幅信号,就是 2 个正

弦信号相乘,它有 2 个频率成分:和频 f c + f 0 和差频 f c − f 0 ,这 2 个频率成分关于载波

频率 fc 对称。所以,1 路抑制载波单频调幅信号的频谱图是关于载波频率 fc 对称的 2 根谱


线,其中没有载频成分,故取名为抑制载波单频调幅信号。容易看出,图 10.4.1 中三路调
幅信号的载波频率分别为 250Hz、500Hz、1000Hz。如果调制信号 m(t)具有带限连续频谱,

无直流成分,则 s(t ) = m(t ) cos(2 f ct ) 就是一般的抑制载波调幅信号。其频谱图是关于载

波频率 fc 对称的 2 个边带 (上下边带) ,在专业课通信原理中称为双边带抑制载波 (DSB-SC)


调 幅 信 号 , 简 称 双 边 带 (DSB) 信 号 。 如 果 调 制 信 号 m(t) 有 直 流 成 分 , 则

s(t ) = m(t ) cos(2 f ct ) 就是一般的双边带调幅信号。其频谱图是关于载波频率 fc 对称的 2


个边带(上下边带) ,并包含载频成分。
(3)编程序调用 MATLAB 滤波器设计函数 ellipord 和 ellip 分别设计这三个椭圆滤波
器,并绘图显示其幅频响应特性曲线。
(4)调用滤波器实现函数 filter,用三个滤波器分别对信号产生函数 mstg 产生的信号
st 进行滤波,分离出 st 中的三路不同载波频率的调幅信号 y1(n)、y2(n)和 y3(n), 并绘图显
示 y1(n)、y2(n)和 y3(n)的时域波形,观察分离效果。

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 所示,供读者参考。

调用函数 mstg 产生 st,自动绘图


显示 st 的时域波形和幅频特性曲线

调用 ellipord 和 ellip 分别设计三个椭圆滤


波器,并绘图显示其幅频响应特性曲线。

调用 filter,用三个滤波器分别对信号 st 进行滤波,分离
出三路不同载波频率的调幅信号 y1(n)、y2(n)和 y3(n)

绘图显示 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 信号与抑制载波调幅信号的时域波形及其频谱的差别。

提示:AM 信号表示式: s(t ) = [1 + cos(2 f 0t )]cos(2 f ct ) 。

7.实验报告要求
(1)简述实验目的及原理。
(2)画出实验主程序框图,打印程序清单。
(3)绘制三个分离滤波器的损耗函数曲线。
(4)绘制经过滤波分理出的三路调幅信号的时域波形。
(5)简要回答思考题。

滤波器参数及实验程序清单
1、滤波器参数选取
观察图 10.4.1 可知,三路调幅信号的载波频率分别为 250Hz、500Hz、1000Hz。带宽
(也可以由信号产生函数 mstg 清单看出)分别为 50Hz、100Hz、200Hz。所以,分离混合
信号 st 中三路抑制载波单频调幅信号的三个滤波器(低通滤波器、带通滤波器、高通滤波
器)的指标参数选取如下:
对载波频率为 250Hz 的条幅信号,可以用低通滤波器分离,其指标为

带截止频率 f p = 280 Hz,通带最大衰减 p = 0.1dB dB;

阻带截止频率 f s = 450 Hz,阻带最小衰减 s = 60dB dB,


对载波频率为 500Hz 的条幅信号,可以用带通滤波器分离,其指标为

带截止频率 f pl = 440 Hz, f pu = 560 Hz,通带最大衰减 p = 0.1dB dB;

阻带截止频率 f sl = 275 Hz,f su = 900 Hz,Hz,阻带最小衰减 s = 60dB dB,


对载波频率为 1000Hz 的条幅信号,可以用高通滤波器分离,其指标为

带截止频率 f p = 890 Hz,通带最大衰减 p = 0.1dB dB;

阻带截止频率 f s = 550 Hz,阻带最小衰减 s = 60dB dB,


说明:
(1)为了使滤波器阶数尽可能低,每个滤波器的边界频率选择原则是尽量使滤
波器过渡带宽尽可能宽。
(2)与信号产生函数 mstg 相同,采样频率 Fs=10kHz。
(3)为了滤波器阶数最低,选用椭圆滤波器。
按照图 10.4.2 所示的程序框图编写的实验程序为 exp4.m。
2、实验程序清单
%实验 4 程序 exp4.m
% IIR 数字滤波器设计及软件实现
clear all;close all
Fs=10000;T=1/Fs; %采样频率
%调用信号产生函数 mstg 产生由三路抑制载波调幅信号相加构成的复合信号 st
st=mstg;
%低通滤波器设计与实现
fp=280;fs=450;
wp=2*fp/Fs;ws=2*fs/Fs;rp=0.1;rs=60; %DF 指标(低通滤波器的通、阻带边界频)
[N,wp]=ellipord(wp,ws,rp,rs); %调用 ellipord 计算椭圆 DF 阶数 N 和通带截止频率 wp
[B,A]=ellip(N,rp,rs,wp); %调用 ellip 计算椭圆带通 DF 系统函数系数向量 B 和 A
y1t=filter(B,A,st); %滤波器软件实现
% 低通滤波器设计与实现绘图部分
figure(2);subplot(3,1,1);
myplot(B,A); %调用绘图函数 myplot 绘制损耗函数曲线
yt='y_1(t)';
subplot(3,1,2);tplot(y1t,T,yt); %调用绘图函数 tplot 绘制滤波器输出波形
%带通滤波器设计与实现
fpl=440;fpu=560;fsl=275;fsu=900;
wp=[2*fpl/Fs,2*fpu/Fs];ws=[2*fsl/Fs,2*fsu/Fs];rp=0.1;rs=60;
[N,wp]=ellipord(wp,ws,rp,rs); %调用 ellipord 计算椭圆 DF 阶数 N 和通带截止频率
wp
[B,A]=ellip(N,rp,rs,wp); %调用 ellip 计算椭圆带通 DF 系统函数系数向量 B 和 A
y2t=filter(B,A,st); %滤波器软件实现
% 带通滤波器设计与实现绘图部分(省略)
%高通滤波器设计与实现
fp=890;fs=600;
wp=2*fp/Fs;ws=2*fs/Fs;rp=0.1;rs=60; %DF 指标(低通滤波器的通、阻带边界频)
[N,wp]=ellipord(wp,ws,rp,rs); %调用 ellipord 计算椭圆 DF 阶数 N 和通带截止频率
wp
[B,A]=ellip(N,rp,rs,wp,'high'); %调用 ellip 计算椭圆带通 DF 系统函数系数向量 B 和 A
y3t=filter(B,A,st); %滤波器软件实现
% 高低通滤波器设计与实现绘图部分(省略)
实验 7 FIR 数字滤波器设计与软件实现

1.实验目的
(1)掌握用窗函数法设计 FIR 数字滤波器的原理和方法。
(2)掌握用等波纹最佳逼近法设计 FIR 数字滤波器的原理和方法。
(3)掌握 FIR 滤波器的快速卷积实现原理。
(4)学会调用 MATLAB 函数设计与实现 FIR 滤波器。
2. 实验内容及步骤
(1)认真复习第七章中用窗函数法和等波纹最佳逼近法设计 FIR 数字滤波器的原理;
(2)调用信号产生函数 xtg 产生具有加性噪声的信号 xt,并自动显示 xt 及其频谱,
如图 7.1 所示;

图 7.1 具有加性噪声的信号 x(t)及其频谱如图


(3)请设计低通滤波器,从高频噪声中提取 xt 中的单频调幅信号,要求信号幅频失
真小于 0.1dB,将噪声频谱衰减 60dB。先观察 xt 的频谱,确定滤波器指标参数。
(4)根据滤波器指标选择合适的窗函数,计算窗函数的长度 N,调用 MATLAB 函数
fir1 设计一个 FIR 低通滤波器。并编写程序,调用 MATLAB 快速卷积函数 fftfilt 实现对 xt
的滤波。绘图显示滤波器的频响特性曲线、滤波器输出信号的幅频特性图和时域波形图。
(4)重复(3) ,滤波器指标不变,但改用等波纹最佳逼近法,调用 MATLAB 函数
remezord 和 remez 设计 FIR 数字滤波器。并比较两种设计方法设计的滤波器阶数。
提示:○ 1 MATLAB 函数 fir1 和 fftfilt 的功能及其调用格式请查阅课本第 7 章;

2 采样频率 Fs=1000Hz,采样周期 T=1/Fs;
3 根据图 10.6.1(b)和实验要求,可选择滤波器指标参数:通带截止频率 fp=120Hz,阻

带截至频率 fs=150Hz,换算成数字频率,通带截止频率 p = 2 f p  = 0.24 ,通带最大衰
为 0.1dB,阻带截至频率 s = 2 f s  = 0.3 ,阻带最小衰为 60dB。]

4 实验程序框图如图 10.5.2 所示,供读者参考。


Fs=1000,T=1/Fs

xt=xtg
产生信号 xt, 并显示 xt 及其频谱

用窗函数法或等波纹最佳逼近法
设计 FIR 滤波器 hn

对信号 xt 滤波:yt=fftfilt(hn,xt)

1、计算并绘图显示滤波器损耗函数
2、绘图显示滤波器输出信号 yt

End

图 7.2 实验程序框图

4.思考题
(1)如果给定通带截止频率和阻带截止频率以及阻带最小衰减,如何用窗函数法设计线
性相位低通滤波器?请写出设计步骤.

(2)如果要求用窗函数法设计带通滤波器,且给定通带上、下截止频率为 pl 和 pu ,

阻带上、下截止频率为 sl 和 su ,试求理想带通滤波器的截止频率 cl和cu 。


(3)解释为什么对同样的技术指标,用等波纹最佳逼近法设计的滤波器阶数低?
5.实验报告要求
(1)对两种设计 FIR 滤波器的方法(窗函数法和等波纹最佳逼近法)进行分析比较,
简述其优缺点。
(2)附程序清单、打印实验内容要求绘图显示的曲线图。
(3)分析总结实验结果。
(4)简要回答思考题。

6.信号产生函数 xtg 程序清单


function xt=xtg(N)
%实验五信号 x(t)产生,并显示信号的幅频特性曲线
%xt=xtg(N) 产 生 一 个 长 度 为 N, 有 加 性 高 频 噪 声 的 单 频 调 幅 信 号 xt, 采 样 频 率
Fs=1000Hz
%载波频率 fc=Fs/10=100Hz,调制正弦波频率 f0=fc/10=10Hz.
Fs=1000;T=1/Fs;Tp=N*T;
t=0:T:(N-1)*T;
fc=Fs/10;f0=fc/10; %载波频率 fc=Fs/10,单频调制信号频率为 f0=Fc/10;
mt=cos(2*pi*f0*t); %产生单频正弦波调制信号 mt,频率为 f0
ct=cos(2*pi*fc*t); %产生载波正弦波信号 ct,频率为 fc
xt=mt.*ct; %相乘产生单频调制信号 xt
nt=2*rand(1,N)-1; %产生随机噪声 nt
%=======设计高通滤波器 hn,用于滤除噪声 nt 中的低频成分,生成高通噪声=======
fp=150; fs=200;Rp=0.1;As=70; % 滤波器指标
fb=[fp,fs];m=[0,1]; % 计算 remezord 函数所需参数 f,m,dev
dev=[10^(-As/20),(10^(Rp/20)-1)/(10^(Rp/20)+1)];
[n,fo,mo,W]=remezord(fb,m,dev,Fs); % 确定 remez 函数所需参数
hn=remez(n,fo,mo,W); % 调用 remez 函数进行设计,用于滤除噪声 nt 中的低频成分
yt=filter(hn,1,10*nt); %滤除随机噪声中低频成分,生成高通噪声 yt
%================================================================
xt=xt+yt; %噪声加信号
fst=fft(xt,N);k=0:N-1;f=k/Tp;
subplot(3,1,1);plot(t,xt);grid;xlabel('t/s');ylabel('x(t)');
axis([0,Tp/5,min(xt),max(xt)]);title('(a) 信号加噪声波形')
subplot(3,1,2);plot(f,abs(fst)/max(abs(fst)));grid;title('(b) 信号加噪声的频谱')
axis([0,Fs/2,0,1.2]);xlabel('f/Hz');ylabel('幅度')
滤波器参数及实验程序清单
1、滤波器参数选取
根据 10.5.1 节实验指导的提示③选择滤波器指标参数:通带截止频率 fp=120Hz,阻带
截 至 频 率 fs=150Hz 。 代 入 采 样 频 率 Fs=1000Hz , 换 算 成 数 字 频 率 , 通 带 截 止 频 率

p = 2 f p  = 0.24 ,通带最大衰为 0.1dB,阻带截至频率 s = 2 f s  = 0.3 ,阻带最小衰

为 60dB。所以选取 blackman 窗函数。与信号产生函数 xtg 相同,采样频率 Fs=1000Hz。


按照图 10.5.2 所示的程序框图编写的实验程序为 exp5.m。
2、实验程序清单
% 实验 5 程序 exp5.m
% FIR 数字滤波器设计及软件实现
clear all;close all;
%==调用 xtg 产生信号 xt, xt 长度 N=1000,并显示 xt 及其频谱,=========
N=1000;xt=xtg(N);
fp=120; fs=150;Rp=0.2;As=60;Fs=1000; % 输入给定指标
% (1) 用窗函数法设计滤波器
wc=(fp+fs)/Fs; %理想低通滤波器截止频率(关于 pi 归一化)
B=2*pi*(fs-fp)/Fs; %过渡带宽度指标
Nb=ceil(11*pi/B); %blackman 窗的长度 N
hn=fir1(Nb-1,wc,blackman(Nb));
Hw=abs(fft(hn,1024)); % 求设计的滤波器频率特性
ywt=fftfilt(hn,xt,N); %调用函数 fftfilt 对 xt 滤波
%以下为用窗函数法设计法的绘图部分(滤波器损耗函数,滤波器输出信号波形)
%省略
% (2) 用等波纹最佳逼近法设计滤波器
fb=[fp,fs];m=[1,0]; % 确定 remezord 函数所需参数 f,m,dev
dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];
[Ne,fo,mo,W]=remezord(fb,m,dev,Fs); % 确定 remez 函数所需参数
hn=remez(Ne,fo,mo,W); % 调用 remez 函数进行设计
Hw=abs(fft(hn,1024)); % 求设计的滤波器频率特性
yet=fftfilt(hn,xt,N); % 调用函数 fftfilt 对 xt 滤波
%以下为用等波纹设计法的绘图部分(滤波器损耗函数,滤波器输出信号 yw(nT)波形)
%省略
实验 8 数字信号处理在双音多频拨号系统中的应用

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.。每一个数字均由高、低频带中各一个频率构成,

例 如 1 用 697Hz 和 1209Hz 两 个 频 率 , 信 号 用 sin(2f1t ) + sin(2f 2 t ) 表 示 , 其 中

f1 = 679 Hz , f 2 = 1209Hz 。这样 8 个频率形成 16 种不同的双频信号。具体号码以及


符号对应的频率如表 10.6.1 所示。表中最后一列在电话中暂时未用。
表 10.64.1 双频拨号的频率分配
列 1209Hz 1336Hz 1477Hz 633Hz

697Hz 1 2 3 A

770Hz 4 5 6 B

852Hz 7 8 9 C

942Hz * 0 # D

DTMF 信号在电话中有两种作用,一个是用拨号信号去控制交换机接通被叫的用户电话
机,另一个作用是控制电话机的各种动作,如播放留言、语音信箱等。
电话中的双音多频(DTMF)信号的产生与检测
(1)双音多频信号的产生

假设时间连续的 DTMF 信号用 x(t ) = sin(2f1t ) + sin(2f 2 t ) 表示,式中 f 1和f 2 是


按照表 10.10.1 选择的两个频率, f 1 代表低频带中的一个频率, f 2 代表高频带中的一个频

率。显然采用数字方法产生 DTMF 信号,方便而且体积小。下面介绍采用数字方法产生


DTMF 信号。规定用 8KHz 对 DTMF 信号进行采样,采样后得到时域离散信号为

x(n) = sin(2f1 n / 8000) + sin(2f 2 n / 8000)


形成上面序列的方法有两种,即计算法和查表法。用计算法求正弦波的序列值容易,但
实际中要占用一些计算时间,影响运行速度。查表法是预先将正弦波的各序列值计算出来,
寄存在存储器中,运行时只要按顺序和一定的速度取出便可。这种方法要占用一定的存储
空间,但是速度快。
因为采样频率是 8000Hz,因此要求每 125ms 输出一个样本,得到的序列再送到 D/A
变换器和平滑滤波器,输出便是连续时间的 DTMF 信号。DTMF 信号通过电话线路送到交
换机。
(2)双音多频信号的检测
在接收端,要对收到的双音多频信号进行检测,检测两个正弦波的频率是多少,以判
断所对应的十进制数字或者符号。显然这里仍然要用数字方法进行检测,因此要将收到的
时间连续 DTMF 信号经过 A/D 变换,变成数字信号进行检测。检测的方法有两种,一种
是用一组滤波器提取所关心的频率, 根据有输出信号的 2 个滤波器判断相应的数字或符号。
另一种是用 DFT(FFT)对双音多频信号进行频谱分析,由信号的幅度谱,判断信号的两
个频率,最后确定相应的数字或符号。当检测的音频数目较少时,用滤波器组实现更合适。
FFT 是 DFT 的快速算法,但当 DFT 的变换区间较小时,FFT 快速算法的效果并不明显,
而且还要占用很多内存,因此不如直接用 DFT 合适。下面介绍 Goertzel 算法,这种算法的
实质是直接计算 DFT 的一种线性滤波方法。这里略去 Goertzel 算法的介绍(请参考文献
,可以直接调用 MATLAB 信号处理工具箱中戈泽尔算法的函数 Goertzel,计算 N 点
[19])
DFT 的几个感兴趣的频点的值。
检测 DTMF 信号的 DFT 参数选择
用 DFT 检测模拟 DTMF 信号所含有的两个音频频率,是一个用 DFT 对模拟信号进行
频谱分析的问题。根据第三章用 DFT 对模拟信号进行谱分析的理论,确定三个参数:(1)

采样频率 Fs ,(2)DFT 的变换点数 N,


(3)需要对信号的观察时间的长度 T p 。这三个参

数不能随意选取,要根据对信号频谱分析的要求进行确定。这里对信号频谱分析也有三个
要求: (1)频率分辨率, (2)谱分析的频谱范围,
(3)检测频率的准确性。
1. 频谱分析的分辨率
观察要检测的 8 个频率,相邻间隔最小的是第一和第二个频率,间隔是 73Hz,要求

DFT 最少能够分辨相隔 73Hz 的两个频率,即要求 Fmin = 73Hz 。DFT 的分辨率和对信号

的观察时间 T p 有关,T p min = 1 / F = 1 / 73 = 13.7ms 。考虑到可靠性,留有富裕量,要求

按键的时间大于 40ms。
2 频谱分析的频率范围
要检测的信号频率范围是 697~1633Hz,但考虑到存在语音干扰,除了检测这 8 个频率
外,还要检测它们的二次倍频的幅度大小,波形正常且干扰小的正弦波的二次倍频是很小
的,如果发现二次谐波很大,则不能确定这是 DTMF 信号。这样频谱分析的频率范围为

697~3266Hz。按照采样定理,最高频率不能超过折叠频率,即 0.5Fs  3622Hz ,由此要

求最小的采样频率应为 7.24KHz。因为数字电话总系统已经规定 Fs =8KHz,因此对频谱

分析范围的要求是一定满足的。按照 T p min = 13.7ms , Fs =8KHz,算出对信号最少的采

样点数为 N min = T p min  Fs  110 。

3 检测频率的准确性
这是一个用 DFT 检测正弦波频率是否准确的问题。序列的 N 点 DFT 是对序列频谱
函数在 0~ 2 区间的 N 点等间隔采样,如果是一个周期序列,截取周期序列的整数倍周
期,进行 DFT,其采样点刚好在周期信号的频率上,DFT 的幅度最大处就是信号的准确频
率。分析这些 DTMF 信号,不可能经过采样得到周期序列,因此存在检测频率的准确性问
题。

DFT 的频率采样点频率为  k = 2k / N (k=0,1,2,---,N-1),相应的模拟域采样点频率

为 f k = Fs k / N (k=0,1,2,---,N-1),希望选择一个合适的 N,使用该公式算出的 f k 能接近

要检测的频率,或者用 8 个频率中的任一个频率 f k 代入公式 f k


' '
= Fs k / N 中时,得到
的 k 值最接近整数值,这样虽然用幅度最大点检测的频率有误差,但可以准确判断所对应
的 DTMF 频率,即可以准确判断所对应的数字或符号。经过分析研究认为 N=205 是最好

的。按照 Fs =8KHz,N=205,算出 8 个频率及其二次谐波对应 k 值,和 k 取整数时的频

率误差见表 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

通过以上分析,确定 Fs =8KHz,N=205, T p  40ms 。

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)=

DFT[x(n)],则 Xgk (i ) = X ( K (i )), i = 1,2, ,length( K ) 。


DTMF 信号的产生与识别仿真实验在 MATLAB 环境下进行,编写仿真程序,运行程
序,送入 6 位电话号码,程序自动产生每一位号码数字相应的 DTMF 信号,并送出双频声
音,再用 DFT 进行谱分析,显示每一位号码数字的 DTMF 信号的 DFT 幅度谱,安照幅度
谱的最大值确定对应的频率,再安照频率确定每一位对应的号码数字,最后输出 6 位电话
号码。
本实验程序仿真程序这里提供给读者,只要求读者读懂程序,直接运行程序仿真。程
序名为 exp6。程序分四段:第一段(2—7 行)设置参数,并读入 6 位电话号码;第二段
(9—20 行)根据键入的 6 位电话号码产生时域离散 DTMF 信号,并连续发出 6 位号码对
应的双音频声音;第三段(22—25 行)对时域离散 DTMF 信号进行频率检测,画出幅度
谱;第四段(26—33 行)根据幅度谱的两个峰值,分别查找并确定输入 6 位电话号码。根
据程序中的注释很容易分析编程思想和处理算法。
程序清单
%数字信号处理实验 6 程序:exp6.m
% DTMF 双频拨号信号的生成和检测程序
%clear all;clc;
tm=[1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,68]; % DTMF 信号代表的 16 个数
N=205;K=[18,20,22,24,31,34,38,42];
f1=[697,770,852,941]; % 行频率向量
f2=[1209,1336,1477,1633]; % 列频率向量
TN=input('键入 6 位电话号码= '); % 输入 6 位数字
TNr=0; %接收端电话号码初值为零
for l=1:6;
d=fix(TN/10^(6-l));
TN=TN-d*10^(6-l);
for p=1:4;
for q=1:4;
if tm(p,q)==abs(d); break,end % 检测码相符的列号 q
end
if tm(p,q)==abs(d); break,end % 检测码相符的行号 p
end
n=0:1023; % 为了发声,加长序列
x = sin(2*pi*n*f1(p)/8000) + sin(2*pi*n*f2(q)/8000);% 构成双频信号
sound(x,8000); % 发出声音
pause(0.1)
% 接收检测端的程序
X=goertzel(x(1:205),K+1); % 用 Goertzel 算法计算八点 DFT 样本
val = abs(X); % 列出八点 DFT 向量
subplot(3,2,l);
stem(K,val,'.');grid;xlabel('k');ylabel('|X(k)|') % 画出 DFT(k)幅度
axis([10 50 0 120])
limit = 80; %
for s=5:8;
if val(s) > limit, break, end % 查找列号
end
for r=1:4;
if val(r) > limit, break, end % 查找行号
end
TNr=TNr+tm(r,s-4)*10^(6-l);
end
disp('接收端检测到的号码为:') % 显示接收到的字符
disp(TNr)

数据分析
运行程序,根据提示键入 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

图 10.6.1 8 位电话号码 87654321 的 DTMF 信号在 8 个近似基频点的 DFT 幅度


5. 实验报告要求
(1) 分析程序,画出仿真程序流程图。
(2) 打印 6 位和 8 位电话号码 DTMF 信号的幅度谱。
(3) 简述 DTMF 信号的参数:采样频率、DFT 的变换点数以及观测时间的确定原则。
实验 9 音频信号采集及处理

一、实验目的
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'为
存储的文件名。

2. Windows 或其他第 3 方录制 wav 文件后,matlab 中调用用 audioread 和 audiowrite 读取


wav 文件,具体参数设置查看 matlab function 帮助。

三、实验任务与步骤

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 MATLAB 通用命令介绍

1.1.1、管理命令与函数

1、指定 MATLAB 搜索路径:path(),addpath()与 rmpath():指定、增加或删除 MATLAB


搜索路径。语法格式为

p=path 将搜索路径字符串值返回给字符串变量 p。

path(‘newdir’) 将搜索路径改变为字符串‘newdir’指定的路径。

rmpath(‘directory’) 删除‘directory’路径。

addpath(‘directory’) 增加‘directory’路径。

addpath(’dir1’,’dir2’,’dir3’,…);

addpath(…,’-flag’);其中 flag 值为 0 或 begin 表示将目录加在原搜索路径之前;1 或 end 表


示将目录加在原搜索路径之后。

addpath(‘newdir’,’begin’)相当于 path(‘newdir’,path);

addpath(‘newdir’,’end’)相当于 path(path, ‘newdir’)。

2、doc 命令:读入超文本文件

3、help 命令:MATLAB 函数和 M-文件的在线式帮助。语法格式为

help topic topic 为要取得帮助的主题,可缺省 topic。

4、type 命令:在 MATLAB 命令窗口显示文件内容。语法格式为

type filename filename 为文件名,缺省扩展名为“.m”。

5、what 命令:列出给定目录下的所有 M-文件、MAT-文件和 MEX-文件。语法格式为

what 列出当前目录下的上述文件;

what dirname 列出给定目录 dirname 下的上述文件;dirname 可不用全路径名称,只用最后


一层或两层路径代替。

1.1.2、变量和工作空间管理命令与函数

1、clear 命令:清除内存中的对象。语法格式为

clear 清除工作空间的所有变量;

clear name 清除工作空间中的 M-文件、MEX-文件或变量 name;如果 name 是全局变量,


从工作空间清除后,任何定义全局变量的函数均可访问该变量;

clear name1 name2 name3… 从工作空间中清除 name1 name2 name3…;

clear global name 从工作空间清除全局变量 name;

clear keyword 根据不同 keyword 执行不同的操作;如果

keyword 为 functions 则从内存中清除现编译的 M-函数;

keyword 为 variables 则从工作空间中清除所有变量;

keyword 为 mex 则从内存中清除 MEX-文件;

keyword 为 global 清除所有全局变量;

keyword 为 all 清除内存中所有变量、函数、MEX-文件,使工作空间清空。

2、disp( ):显示文本或数组。语法格式为

disp(X) 如果 X 是数组,则显示数组内容;若 X 包含字符串,则显示字符串内容。

例 1.1

Z=[1+2i,2-2i,3-i;1+i,1+i,1-i;2-i,1+3i,4+i]

Z=

1.0000 + 2.0000i 2.0000 - 2.0000i 3.0000 - 1.0000i

1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i

2.0000 - 1.0000i 1.0000 + 3.0000i 4.0000 + 1.0000i

str='Good Morning'

str =

Good Morning

disp(Z)

1.0000 + 2.0000i 2.0000 - 2.0000i 3.0000 - 1.0000i

1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i

2.0000 - 1.0000i 1.0000 + 3.0000i 4.0000 + 1.0000i

disp(str)

Good Morning

3、length():计算向量长度。语法格式为

n= length(X) 返回 X 最长维数大小;如果 X 是向量,返回其长度。


例 1.2 以例 1.1 中的 Z 和 str 为例

n=length(Z)

n=

l=length(str)

l=

12

:计算数组维数大小。语法格式为
4、size()

d= size(X) 返回一个向量值 d,向量中的元素值分别表示数组 X 的每维大小;

[m,n]=size(X) 将矩阵 X 的大小返回到变量 m,n 中;

m=size(X,dim) 返回 X 第 dim 指定维的大小。

例 1.3 仍以 1.1 的 Z 和 str 为例

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/whos global 列出工作空间中的全局变量;

who/whos- file filename 列出所指定 MAT 文件中的变量;

who/whos…var1 var2 显示指定的变量。

例 1.4 以例 1.3 运行后为例

who

Your variables are:

Z d m m1 m2 m3 n str

>> whos

Name Size Bytes Class

Z 3x3 144 double array (complex)

d 1x2 16 double array

m 1x1 8 double array

m1 1x1 8 double array

m2 1x1 8 double array

m3 1x1 8 double array

n 1x1 8 double array

str 1x12 24 char array

Grand total is 28 elements using 224 bytes

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

对于非标量 A 和 B,A 的列数必须与 B 的行数相等,即公式中的 n。一个标量可以与任何


一个矩阵相乘。

4、“.﹡”:元素相乘;A.﹡B 表示数组 A 和数组 B 的对应元素相乘;A 和 B 必须大小相同,


或者其中之一为标量。
5、“/”:斜线或矩阵右除;B/A 近似等于 B*inv(A);精确地表示:B/A=(A’\B’)’。

6、“./”:元素右除;A./B 表示矩阵元素 A(i,j)/ B(i,j);A 和 B 必须大小相同,或者其中之


一为标量。

7、“\”:反斜线或矩阵左除;如果 A 为方阵,A\B 近似等于 inv(A)*B。

8、“.\”:元素左除;A.\B 表示矩阵元素 B(i,j)/A(i,j);A 和 B 必须大小相同,或者其中之


一为标量。

9、“:”:冒号;是一个非常有用的操作符;可以产生向量、数组下标以及 for 循环。如:

j:k 相当于[j,j+1,….,k];如果 k<j,则向量为空。

j:i:k 相当于[j,j+i,j+2i,…,k] ;如果 i>0,并且 k<j,则向量为空;或者 i<0,并且 k>j,则向量


为空。

10、^:当 A 和 B 都是标量时,表示标量 A 的 B 次方幂。当 A 为方阵,B 为正整数时,


表示矩阵 A 的 B 次乘积;B 为负整数时,表示矩阵 A 的逆的 B 次乘积。

11、关系运算符:<,>,<=,>=,==,~=分别表示“小于”“大于”“小于等于”“大于等于”“等于”“不
等于”;对数组进行关系运算时,对每个元素进行比较,运算结果是一个与数组大小一样
的由 0 和 1 构成的数组。<,>,<=,>=四种运算符只比较操作数实部,而==,~=既比较实部又
比较虚部。

12、逻辑运算符:︱,&,~,xor 分别表示“或”“与”“非”“异或”运算。

1.3 基本概念
变量

MATLAB 变量名遵循以下规则:

(1)必须以字母开头;

(2)字符长度不得超过 31 个;

(3)可以由字母、数字和下划线混合组成;

(4)区分大小写。

MATLAB 中的固定变量:虚数单位 i 和 j,圆周率 pi

数值

MATLAB 中常用十进制数来表示一个数值,也可用科学计数法来表示。如:

实数:123 虚数:3i 科学计数法:2.07e3(2.07×103)

矩阵

矩阵是 MATLAB 进行数据处理和运算的基本元素,是由下标表示次序的集合。通常意义


上的标量(数量)是作为 1×1 的矩阵来处理的。

数组

从数的集合这个角度看,矩阵和数组并无不同,矩阵在某些情况下可视为二阶数组。但从
运算角度看,二者的运算规则并不完全相同,因此在运算中要注意区别。

函数

MATLAB 提供了丰富的内置函数,使用时可直接调用这些函数进行数据处理。函数由函数
名和参数组成,调用格式如下:

函数名(参数)

如 sin(t)

语句

MATLAB 采用命令行式的表达式语言,一个命令就是一条语句,其格式与手写的数学表达
式相似。在命令窗口输入语句并按回车键即可运行并输出结果。

MATLAB 语句采用以下两种形式表示:

表达式

变量=表达式

1.4 M 文件

MATLAB 的工作方式有两种:一种是交互式的指令操作方式,可在命令窗口直接输入命令
行后按回车键,此方式适用于简单运算与结果分析;另一种是 M 文件的编程工作方式,
适用于执行多条语句,解决复杂问题。

MATLAB 为用户提供了专用的 M 文件编辑器,使用方法如下:

1、创建

启动 MATLAB,单击命令窗口工具栏的“New M-File”图标按钮,即可打开 M 文件编辑器。


在 M 文件编辑器中,用户可以用创建一般文本的办法编辑程序。

2、保存与打开

单击 M 文件编辑器窗口工具栏中的“Save”图标按钮。系统默认的文件名是“Untitled.m”,用
户可重命名。系统默认的保存目录为“matlab 所在目录\work”。

若要打开 M 文件,可单击 MATLAB 命令窗口工具栏的“Open file”按钮,打开用户指定的


M 文件。

3、执行

在 MATLAB 命令窗口键入 M 文件名(不加扩展名)并按回车键即可,或者在 M 文件编


辑器的主工具栏上单击“run”图标。

若用户将文件保存在“work”以外的目录下,可通过在 MATLAB 命令窗口中添加工作路径


来调用该文件:

【File】→【Set Path】→【Add Folder】→选择目录→【确定】→【Save】→【Close】

1.5 二维绘图

1、简单的二维曲线

一条曲线:plot(x,y) 以 x 向量为横轴,y 向量为纵轴绘制曲线。

多条曲线:plot(x1,y1,’option’, x2,y2,’option’) 分别以 x1,x2 向量为横轴,y1,y2 向量


为纵轴绘制曲线。’option’表示每条曲线的属性,如颜色、线型等。曲线颜色、线型如下:

b blue . point - solid

g green o circle : dotted

r red x x-mark -. dashdot

c cyan + plus -- dashed

m magenta * star (none) no line

y yellow s square

k black d diamond

v triangle (down)
^ triangle (up)

< triangle (left)

> triangle (right)

p pentagram

h hexagram

亦可在画完一条曲线后用“hold”命令保持住,再画下一条曲线。

2、离散序列图的绘制

stem(k,y) 以 k 向量为横坐标,Y 向量为纵坐标,画空心圆圈,并用线段连接到横轴。

stem(k,y,’filled’)或 stem(k,y,’.’) 图形同上,只是空心圆圈变为实心。’filled’与’.’只是实心


圆圈的大小不同。

1.6 图形处理

1.6.1 图形标注

1、坐标轴标注和图形标题

主要函数有 xlable、ylabel、zlabel、和 title 等,它们的调用格式基本相同,具体代码如下:

xlabel('string')

xlabel(fname)

xlabel(’...,'PropertyName',PropertyValue,...)

ylabel('string')

ylabel(fname)

zlabel('string')

zlabel(fname)

title('string')

titlel(fname)

title(’...,'PropertyName',PropertyValue,...)

其中,string 是标注所用的说明语句,fname 是一个函数名,系统要求该函数必须返回一个


字符串作为标注语句。'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

在标注过程中经常会遇到特殊符号的输入问题,如上例中 pi 的输入,MATLAB 语言提供


了相应的字符转换。常见的转换如表 1 所示:

附表 1-1 MATLAB 常见的字符转换

控制字符串 转换字符串 控制字符串 转换字符串

\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)或任意一个字符串之一。对图例位置标注定义如下:

'North' inside plot box near top 绘图区内上中部

'South' inside bottom 绘图区内下部

'East' inside right 绘图区内右部

'West' inside left 绘图区内左部

'NorthEast' inside top right (default for 2-D plots) 右上部

'NorthWest' inside top left 左上部

'SouthEast' inside bottom right 右下

'SouthWest' inside bottom left 左下

'NorthOutside' outside plot box near top 绘图区外的上中部

'SouthOutside' outside bottom

'EastOutside' outside right

'WestOutside' outside left

'NorthEastOutside' outside top right (default for 3-D plots)

'NorthWestOutside' outside top left

'SouthEastOutside' outside bottom right

'SouthWestOutside' outside bottom left

'Best' least conflict with data in plot 标注与图形的重叠最小处

'BestOutside' least unused space outside plot 绘图区外占用最小面积

标注的位置还可以通过定位代号来定义,代号说明如下:

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])


axis([xmin xmax ymin ymax zmin zmax cmin cmax])

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

axis([0 pi/2 0 5]);


使用 axis 命令设定坐标轴之后的图形如附图 1-7 所示:
5

4.5

3.5

2.5

1.5

0.5

0
0 0.5 1 1.5

附图 1-7

2、zoom 函数控制坐标轴缩放,其调用格式如下:

zoom’控制字符串’

其中控制字符串可以是以下任一字符串:

空:在 zoom on 和 zoom off 之间切换

(factor):以 factor 作为缩放因子进行坐标轴缩放

on:允许对坐标轴缩放

off:禁止对坐标轴缩放

out:恢复到最初的坐标轴设置

reset:设置当前的坐标轴为最初值

xon:允许对 x 轴进行缩放

yon:允许对 y 轴进行缩放

3、grid 函数控制坐标网格

该命令用于绘制坐标网格,其调用格式如下:

grid on //给当前坐标轴添加网格线

grid off //取消坐标轴的网格线

grid minor //设置网格绘制的密度,即网格线间的间距


grid //在 grid on 和 grid off 之间切换

例 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

例 上例中添加 box off 命令后,其效果如附图 1-9 所示:


1

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 、图形数据取点

使用取点命令 ginput 可通过鼠标来读取二维平面图中任一点的坐标值。其调用格式如下:

[x,y]=ginput(n) // 可通过鼠标来选择 n 个点,它们的坐标值保存在[x,y]中,用户可通过 enter


键来结束取点

[x,y]=ginput //取点的数目不受限制,它们的坐标值保存在[x,y]中,用户可通过 enter 键来结


束取点

[x,y,button]=ginput (….) //返回值 button 记录了在选取每个点时的相关信息;

例 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

取点结束后图形效果如附图 1-11 所示:

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 //启动图形保持功能,此后绘制的图形都添加到当前的图形窗口中,并自动调整
坐标轴范围

hold off //关闭图形保持功能

hold //在 hold on 和 hold off 之间切换

【subplot 函数】

该函数用于生成并控制多个坐标轴。把当前图形窗口分隔成几个矩形部分,不同的部分是
按行方向以数字进行标号的。每一部分有一坐标轴。常用调用格式如下:

subplot(m,n,p) //将一图形窗口分成 m*n 个小窗口,在第 p 个小窗口中创建一坐标轴。则


新的坐标轴成为当前坐标轴。如附图 1-12 所示。若 p 为一向量,则创建一坐标轴,包含所
有罗列在 p 中的小窗口。用户可以通过参数 p 分别对各子绘图区域进行操作,子绘图区域
的编号按行从左至右编号,如附图 1-13 所示.

subplot(m,n,p,'replace') //如果定义的坐标轴已存在,那么就删掉已有的,并创建一个新的
坐标轴

subplot(m,n,p,'align') //对齐坐标轴

subplot(h) //使句柄 h 对应的坐标轴成为当前的,用于后面图形的显示

subplot('position',[left bottom width height]) //在由 4 个元素指定的位置上创建一坐标轴。位


置元素的单位为归一化单位。

例 income=[3.2 4.1 5.0 5.6];


outgo=[2.5 4.0 3.35 4.9];
subplot(2,1,1);plot(income);
subplot(2,1,2);plot(outgo);
6

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 三角函数

MATLAB 提供的三角函数及其功能如附表 1-1 所示:

附表 1-1 三角函数

函数名 功能描述 函数名 功能描述

sin 正弦 sec 正割

sind 正弦,输出以度为单位 secd 正割,输出以度为单位

sinh 双曲正弦 sech 双曲正割

asin 反正弦 asec 反正割

asind 反正弦,输出以度为单位 asecd 反正割,输出以度为单位

asinh 反双曲正弦 asech 反双曲正割

cos 余弦 csc 余割

cosd 余弦,输出以度为单位 cscd 余割,输出以度为单位

cosh 双曲余弦 csch 双曲余割

acos 反余弦 acsc 反余割

acosd 反余弦,输出以度为单位 acscd 反余割,输出以度为单位

acosh 反双曲余弦 acsch 反双曲余割

tan 正切 cot 余切

tand 正切,输出以度为单位 cotd 余切,输出以度为单位

tanh 双曲正切 coth 双曲余切

atan 反正切 acot 反余切

atand 反正切,输出以度为单位 acotd 反余切,输出以度为单位

atan2 四象限反正切 acoth 反双曲余切

atanh 反双曲正切

1.7.2 指数和对数函数

MATLAB 提供的指数、对数函数及其功能如附表 1-2 所示:

附表 1-2 指数和对数函数
函数名 功能描述 函数名 功能描述

exp 以 e 为底的指数 realpow 对数,若结果是复数则报错

expm1 准确计算 exp(x)-1 的值 reallog 自然对数,若输入不是正数则报错

log 自然对数(以 e 为底) realsqrt 开平方根,若输入不是正数则报错

log1p 准确计算 log(1+x)的值 sqrt 开平方根

log10 常用对数(以 10 为底) nthroot 求 x 的 n 次方根

log2 以 2 为底的对数 返回满足 2^P>=abs(N)的最小整数 P,


nextpow2 其中 N 为输入
pow2 以 2 为底的指数

1.7.3 复数函数

MATLAB 提供的复数函数及其功能如附表 1-3 所示:

附表 1-3 复数函数

函数名 功能描述 函数名 功能描述 1

abs 绝对值(复数的模) real 复数的实部

angle 复数的相角 unwrap 调整矩阵元素的相位

complex 用实部和虚部构造一个复数 isreal 是否为实数矩阵

conj 复数的共轭 cplxpair 把复数矩阵排列成为复共轭对

imag 复数的虚部

1.7.4 截断和求余函数

MATLAB 提供的截断和求余函数及其功能如附表 1-4 所示:

附表 1-4 截断和求余函数

函数名 功能描述 函数名 功能描述

fix 向零取整 mod 除法求余(与除数同号)

floor 向负无穷方向取整 rem 除法求余(与被除数同号)

ceil 向正无穷方向取整 sign 符号函数

round 四舍五入
下例说明函数 fix(),floor(),ceil()和 round()的区别,具体代码如下:

a=[-1.55 -1.45 1.45 1.55];


a_fix=fix(a)
a_floor=floor(a)
a_ceil=ceil(a)
a_round=round(a)
代码运行结果如下:

a_fix =

-1 -1 1 1

a_floor =

-2 -2 1 1

a_ceil =

-1 -1 2 2

a_round =

-2 -1 1 2

下面的例子说明函数 mod()和 rem()的区别,具体代码如下:

a=[10 -10 10 -10];


b=[8 -8 -8 8];
c_rem=rem(a,b)
c_mod=mod(a,b)
代码运行结果如下

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 基本数据分析函数

MATLAB 提供的部分基本数据分析函数的功能和调用格式如附表 1-5 所示:

函数名 功能描述 基本调用格式

C=max(A),如果 A 是向量,返回向量中的最大值;如果 A 是
矩阵,返回一个包含各列最大值的行向量

C=max(A,B),返回矩阵 A 和 B 中较大的元素,矩阵 A 和 B 必
max 求最大值 须具有相同的大小

C=max(A,[],dim),返回 dim 维上的最大值

[C,I]=max(…),多返回最大值的下标

min 求最小值 同 max 函数的调用格式

M=mean(A),如果 A 是向量,返回向量的平均值;如果 A 是
mean 求平均值 矩阵,返回一个包含各列平均值的行向量

M=mean(A,dim),返回 dim 维上的平均值

median 求中间值 同 mean 函数的调用格式


附录 2 信号处理工具箱常用函数介绍

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 数字滤波器

You might also like