N点DFT计算出来的是能量在N/2+1个连续频带的分布,[频率分辨率] = [采样频率] / [DFT点数],8个DTMF单频的最小间隔为770-697=7 3Hz,按这个可计算所需的DFT点数。由于DTMF信号的能量只分布8个频带附近,而DFT计算了N/2+1个频带,因此DFT有很多计算是白干了,所以费时费资源。
而每次Goertzel计算出来的其实只是DFT的N/2+1个频带中的一个频带处的能量,8个DTMF需要计算8次Goertzel,还是比DFT省力,也比FFT省力,还无需受DFT和FFT的固定的每个频带中心频率的掣肘。因此通常都采用Goertzel法。
FFT本身就是滤波器,只要设计好频率分辨率,减小频谱泄漏的影响,应该是可以直接在噪音环境下分辨DTMF的。
下图为用FFT识别DTMF的例子,示波器的采样频率=48kHz, 频 谱 分 析仪FFT点数=4096,因此频率分辨率为48000/4096=11.718Hz。为了减小频谱泄漏的影响,窗函数选为Kaiser 6,例子中用信号发生器的DTMF面板按下了“8”键,然后示波器采集此信号来分析。可见经过FFT分析识**,频率1 = 1.336kHz, 频率2 = 852 Hz, 非常精准,最后DTMF的识别结果为“8”。
下图则在上面的例子中加入了幅度与DTMF信号幅度相当的白噪声,其他参数完全相同。由频谱图可见两个谱峰仍然傲立与其它噪音电平之上。当然判别DTMF的时候,只需要判断697Hz~1633Hz之间的信号,其他地方就算噪音很高,也不影响最后判别。
用Goertzel法同样需要增加点数来提高频率分辨率,以提高抗噪能力。
|