DTMF双音多频系统信号输入和检测识别算法matlab仿真

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       双音多频(Dual Tone Multi Frequency, DTMF)信号是音频电话中的拨号信号,由美国AT&T贝尔公司实验室研制,并用于电话网络中。这种信号制式具有很高的拨号速度,且容易自动检测识别,很快就代替了原有的用脉冲计数方式的拨号制式。这种双音多频信号制式不仅用在电话网络中,还可以用于传输十进制数据的其他通信系统中,用于电子邮件和银行系统中。这些系统中用户可以用电话发送DTMF信号选择语音菜单进行操作。DTMF信号系统是一个典型的小型信号处理系统,它要用数字方法产生模拟信号并进行传输,其中还用到了D/A变换器;在接收端用A/D变换器将其转换成数字信号,并进行数字信号处理。

1 双音多频(DTMF)信号

     过去的电话拨号时靠脉冲计数确定0~9这10个数字的,拨号速度慢,也不能扩展电话上网其他服务功能。现在均采用双音拨号。每一位号码由两个不同的单音频组成,所有的频率可分成高频带和低频带两组。每一位号码由一个高频信号和一个低频信号叠加形成,DTMF信号有16个编码。一般情况下,声音信号很难造成对DTMF接收器的错误触发。

电话中的双音多频信号有两个作用:用拨号信号去控制交换机接通被叫的用户电话机;控制电话机的各种动作,如播放留言、语音信箱等。

2 双音多频(DTMF)信号的产生

     DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,DTMF双音频信号由两个二阶数字正弦振荡器产生,一个用来产生行音频信号,另一个产生列音频信号。在电话键盘上的每次按键,会产生式(2.2-1)表示的两个音调之和。规定用8KHz对DTMF信号进行采样,采样后得到时域离散信号为

两个频率f1,f2唯一确定了被按压的键。具体数字对应的两个频率如表2.2.1所示。

     形成上面序列的方法有两种,即计算法和查表法。用计算法求正弦波的序列值容易,但实际中要占用一些计算时间,影响运行速度。查表法是预先将正弦波的各序列值计算出来,寄存在存储器中,运行时只要按顺序和一定的速度取出便可。这种方法要占用一定的存储空间,但是速度快。

      因为采样频率是8000Hz,因此要求每125ms输出一个样本,得到的序列再送到D/A变换器和平滑滤波器,输出便是连续时间的DTMF信号。DTMF信号通过电话线路送到交换机。

       在接收端,要对收到的将收到的双音多频信号进行检测,即检测两个正弦波的频率,以判断其对应的十进制数字或者符号。用数字方法进行检测,需要将接收到的模拟音频信号进行A/D变换,恢复为数字信号,然后检测其中的音频频谱来确定所发送的数字。检测方法有两种,一种是用一组滤波器来提取所需频率,判断对应的数字或符号;另一种是用快速傅立叶变换(FFT)算法的DFT对双音多频信号进行频谱分析,有信号的幅度谱,判断信号的两个频率,最后确定对应的数字或符号。以下章节对两种方法进行分析并对Goertzel算法进行详细的推导。 

    由上面可以知道一个DTMF信号是由两个不通频率f1f2的正弦波组成,它可以用下式表示

       我们可以考虑通过离散傅立叶变换进行信号的频谱分析来检测离散的双音多频码。这是因为只有时域及频域都是离散的情况下,才能适合于在计算机上运算;也就是周期的离散时间信号与离散频率间的变换对。

       用DFT检测模拟DTMF信号所含有的两个音频频率,即为用DFT对模拟信号进行频谱分析的问题,要确定三个参数:采样频率Fs,DTF的变换点数N,需要对时间的观察长度Tp。

1 频谱分析的分辨率

        观察表2-1要检测的8个频率,相邻间隔最小的是第一个和第二个频率,间隔是73Hz,要求DFT至少能够分辨相隔73Hz的两个信号,即要求Fmin=73Hz。DFT的分辨率和对信号的观察时间Tp有关,Tpmin=1/F=1/73=13.7ms。考虑到可靠性,应留有富余量,要求按键的时间在40ms以上。

2 频谱分析的频率范围

      要检测信号的频率范为697~1633Hz,但考虑存在语音干扰,除了检测这8个频率外,还要检测它们的二次倍频的幅度大小。波形正常且干扰小的正弦波的二次倍频是很小的。如果发现二次谐波很大,则认为不是DTMF信号。这样频谱分析的范围为697~3266Hz。按照采样定理,信号的最高频率不能超过折叠频率,即0.5Fs≥3266Hz,由此要求最小采样频率应为6.53KHz。总系统已经规定Fs=8KHz,因此一定满足对频谱分析的要求。按照Tpmin=13.7ms,Fs=8KHz,算出对信号最少的采样点数为Nmin=Tpmin*Fs≈110。

二、核心程序

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];	%8个基频对应的8个k值
f1=[697,770,852,941];                   % 行频率向量
f2=[1209,1336,1477,1633];               % 列频率向量
TN=input('键入8位电话号码= ');          % 输入8位数字
TNr=0;                                  %接收端电话号码初值为零
for l=1:8;	               %分别对每位号码数字处理:产生信号,发声,检测
    d=fix(TN/10^(8-l));	                  %计算出第l位号码数字
    TN=TN-d*10^(8-l);
    for p=1:4;
        for q=1:4;
            if tm(p,q)==abs(d); break,end     % 检测与l位号码相符的列号q
        end
if tm(p,q)==abs(d); break,end     % 检测与l位号码相符的行号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)                            %相邻信号响声之间加0.1秒停顿
    % 接收检测端的程序
    X=goertzel(x(1:N),K+1);            % 用Goertzel算法计算8点DFT样本
    val = abs(X);                           % 列出八点DFT的摸
    subplot(4,2,l);	
    stem(K,val,'.');grid;xlabel('k');ylabel('|X(k)|') % 画出8点DFT(k)的幅度
    axis([10 50 0 120])
    limit = 80;                           %基频检测门限为80
    for s=5:8;
        if val(s) > limit, break, end       % 查找列号
    end
    for r=1:4;
        if val(r) > limit, break, end       % 查找行号
end
18
    TNr=TNr+tm(r,s-4)*10^(8-l);	   %将8位号码表示成一个8位数,以便显示
end
disp('接收端检测到的号码为:')         % 显示接收到的8位电话号码
disp(TNr)

三、仿真结论

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130838785