李永田,秦世文,李玉成,王明建,董诗洋
(空军工程大学航空机务士官学校,河南信阳,464000)
如今,智能手机已经完全融入了我们的日常生活。我们频繁地敲击手机键盘,输入电话号码,输入各种密码或验证码,编辑微信或短信,操作手机银行、网上购物等,每次敲击手机键盘时,经常会听见“嘟嘀嗒”的按键声,这些声音都存在泄密的可能。在现实生活中许多地方存在泄密的可能。例如,电视以及有声媒体采访公众人物时,注意不要把拨号声音也放出来。我们平常使用手机拨打电话(如手机银行)时,千万注意身旁是否有人录音,否则电话号码或密码很容易被还原出来,造成严重的隐患。为了防范密码泄露,在输入密码的时候电话银行系统一般会更改声调,使得拨号音听上去怪怪的,这样做的目的就是防止有人识别你的拨号音。
我们平常所用的电话,是通过双音多频(Dual Tone Multi-Frequency,DTMF)信号向交换机传递命令的,我们每按下电话键盘上的一个按键,就会同时发出两个不同频率的声音,转化为电流在对面解析。通过某些软件手段便可以还原号码按键音,进而解析出号码。
一个完整的电话机键盘如图1 所示,有10 个数字键和2个字符键。根据国际电报电话咨询委员会(国际电信联盟前身)建议,每个数字或字符都要用到两个单频信号的组合进行传输。因此,键盘上每个按键所对应的信号都可以表示为:
图1 电话机键盘的频率阵列
其中fL和fH分别表示按键所在行和列对应的频率值,4个行上标注的频率值697Hz、770、852、941 组成了低频组,4 个列上标注的频率值1209、1336、1477 和1633Hz 组成了高频组。键盘号码和频率的对应关系如图1 所示。
这些频率的取值是经过特别设计的:①这些频率都处于人的可听范围内,因此按键下去时人可以听到;②这8 个频率中没有一个频率是其他任意一个频率的倍数;③任意两个频率的组合、相加或相减都不等于其他任意一个频率。因此这些特性不仅简化了双音多频信号的解码,同时也降低了双音多频误检的概率。
根据国际电报电话咨询委员会的规定,要求每100ms传输一个键盘数字或符号,代表数字的音频信号持续时间必须为45~55ms。为了区分两个连续地按键号码,在100ms内其他时间应该为静音(无信号),电话信号的抽样频率应该为8kHz。
只要熟悉信号处理时频变换关系,就很容易看出不同时间段对应的频率值,再根据DTMF 信号原理就可以马上反推出按键值,也就是通过离散傅里叶变换(Discrete Fourier Transformation,DFT),先将DTMF 信号转换成频域,然后在频域上判断各个频点的能量。通过Matlab仿真可得,图2 给出的就是按键1 的时域波形和频域波形,可以很直观地看出按键1 其实就是由两个单频信号构成的(697Hz 和1209Hz)。
图2 按键1 的时域波形和频域波形
图3 给出了按键0~9 的时域波形和频域波形,可以很直观地看出每个按键其实就是由两个单频信号构成的。DTMF 信号在高低频处的频谱幅度非常大,其他频率处几乎为0。将DTMF 信号转换为离散时间序列,然后执行DFT,检测幅度频谱最大的两个频率。本论文实现的DTMF 信号的编码和译码是理想情况下的编译码,实际中DTMF 信号在传输过程中会混叠有大量的噪声,不能通过简单的计算固定频率处的幅度来确定信号的频率成分。
图3 按键0~9 的时域波形和频域波形
图4 中给出的就是按键0~9 拨号音的时频图,仿真程序为了更好地模拟真实情况,在源代码中还引入了拨号间隔时间(blk)和传输噪声(noise)这两个仿真参数。从图中结果可以看出,按键1,2,3 具有相同的低频信号(697Hz),而它们的高频信号是逐个上升的,其他按键频率的变换关系与此类似。
图4 按键0~9 的时频图
直接计算DFT 的计算量较大,而DTMF信号检测只需要计算少数几个频点的频谱。所以工程商通常采用滤波器法或者Goertzel算法来完成DTMF 信号的检测。
滤波器法识别按键的原理如图5 所示,该方法最关键的步骤就是设计8 个带通滤波器,每个带通滤波器的中心频率对应着低/高频组的各个频率点。将待识别的拨音号码(DTMF 信号波形)依次通过这8 个带通滤波器,理论上只有频率成分与滤波器中心频率一致的信号才能通过,在滤波器输出端检测能量最大者即可判断出低/高频序号,最后通过键盘上频率阵列的对应关系即可反推出按键值。
图5 滤波器法识别按键值
将输入值(DialNum)任意更改为电话机键盘上不同的按键值,逐个检验估计值(keynum)。我们发现利用滤波器法识别单个按键值并不能达到100%的准确率,识别效果对输入信号的时长、快速傅里叶变换(Fast Fourier Transform,FFT)点数、滤波器阶数等参数都比较敏感,利用滤波器法识别按键值的瓶颈在于各个带通滤波器的幅频特性并不理想。
图6 中给出的是中心频率分别为697Hz 和852Hz 的带通滤波器的幅频特性,源代码中采用基于频率采样的方法设计数字滤波器。从图6 中可以看出,4 个带通滤波器的通带部分都重合在一起,770Hz、852Hz 和941Hz 的单频信号能大部分通过697Hz 的带通滤波器,换句话说,697Hz 的带通滤波器对770Hz、852Hz 和941Hz 的单频信号滤除效果并不理想。
图6 带通滤波器幅频特性对比
理论上,DTMF 信号只会在两个固定的频率点上出现能量,如何准确、高效地估计这两个频率值是识别拨号音的关键所在。传统的频谱估计方法,得到的是一个频率区间内所有频率点的估计结果,而对于DTMF 信号,我们只关心那8个固定频率点上的功率谱估计值。
Goertzel 算法是估计DTMF 信号功率谱最经典、最实用的方法,该算法只估计DTMF 信号特定频率点上的功率谱。这种算法充分利用序列的周期特性减少了DFT 的计算量。
其计算公式为:
式中,WN=e-j2π/N;N 为采样点数,k是求DFT的频点序号向量。应用中Goertzel 算法的计算量的大小是由N值确定的。计算的N 值越大,即采样序列越长,在fs已经确定的情况下(本文为8000),其信号的频率分辨率能力就越强,同时带来的时延也越长。因此对于采样点数N 的选择取决于系统所需要的频率分辨率。如果N 的值过小,信号检测时,相邻的音频会落入同一检测窗口,无法分辨,引起误判。若N 值过大,既增加了无用的计算量,又造成时延的加大。故当N 点采样结束时,即可完成对信号指定频率的幅值判断,大大提高了系统的实时性。Goertzel 算法一次只计算一个频点的傅里叶分量,本文中N 的值取为205。
图7 中可以看出,左边较低的信号为697Hz 信号的频率分量,另一根为1209Hz信号。使用Goertzel 算法相同的计算结果,对于指定的音频697Hz,算法能够计算出其频率幅度。另外可以发现,音频信号与背景噪声的功率差别比较大,这也是用阈值法判断音频是否存在的依据。
图7 利用Goertzel 算法估计DTMF 信号的功率谱(按键1)
从图8 中可以看出,Goertzel 算法只估计出事先给定的7 个频率点上的功率谱(只需要7 个频率值即可表示纯数字的按键)。此时只需要检测出最大的两个能量值对应的频率点,即可从键盘上频率阵列的对应关系反推出按键值。通过这种方法可以对用户某些重要操作按键进行录音,然后对录音数据在时域上进行检测,再将有效区域通过Goertzel 算法转换到频域进行数字分类,通过比照DTMF 编码表得到用户所有按键数据。
图8 利用Goertzel 算法估计DTMF 信号的功率谱(按键1~9)
利用Goertzel 算法识别手机号码,识别效果远好于滤波器法,而且对于传输噪声等具有一定的抗干扰能力。需要注意的是,该程序直接把手机拨号音切分为11 个DTMF 信号后进行功率谱估计,省去了声音信号端点检测的过程,在实际应用中这些流程是必不可少的。
另外当信号长度延长时,将使DFT 的计算量也变大,但是由于DTMF 信号检测不关心频谱的相位信息,只关心频谱的幅度信息,所以通过Goertzel 算法只需要经过N 次的迭代就可以快速计算出频谱的幅度。
Goertzel 算法实质是对DFT 的快速运算,但可以有选择地计算个别频率点处的DFT 值,从而避免造成内存和计算资源的浪费。
在本论文“基于Matlab 平台系统仿真的Goertzel 算法的听拨号音识别研究”案例中,介绍了如何利用两个单频信号的组合来仿真电话拨号音,而本论文则是根据DTMF 信号波形,通过估计频率值推断按键值。
双音多频拨号系统是一种典型的信号处理系统,可实现双音多频信号的生成、检测以及识别。Goertzel 算法只计算单一频率对应的频谱分量,在检测信号时简化了相位的计算,因而计算量得到精简。对覆盖全部频谱而言,Goertzel有着更高的复杂度,但对单一频率而言,它的效率更高,适合各种小型处理器和嵌入式设备。对于音频检测,Goertzel算法可以使用递归的方式在存储数据的同时开始计算,节省了大量的存储单元,很好地消除了采集数据所需要的时延,提高了通信的实时性。无论在硬件成本上,还是计算效率上,Goertzel 算法不但优于传统的独立识别方法,也明显优于使用DFT 的软件解码方案。
综上所述,Matlab 平台能够很好地生成和检测DTMF信号。Goertzel 算法是计算序列DFT 和检测DTMF 并且计算输入数字的一个可行的方法。