220 likes | 701 Views
双音多频( DTMF )通信设计的 MATLAB 仿真 DTMF(Double Tone Multi-Freqency) 是按键电话通信,也广泛用于电子邮件和银行系统中,用户可从电话发送 DTMF 信号来选择菜单进行操作。 DTMF 通信系统中共有 8 个频率,分为 4 个高频音和 4 个低频音,用 1 个高频音和 1 个低频音的组合表示一个信号,这样共有 16 种组合,分别代表 16 种信号,如下表:. 本题目的是,理解 DTMF 音频产生的软件方法和 DTMF 解码的几种算法。 一、 DTMF 信号的产生
E N D
双音多频(DTMF)通信设计的MATLAB仿真 DTMF(Double Tone Multi-Freqency) 是按键电话通信,也广泛用于电子邮件和银行系统中,用户可从电话发送DTMF信号来选择菜单进行操作。DTMF通信系统中共有8个频率,分为4个高频音和4个低频音,用1个高频音和1个低频音的组合表示一个信号,这样共有16种组合,分别代表16种信号,如下表:
本题目的是,理解DTMF音频产生的软件方法和DTMF解码的几种算法。本题目的是,理解DTMF音频产生的软件方法和DTMF解码的几种算法。 一、DTMF信号的产生 (1)要求:按一个数字键如“1”,则产生频率为697Hz和1209Hz的两个正弦波,并相加。 (为简单起见,仅能按0~9键) (2)可用查表法求数字键对应的频率,为此先建立拨号数字表矩阵。 (3)电话音频信号在数字信号处理时,取样频率为8KHz,每个数字信号持续时间为100ms, 后面加上100ms的间隔(用0表示)。
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数组的长度)
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点。
*第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 (可在媒体播放器中播放)程序如下:
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
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正弦信号的迭加)
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)。
本文中,每个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](全部系数)
则第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; 其余过程同第一种算法。
进一步思考:怎样用压缩空间的迭代法解差分方程得到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数组中。
二、DTMF信号的解码 1.FFT算法 (1)信号接收; (2)用FFT对信号进行频谱分析; (3)还原为数字键; (2)中: 几个问题: 1)取样频率为何取8KHz? 答:语音信号的最高频率fc =4KHz,因为取样频率fs≥2fc才能保证取样后的信号不失真, 所以fs=2×4k=8kHz(工业标准)
2)为何取200点为一帧做FFT? 答:为在频谱图中分辨出不同的频率分量,于是对信号取200点为一帧,则频谱分辨率F=fs/N=8000/200=40Hz<73Hz(表1中任意两频率的最小间隔)。 每个信号(+间隔)占1600/200=8帧 3)为了对每帧(200点)信号作FFT, 问:对每帧信号作多少点FFT? 即N=?
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点。
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)运行该程序,幅频谱图中产生什么 现象?
6)用阀值法消除频谱泄漏现象。(存入c) 答:由于信号x是有限长的,这就相当于对无限长的信号加矩形窗,所以在频谱图中必然会出现频谱泄漏现象,使信号能量散布到其他谱线位置。为此,在程序中应选择一适当阀值,将出现在这两条谱线周围的幅度较小的谱线消除(置0),最后,将处理后的幅频谱数据存入数组c中。
(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)
数组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”为例)跳出本级循环。
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
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
思考: (自己编程序) (1)在上面的程序中,怎样使各DTMF信号的幅频谱(r和c)自动显示?(每个信号仅画一帧) (2)如使程序也可产生另6个数字键A,B,C,D,*,#对应的DTMF信号并用FFT法解码? (例:按“A”,产生697Hz和1633Hz正弦信号的迭加,解码结果为:A A A A _ _ _ _)