双音多频( dtmf )通信设计的 matlab 仿真 dtmf(double tone multi-freqency)

22
双双双双DTMF 双双双双双 MATLAB 双双 DTMF(Double Tone Multi-Freqenc y) 双双双双双双双 双双双双双双双双双双双双双 双 双双双双双双 双双 DTMF 双双双双双双双双双双双 DTMF 双双双 双双双 8 双双双 双双 4 双双双双双 4 双双双双 1 双双 双双双 1 双双双双双双双双双 双双双双 双双双双 一, 16 双双双 双双双双 16 双双双 双双双双 ,:

Upload: becca

Post on 19-Jan-2016

256 views

Category:

Documents


1 download

DESCRIPTION

双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency) 是按键电话通信,也广泛用于电子邮件和银行系统中,用户可从电话发送 DTMF 信号来选择菜单进行操作。 DTMF 通信系统中共有 8 个频率,分为 4 个高频音和 4 个低频音,用 1 个高频音和 1 个低频音的组合表示一个信号,这样共有 16 种组合,分别代表 16 种信号,如下表:. 本题目的是,理解 DTMF 音频产生的软件方法和 DTMF 解码的几种算法。 一、 DTMF 信号的产生 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

双音多频( DTMF )通信设计的 MATLAB仿真

DTMF(Double Tone Multi-Freqency)是按键电话通信,也广泛用于电子邮件和

银行系统中,用户可从电话发送 DTMF信号来选择菜单进行操作。 DTMF 通信系统中共有 8 个频率,分为 4 个高频音和 4 个低频音,用 1 个高频音和 1 个低频音的组合表示一个信号,这样共有 16种组合,分别代表 16 种信号,如下表:

Page 2: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)
Page 3: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

本题目的是,理解 DTMF 音频产生的软件方法和 DTMF 解码的几种算法。

一、 DTMF 信号的产生(1) 要求 : 按一个数字键如“ 1” ,则产生频率

为 697Hz 和 1209Hz 的两个正弦波,并相加。(为简单起见,仅能按 0~9 键)(2) 可用查表法求数字键对应的频率,为此先建

立拨号数字表矩阵。(3) 电话音频信号在数字信号处理时,取样频率

为 8KHz, 每个数字信号持续时间为 100ms,后面加上 100ms 的间隔(用 0 表示)。

Page 4: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

DTMF 信号产生过程:1) 建立拨号数字表矩阵 TAB, 用“查表法”求用

户所按数字键 k(0~9) 对应的高、低频音。 * 若 k 仅是一个数 ( 例 :k=2) ,则对应 fL=TAB(k+1,1);fH=TAB(k+1,2) * 若 k 不止一个数 ( 例 :k=[0 1 2]) 则查表要进行循环。 fL=TAB(k(i)+1,1);

fH=TAB(k(i)+1,2);

(i=1~n n---k 数组的长度)

1477 852

1336 852

1209 852

1477 770

1336 770

1209 770

1477 697

1336 697

1209 697

1336 941

9

8

7

6

5

4

3

2

1

0

ff

H L对应数字键TAB

Page 5: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

2) 产生相应的 DTMF 信号及间隔时间,每个信号持续时间为 100ms, 间隔时间也是 100ms 。

(取样频率 fs=8kHz), 并将结果存入一个数组中 (out) 。

* 每个 DTMF 信号为多少点?∵t=nTs=n/fs=100ms=0.1s,∴n=tfs=0.1×8000=800 点∴ 每个信号 x 为 800 点 , 间隔 ( 用 0 表示)

800 点。

Page 6: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

* 第 i( 例: i=1) 个信号 ( 和间隔 ) 在 out 数组中的位置 ?

out(1600*(i-1)+1:1600*i-800)=x;% 信号out(1600*i-799:1600*i)=0; % 间隔注: i=1~n3) 画图并监听产生的 DTMF 信号。语句: sound(out,fs)% 监听产生的 DTMF 信

号另外:语句:wavwrite(out,fs,'Ds.wav');

% 将信号存为声音文件 Ds.wav

( 可在媒体播放器中播放)程序如下:

Page 7: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

