1 / 22

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

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

becca
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 本题目的是,理解DTMF音频产生的软件方法和DTMF解码的几种算法。本题目的是,理解DTMF音频产生的软件方法和DTMF解码的几种算法。 一、DTMF信号的产生 (1)要求:按一个数字键如“1”,则产生频率为697Hz和1209Hz的两个正弦波,并相加。 (为简单起见,仅能按0~9键) (2)可用查表法求数字键对应的频率,为此先建立拨号数字表矩阵。 (3)电话音频信号在数字信号处理时,取样频率为8KHz,每个数字信号持续时间为100ms, 后面加上100ms的间隔(用0表示)。

  3. 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数组的长度)

  4. 2)产生相应的DTMF信号及间隔时间,每个信号持续时间为100ms,间隔时间也是100ms。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点。

  5. *第i(例:i=1)个信号(和间隔)在out数组中的位置?*第i(例:i=1)个信号(和间隔)在out数组中的位置? out(1600*(i-1)+1:1600*i-800)=x;%信号 out(1600*i-799:1600*i)=0; %间隔 注:i=1~n 3)画图并监听产生的DTMF信号。 语句:sound(out,fs)%监听产生的DTMF信号 另外:语句: wavwrite(out,fs,'Ds.wav'); %将信号存为声音文件Ds.wav (可在媒体播放器中播放)程序如下:

  6. Clear TAB=[941 1336;697 1209;697 1336;697 1477; ... 770 1209;770 1336;770 1477;852 1209; ... 852 1336;852 1477];%表矩阵TAB k=input(‘0~9’); %数字键数组k n=length(k); %k的长度=n for 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

  7. out=out./2; subplot(211);plot(out); % 画out sound(out,fs) %监听DTMF信号 wavwrite(out,fs,‘Ds.wav’);%存入声音文件 注:将各自的学号作为数字键输入。 思考:1)如何产生另6个数字键A,B,C,D,*,#对应的DTMF 信号?(例:按“A”,产生697Hz和1633Hz正弦信号的迭加) 或(简化为以下问题:) 2)若以数字键10~15表示A,B,C,D,*,#,如何产生对应的DTMF信号?(例:按“10”,产生697Hz和1633Hz正弦信号的迭加)

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

  9. 本文中,每个DTMF信号h(n)是两个频率的正弦序列相迭加,设为hL(n)和hH(n),为此,分别求得hL(n)和hH(n)所满足的差分方程:本文中,每个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](全部系数)

  10. 则第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; 其余过程同第一种算法。

  11. 进一步思考:怎样用压缩空间的迭代法解差分方程得到DTMF信号。(这种方法最接近于实际硬件开发应用)进一步思考:怎样用压缩空间的迭代法解差分方程得到DTMF信号。(这种方法最接近于实际硬件开发应用) 提示: 用hL(1),hL(2),hL(3)这三个存贮空间存放hL(n-2),hL(n-1),hL(n); 用hH(1),hH(2),hH(3)这三个存贮空间存放hH(n-2),hH(n-1),hH(n); 进行迭代。 每次迭代的结果马上放入out数组中。

  12. 二、DTMF信号的解码 1.FFT算法 (1)信号接收; (2)用FFT对信号进行频谱分析; (3)还原为数字键; (2)中: 几个问题: 1)取样频率为何取8KHz? 答:语音信号的最高频率fc =4KHz,因为取样频率fs≥2fc才能保证取样后的信号不失真, 所以fs=2×4k=8kHz(工业标准)

  13. 2)为何取200点为一帧做FFT? 答:为在频谱图中分辨出不同的频率分量,于是对信号取200点为一帧,则频谱分辨率F=fs/N=8000/200=40Hz<73Hz(表1中任意两频率的最小间隔)。 每个信号(+间隔)占1600/200=8帧 3)为了对每帧(200点)信号作FFT, 问:对每帧信号作多少点FFT? 即N=?

  14. 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点。

  15. 5)频谱横坐标为频率点k k=fk/F=(fk/fs)*N; f----实际频率。 DTMF信号是两个正弦波的迭加,它的幅频谱就是两根谱线,谱线的横坐标就是该信号的两个频率点KL和KH 。 例:按键 “1”对应DTMF信号的频率 fL=697Hz,fH=1209Hz。(fs=8kHz,N=256) 问:(1)KL=? KH=? (2)运行该程序,幅频谱图中产生什么 现象?

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

  17. (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)

  18. 数组c中不等于0的下标就是各信号的频率点,KL,KH,查表sm,即可将各DTMF信号还原为相应的数字键。数组c中不等于0的下标就是各信号的频率点,KL,KH,查表sm,即可将各DTMF信号还原为相应的数字键。 *用到的函数: i)find(c)----找出c中≠0的数据的下标。 ii)nnz(c)----找出c中≠0的数据的个数。 2)查找过程。 从sm的第一行开始查,查到, 则数字键AN=这时sm的下标 - 1; (以数字键“1”为例)跳出本级循环。

  19. 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

  20. 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=find(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(空信号标志) end end AN %显示解码结果AN

  21. 思考: (自己编程序) (1)在上面的程序中,怎样使各DTMF信号的幅频谱(r和c)自动显示?(每个信号仅画一帧) (2)如使程序也可产生另6个数字键A,B,C,D,*,#对应的DTMF信号并用FFT法解码? (例:按“A”,产生697Hz和1633Hz正弦信号的迭加,解码结果为:A A A A _ _ _ _)

More Related