徐灵飞,章 红,林浩冬
(1.成都理工大学 工程技术学院,四川 乐山614007;2.电子科技大学 电子工程学院, 成都610054)
目前,很多场合使用专用芯片, 例如MT8870、MT8880 等,进行双音多频(DTMF)信号的检测。但是,这种实现方案的外围电路及用户接口电路复杂,容易引入噪声,并且功耗大、成本高[1]。再者,专用芯片都是依靠计算输入信号的过零率来实现检测,但当信号混有音频和噪音时,专用芯片检测结果容易出现错误。还有,如果系统功能需要改变,往往需要重新设计电路,增加了系统升级、维护成本。这些因素都决定了传统方法实现DTMF 信号生成与检测方案的局限性,因此,利用定点DSP 芯片高速灵活的数值运算能力,取代专用硬件芯片进行DTMF 信号检测,可提高系统集成度,降低成本,便于系统灵活更新调整,是一项具有很高工程实践价值的工作。
本文对比研究了几种DTMF 信号解调的方法,根据DTMF 信号的特点,在原始Goertzel(戈策尔)算法的基础上,给出改进的Goertzel 算法实现原理,并制定了详细的信号有效性判定流程,形成了完整高效的DTMF 信号检测在定点DSP 上实现的方案。对原始 Goertzel 算法和改进 Goertzel 算法在TMS320VC5416 上实现的检测效果进行了对比研究,并在不同噪声背景下进行了大量实验,给出了改进DTMF 信号检测方案对DTMF 信号检测率的结果。实验结果表明,在DTMF 信号频率偏移小于1.5%时,改进算法具备更好的检出效果,而在DTMF 信号频率偏移大于3.5%时,改进算法能更好地将信号滤除,较好地满足ITU-T Q.24 在信号频率容错率上的要求。同时,制定的信号有效性判定流程可以将DTMF 信号和普通音频信号区分开,并且在一定的背景噪音下,方案仍能实现较高的信号检出率。
使用697 Hz、770 Hz、852 Hz、941 Hz 4 个低频群信号和1 209 Hz、1 336 Hz、1 477 Hz和1 633 Hz 4 个高频群频率,两两组合形成16 种不同的高低频信号叠加的DTMF 信号,可以对应16 个不同的按键。DTMF 信号的检测过程分三步进行:第一,对输入的信号的幅度进行抑制;第二,对信号进行DTMF 解码;第三,对DTMF 解码的结果进行有效性判定。当以上三步都处理结束后,就可以得到:当前输入信号是否是有效的DTMF 信号;如果输入信号是有效的DTMF 信号,就可以通过简单的扫描判别程序得到组成DTMF 信号的两个频率及对应的按键值。
由于DTMF 信号检测程序全部使用定点数进行计算,一旦在计算中出现溢出,将影响到对信号频率的准确提取和判定。因此,为了在后面进行解码运算时避免出现结果溢出的情况,需要对输入的信号的幅度进行抑制。幅度抑制原理如下:
式中,x(n)为输入信号,y(n)为幅度抑制后的输出信号, Tg 为幅度抑制常数, Ag 为输入信号平均峰值幅度,根据公式(1)计算得到:
经测试, Tg可以设置为0120H,这时根据以上的幅度抑制原理编写的程序,完全可以防止后续程序计算的溢出。
基于DTMF 信号的基本特性,DTMF 信号的解码过程主要通过数学变换方法将组成DTMF 信号的两个频点寻找出来,这样的方法有MUSIC (Multiple Signal Classification)算法[2]、FFT 算法、SB -NDFT(Subband Nonuniform Discrete Fourier Transform algorithm)算法[3]和Goertze 算法。
MUSIC 算法对DTMF 信号检测的效果较好,但其运算量太大[2],不适合在定点DSP 处理器上进行实时处理。
SB-NDFT 算法利用FFT 快速算法的原理,通过对输入样点的抽取[3],并结合Goertzel 算法,使得运算量比Goertzel 算法降低将近50%,可以提高系统的实时性。SB -NDFT 算法的数学描述如公式(2)和公式(3):
其中, G(ej2ωk)2可以通过Goertzel 算法计算得到。
SB-NDFT 算法牺牲了一部分高频分量的能量,同时又要求所检测信号的频率不能超出2 kHz,这就使得SB-NDFT 算法不能分离输入信号中的DTMF 信号与其二次谐波(频率超出了2 kHz 的范围)。事实上,通过SB-NDFT 算法在定点DSP 处理器TMS320VC5416 上的实验,发现这一算法的检测效果非常不好,几乎不能将DTMF 信号的频率分离出来。分析造成这一结果的原因主要是:在定点DSP 上编写汇编程序,用定点数进行数学运算,这一过程中存在大量的四舍五入,严重影响了算法的精确性。如果把程序改为浮点数进行操作的话,将影响到程序的实时性和功能冗余性,使其很难在实际应用。因此,SB-NDFT 算法在定点DSP 上实现的可行性不高。
DTMF 信号只用关心其8 个行频/列频及其二次谐波信息即可,因此,使用DFT 对DTMF 信号进行解码比使用FFT 进行解码更快。对于N 点DFT, 需要N2个复系数,相应的加法和乘法运算次数分别为16(N-1)和16N 次。但是,使用Goertzel 算法计算一个频点只需一个实系数和一个复系数,相应的加法和乘法运算次数分别为8(2N -1)和8(N +1)次[4-5]。使用Goertzel 算法检测DTMF 信号比使用DFT 检测更有效率。
Goertzel 算法无论在运算量、频率检测的精度以及抗干扰等方面都有很好的表现。Goertzel 算法的数学描述如公式(4)和公式(5):
其中,vk(-1)=0,vk(-2)=0,x(n)=input。
通常Goertzel 算法运算中的k 取的是整数,这就造成了对所检测频率的误差。同时,随着N 的变化,这一误差也是不断变化的。几乎不可能在DTMF 信号所有频点上找到一个N,使得产生的频率误差都符合ITU-T Q.24 对DTMF 信号检测的规定。为了得到一个最优的N 值,可以通过寻找使得所 有 频 点 处 k 的 误 差 平 均 值最小这一过程来实现[6]。通过Matlab 仿真可以得到, 当N 取106、125、163、186、205、227、238、245 等值时,可以得到一个较好的检测结果。在实际的计算过程中,如果调整k 的取值,不按照DFT 定义中取整数的规定来取值,而是直接按照实际的DTMF 信号频率取值,这样可以降低检测过程中的检测误差。这时,用Q15 定点数格式表示,按照DTMF 信号的频率由低到高排列,则分别是27 980、26 956、25 701、24 216、19 073、16 325、13 085、9 315。
根据公式(4)和公式(5),以不同k 的取值编写程序实现原始Goertzel 算法和改进Goertzel 算法。以DTMF 信号“4”为例,通过对频率没有误差的DTMF信号的检测和对有3.5%频率误差的DTMF 信号的抑制,来说明原始Goertzel 算法在频率检测上与改进Goertzel 算法的区别,N 取值106。
(1)当构成DTMF 信号的频率没有误差时,对同一信号两种算法的检测结果如图1 和图2 所示。
图形显示窗口中横轴显示的0 ~7 分别表示DTMF 信号的8 个频率,存储区显示窗口显示中ENERGY 开始显示的8 个数据表示DTMF 信号的8 个频率频谱能量检测结果。
图1 频率没有误差时原始Goertzel 算法检测结果Fig.1 Test result of the original Goertzel algorithm when the frequency of DTMF signals has no error
图2 频率没有误差时改进Goertzel 算法检测结果Fig.2 Test resu lt of the modified Goertzel algorithm when the frequency of DTMF signals has no error
由图1 和图2 可以得到,原始Goertzel 算法在频率770 Hz和1 209 Hz处得到的计算结果分别是2 845和3 007,而改进Goertzel 算法得到的计算结果分别是4 129和4 281。由此可见,改进Goertzel 算法比原始Goertzel 算法能更精确地定位信号的频点。以同样的方法对其他的频率做同样的实验,当频率误差小于1.5%时,可以得到相同的结果。
(2)当构成DTMF 信号的频率有3.5%误差时,对同一信号两种算法的检测结果如如图3 和图4 所示。
图3 频率有3.5%误差时原始Goertzel 算法的检测结果Fig.3 Test result of the original Goertzel algorithm when the frequency of DTMF signals has error of 3.5%
图4 频率有3.5%误差时改进Goertzel 算法的检测结果Fig.4 Test result of the modified Goertzel algorithm when the frequency of DTMF signals has error of 3.5%
由图3 和图4 可以得到,原始Goertzel 算法在频率770 Hz和1 209 Hz处得到的计算结果分别是3 605和1 656,而改进Goertzel 算法得到的计算结果分别是2 617和899。由此可见,改进Goertzel 算法比原始Goertzel 算法能更好地抑制准确频点外的信号。当使用更大误差频率的DTMF 信号来做实验,同样可以得到以上结果。以同样的方法对其他的频率做了大量同样的实验,得到的结果都证明:改进Goertzel算法比原始Goertzel 算法能更好地抑制3.5%误差以外的DTMF 信号。
为了区分DTMF 信号和音频信号,改进Goertzel算法不仅要检测DTMF 信号频率,还要检测其二次谐波的频谱平方幅度。然后,通过一系列的判决步骤, 最终判定输入的信号是否是一个有效性的DTMF 信号。判决步骤如下:
(1)检测低频群和高频群信号能量中最大值是否高于某一能量阈值T-PStp;
(2)检测信号的强度是否足够大,低频组分量和高频组分量的最大能量应高于某一确定阈值T-PStr;
(3)如果DTMF 信号存在,比较低频组与高频组中最大能量之间的差值,其值应低于某一确定阈值T-PTwi;
(4)分别在低频群与高频群里比较最大能量与其他频点能量的差值,所有差值都应分别高于某一个阈值T-PDif;
(5)由于DTMF 信号只有在基频上具有较高的能量,而音频信号总是会在基频上叠加了具有一定强度的二次谐波分量,因此,需要检测信号的二次谐波强度,确定低频群与高频群频点的二次谐波能量都应低于某一确定阈值T-P2Har,以此区分DTMF信号和音频信号。
在程序中用Q15 定点数形式设定T-PStp =0180h,T-PStr=0BB8h, T-PTwi=0400h, T-PDif=1100h,T-P 2Har=0700h。需要注意的是,这几个参数不是一成不变的,必须根据系统的实际情况,经测试确定。
对信号有效性的判定,需要最少有两次连续判定结果一样,同时,在此之后紧接着能检测到一个停顿状态,才能认定当前信号是一个有效的DTMF 信号。在判定一个有效的DTMF 信号后,就可通过键值扫描程序确定检测出来的两个频点的具体频率值,通过组合,从而得到DTMF 信号所对应的按键值。DTMF 信号检测整个程序执行的流程图如图5所示。
图5 DTMF 信号检测程序总流程图Fig.5 Flowchart of the DTMF signal detection
整个程序以汇编语言实现, 在TMS320VC5416电路板上以160 MHz主频进行测试。系统采样频率为8 000 Hz,采样间隔为125 μs。由图5 可知,每采样一个样点都需要进行处理,当程序中所有需要判定的条件都满足时,DSP 执行程序的时间最长,需要2 532个CPU 时钟周期,共16 μs。这证明整个程序在定点DSP 上具有很好实时性,在DSP 处理完DTMF信号的检测后,还可以处理其他工作。
在一信噪比下,连续对同一DTMF 信号持续采样21 200个样点,完成200 次检测。将改进DTMF 信号检测方案在定点DSP 上运行, 对比不同信噪比DTMF 信号的检测率(在单个N =106 的检测窗口中),结果如表1 所示。
表1 信噪比与检出率对照表Table 1 Table of SNR corresponding to the detection rate
DTMF 信号持续时间为55 ms,其中包含440 个样点,当N =106 时,程序可以完成4 次完整的检测。在这期间,当信噪比大于等于15 dB时,经实验测试,改进Goertzel 算法对频偏小于1.5%的DTMF信号的检测成功率为100%(4 次完整检测中,连续两次成功检测率), 同时, 对于频偏大于3.5%的DTMF 信号拒绝成功率为100%。
本文给出了高效的DTMF 信号的检测方法和详细的DSP 实现方案。程序使用汇编语言编写,已在TMS320VC5416 上实现。相比于纯硬件实现方案,整个系统工作可靠、灵活、集成度高, 能准确地检测DTMF 信号。相对于复杂的MUSIC、FFT、SB-NDFT等算法,文中提出的DTMF 信号检测方案更加适合于在定点DSP 和通用处理器上实现。同时,系统实时性高,具有很好的功能冗余度,完全可以应用于主叫识别信息传送、音频菜单和远程控制等需要嵌入DTMF 信号检测方案的场合。对方案中解调算法DSP 程序和相关信号有效性判定参数的进一步优化是下一步研究的内容。
[1] 王伟东, 王薇.双音多频通信接口的设计[J] .电讯技术,2007,47(4):60-62.
WANG Wei-deng,WANG Wei.Design of the Dual-Tone Multifrequency(DTMF)Data[ J] .Telecommunication Engineering,2007,47(4):60-62.(in Chinese)
[2] Arslan G, Evans B,Sakarya F A, et al.Performance evaluation and real-time implementation of subspace, adaptive and DFT algorithms for multi-tone detection[ C]//Proceedings of 1996 IEEE International Conference on Telecommunications.Istanbul, California:IEEE, 1996:884-887.
[3] Bagchi S, Mitra S K.The nonuniform discrete Fourier transform and its applications in filter design.I.1-D[ J] .IEEE Transactions on Circuits Systems II:Analog and Digital Signal Processing,1996, 43(6):422-433.
[4] 石明卫.基于Geortzel 算法实现高效多路DTMF 检测[J] .电讯技术,2001,41(5):74-76.
SHI Ming-wei.Implementation of High Efficient Multiplex DTIMF[ J] .Telecommunication Engineering, 2001, 41 (5):74-76.(in Chinese)
[5] 常青青,邓大伟,艾红.基于DSP 的DTMF 信号编解码算法实现[J] .北京信息科技大学学报,2011,26(4):77-82.
CHANG Qing-qing,DENG Da-wei,AI Hong .The implementation of DTMF encoding /decoding based on DSP[ J] .Journal of Beijing Information Science and Technology University,2011,26(4):77-82.(in Chinese)
[6] Trajkovic M S,Radovic D.Performance Analysis of the DTMF Detector Based on the Goertzel′S Algorith[ C]//Proceedings of the 14th Telecommunications Forum.Belgrade:Telecommunications Society,2006:1-5.