ClearTAB=[941 1336;697 1209;697 1336;697 1477; ... 770 1209;770 1336;770 1477;852 1209; ...

852 1336;852 1477];% 表矩阵 TABk=input(‘0~9’); % 数字键数组 kn=length(k); %k 的长度 =nfor i=1:n % 产生相应的 DTMF 信号fL=TAB(k(i)+1,1);fH=TAB(k(i)+1,2);n1=800;fs=8000;j=0:1:n1-1;x=sin(2*pi*fL*j/fs)+sin(2*pi*fH*j/fs);out(1600*(i-1)+1:1600*i-800)=x;out(1600*i-799:1600*i)=0;end

Page 8: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

out=out./2;

subplot(211);plot(out); % 画 out

sound(out,fs) % 监听 DTMF 信号wavwrite(out,fs,‘Ds.wav’);% 存入声音文件注:将各自的学号作为数字键输入。思考: 1) 如何产生另 6 个数字键 A,B,C,D,*,# 对应的 DTM

F信号? ( 例:按“ A”, 产生 697Hz 和 1633Hz 正弦信号的

迭加)或(简化为以下问题:)2) 若以数字键 10~15 表示 A,B,C,D,*,#, 如何产生对应的 D

TMF 信号? ( 例:按“ 10”, 产生 697Hz 和 1633Hz 正弦信号的迭加)

Page 9: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

3) 在音频信号产生中,用求解差分方程方法代替正弦函数的调用,从而使软件设计更接近于实际硬件开发应用。

提示:设正弦序列为 h(n)=sin(ωkn)u(n), 为实时实

现 h(n) ,必须找到其满足的差分方程。h(n)= ah(n-1)-h(n-2)+bδ(n-1)(书P34) 2-16)其中: a=2cosωk b=sinωk

用迭代法或 filter 函数法解此差分方程,即得数字频率为 ωk 的正弦序列 h(n) 。

Page 10: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

本文中,每个 DTMF 信号 h(n) 是两个频率的正弦序列相迭加,设为 hL(n) 和 hH(n), 为此,分别求得 hL(n) 和 hH(n) 所满足的差分方程:

hL(n)= aLhL(n-1)-hL(n-2)+bLδ(n-1) ;hH(n)= aHhH(n-1)-hH(n-2)+bHδ(n-1)则 h(n)= hL(n)+hH(n) 。为此,首先建立差分方程系数矩阵。w=2*pi/8000*[941 1336;697 1209;697 1336;697 1477;770 1209;770 1336;770 1477;852 1209;852 1336;852 1477];

tab=[2*cos(w) sin(w)];

%tab=[aL aH bL bH](全部系数 )

Page 11: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

则第 i 个信号对应差分方程系数为:(k--- 数字键矩阵 )aL=[1 -tab(k(i)+1,1) 1];

bL=[0 tab(k(i)+1,3)];

aH=[1 -tab(k(i)+1,2) 1];

bH=[0 tab(k(i)+1,4)];

(i=1~n)

然后,用 filter 解差分方程hL=filter(bL,aL,x);

hH=filter(bH,aH,x);

h=hL+hH;

其余过程同第一种算法。

Page 12: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

进一步思考:怎样用压缩空间的迭代法解差分方程得到 DTMF 信号。(这种方法最接近于实际硬件开发应用)

提示:用 hL(1),hL(2),hL(3) 这三个存贮空间存放 hL

(n-2),hL(n-1),hL(n);用 hH(1),hH(2),hH(3) 这三个存贮空间存放 h

H(n-2),hH(n-1),hH(n);进行迭代。每次迭代的结果马上放入 out 数组中。

Page 13: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

二、 DTMF 信号的解码1.FFT 算法(1) 信号接收;(2) 用 FFT 对信号进行频谱分析;(3)还原为数字键;(2) 中: 几个问题:1 )取样频率为何取 8KHz ?答:语音信号的最高频率 fc =4KHz,因为取样频率

fs≥2fc才能保证取样后的信号不失真, 所以 fs=2×4k=8kHz(工业标准 )

Page 14: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

2 )为何取 200 点为一帧做 FFT?答:为在频谱图中分辨出不同的频率分量,

于是对信号取 200 点为一帧,则频谱分辨率 F=fs/N=8000/200=40Hz<73Hz( 表 1中任意两频率的最小间隔 ) 。

每个信号 (+ 间隔 )占 1600/200=8帧3 )为了对每帧 (200 点)信号作 FFT ,问 : 对每帧信号作多少点 FFT?即N=?

Page 15: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

