算法的乐趣 · 第四十八节
《算法的乐趣》第四十八节
本节讲解音频频谱计算与显示,以及利用频谱分析破解DTMF拨号音的原理。
本节讲解音频频谱计算与显示,以及利用频谱分析破解DTMF拨号音的原理。
频谱计算需对信号加窗处理,本章选用汉宁窗,它会加宽分析带宽但降低频率分辨率,为抵消窗口对信号的衰减,采用每次滑动半个窗口的重叠处理方式。离散傅里叶变换得到的是复数,通过实部和虚部可计算信号强度,算法是:从原始数据取N个采样点做FFT计算功率,再偏移N/2点重复计算并累加,直到处理完毕。
在音频播放的实时频谱显示中,N点FFT产生N/2个有效频率点,但通常只显示32个波段,需要从大量频率数据中选取代表性数据。文中介绍了三种方法:等间隔抽样、分段取平均值,以及实例采用的分32段后每段取中间点及相邻点加权平均。由于人耳听到声音与眼睛看到频谱存在时间差,需调整频谱显示时机,实践表明音频缓冲区设为0.05~0.2秒效果较好,示例程序使用0.1秒。频谱窗口设计包含背景、当前强度级别和缓缓下落的Top_Bar三部分,通过定时器周期性降低强度级别和Top_Bar位置实现平滑显示,为提高绘图效率采用位图缓冲区方式。
随后介绍利用频谱分析破解电话号码的原理。DTMF双音多频电话的每个按键对应一个低频和一个高频正弦信号的组合,因此拨号音的频谱必然在对应频率处出现两个能量峰值。破解步骤为:首先用FFT计算出N/2个有效频谱数据,然后用top_2算法找出两个最大值点,最后根据频率与位置的对应关系反算出实际频率值,通过查表即可确定对应的按键,从而还原电话号码。