4) 每帧信号幅频谱仅画 64 点 (N/4) 。 ( 存入 r)

r:8*n 行, 64 列(n--- 信号的个数 , 一帧占一行 )答:因为信号 x 为实数序列,所其幅频谱 |y|具有偶对称性,于是,幅频谱可以仅画 N/2 点,其中第 N/2 点对应实际频率为 fs/2=4KHz,(书P59 图 3-19) 又因为 DTMF

信号中最高频率为 1633Hz ,小于 2KHz( fs/4 ),因此,这里只画 N/4=64 点。

Page 16: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

5) 频谱横坐标为频率点 kk=fk/F=(fk/fs)*N; f---- 实际频率。DTMF 信号是两个正弦波的迭加,它的幅频谱就是两根谱线,谱线的横坐标就是该信号的两个频率点 KL 和 KH 。

例:按键 “ 1” 对应 DTMF 信号的频率fL=697Hz,fH=1209Hz 。 (fs=8kHz,N=256)问 :(1)KL=? KH=? (2)运行该程序,幅频谱图中产生什么 现象?

Page 17: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

6) 用阀值法消除频谱泄漏现象。 ( 存入c)答:由于信号 x 是有限长的,这就相当于对无限长的信号加矩形窗,所以在频谱图中必然会出现频谱泄漏现象 , 使信号能量散布到其他谱线位置。为此,在程序中应选择一适当阀值,将出现在这两条谱线周围的幅度较小的谱线消除(置 0 ),最后,将处理后的幅频谱数据存入数组 c 中。

Page 18: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

(3) 中:1) 用查表 (sm) 法将频率点转换为对应数字键。在幅频谱图中,频率轴的定标方式为频率点 K 而不是

实际频率 f,转换关系为: K=f/F,因此,数字键0-9 对应频率点如下表所示: 频率点矩阵 sm= [31,44;23,40;23,44; 23,48;26,40;26,44; 26,48;28,40;28,44; 28,48] ( 对应数字键 0~9)

Page 19: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

数组 c 中不等于 0 的下标就是各信号的频率点, KL,KH, 查表 sm ,即可将各 DTMF 信号还原为相应的数字键。

* 用到的函数:i)find(c)----找出 c 中≠ 0 的数据的下标。ii)nnz(c)----找出 c 中≠ 0 的数据的个数。2) 查找过程。从 sm 的第一行开始查,查到 ,则数字键 AN= 这时 sm 的下标 - 1;( 以数字键“ 1” 为例 )跳出本级循环。

Page 20: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

FFT 算法解码程序 :A=wavread(‘D2.wav’); % 接收到的 DTMF 信号A=A’; %A转置subplot(212); plot(A);%绘图N=256;

for s=1:8*n % 对每帧信号作 N=256 点 的 FFT R=A(200*(s-1)+1:200*s); y=fft(R,N); c(s,:)=abs(y(1:64)); %幅频谱取 64 点,存入 c r(s,:)=c(s,:); %r=c z=find(c(s,:)<40); %消除频谱泄漏现象(阀 值 =40 ),结果再存入 c c(s,z)=zeros(size(z));

end

Page 21: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

sm=[31 44;23 40;23 44;23 48;26 40;26 44;26 48;28 40;28 44;28 48]; %0-9 对应的频率点表矩阵

for i3=1:8*n b=nnz(c(i3,:)); %b:c 中≠ 0 数据的个数; if b==2 % 若 b=2, 则 c 为信号幅频谱,其 ≠0 的下标 q1即为频率点。 q1=f

ind(c(i3,:)); for i4=1:10 % 查表矩阵 sm ,将 q1还原 成相应的数字键,存入 AN if q1==sm(i4,:) AN(i3)=i4-1;break; end end else AN(i3)=NaN; % 若 b≠2 ,则 c 为间隔时间,则 AN=NaN(空信号标志 ) endendAN %显示解码结果 AN

Page 22: 双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency)

思考: (自己编程序)( 1 )在上面的程序中,怎样使各 DTMF 信号的幅

频谱( r 和 c )自动显示?(每个信号仅画一帧)

( 2 )如使程序也可产生另 6 个数字键 A,B,C,D,*,# 对应的 DTMF 信号并用 FFT 法解码?

(例:按“ A” ,产生 697Hz 和 1633Hz 正弦信号的迭加,解码结果为: A A A A _ _ _ _)