利用音频频率破解输入数字
(如果你有异于常人的听力,可以分辨出每个按键硬的区别,请绕道,本文不适合你)
实验工具:
同时最主要的是测出拨号音的频率这里用到praat软件对声音进行频率分析、
在分析中这里用到了python语言对得到的频率数据进行处理
概念:
拨号音又叫DTMF音。是同时发出2个频率进行叠加的音,双音多频DTMF(Dual Tone Multi Frequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端等。通过软件产生与检测DTMF信令,是一项较有价值的工程应用。
DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。电话机键盘上每一个键通过如图所示的行频与列频唯一确定。DTMF的编解码方案无需过多的计算量,以目前计算机的运算速度,可以很轻松地实现。
由图可知,一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。为了产生DTMF信号,可以通过软件产生两个正弦波叠加在一起后发送,解码时软件可以采用改进的Goertzel算法,从频域搜索两个正弦波的存在,从而解调出DTMF信号。
先用安卓手机测试一个数字
结果图如下
这里我们放大查看,并且在共振峰中勾选显示共振峰
得到如图下方两条整齐排列的红点所描绘的线,右边的数字对应共振频率
可以看到第二条共振峰的值约为1351Hz
第一条在其下方
这里我们自己所得到的数据与下方的标准对照表不一定对应
1209 | 1336 | 1477 | 1633 | |
697 | 1 | 2 | 3 | A |
770 | 4 | 5 | 6 | B |
852 | 7 | 8 | 9 | C |
941 | * | 0 | # | D |
这里将得到的两个频率数值看成一个点坐标为(869,1329)
在表中找到最近的一个点,对应的是(852,1336) 数字为8
这里输入的也是8
对于数据分析,我用python语言进行半自动化的选择比较,选出最为可能的字符
大家可以自行分析,主要是为了方便
这里将脚本贴出来,写的有些累赘,大家可以自行设计
def adz(a): #定义第一共振峰的比较方法 if a<=697: a=697 elif a>697 and a<=770: if a-697<770-a: a=697 else: a=770 elif a>770 and a<=852: if a-770<852-a: a=770 else: a=852 elif a>852 and a<=941: if a-852<941-a: a=852 else: a=941 elif a>941: a=941 return a def bdz(b): #定义第二共振峰的比较方法 if b<=1209: b=1209 elif b>1209 and b<=1336: if b-1209<1336-b: b=1209 else: b=1336 elif b>1336 and b<=1477: if b-1336<1477-b: b=1336 else: b=1447 elif b>1447 and b<=1633: if b-1477<1633-b: b=1477 else: b=1633 elif b>1633: b=1633 return b def jm(a,b): #通过两个共振峰选择对应的数字 if a==vala[0]: if b==valb[0]: print('1') elif b==valb[1]: print('2') elif b==valb[2]: print('3') elif b==valb[3]: print('A') elif a==vala[1]: if b==valb[0]: print('4') elif b==valb[1]: print('5') elif b==valb[2]: print('6') elif b==valb[3]: print('B') elif a==vala[2]: if b==valb[0]: print('7') elif b==valb[1]: print('8') elif b==valb[2]: print('9') elif b==valb[3]: print('C') elif a==vala[3]: if b==valb[0]: print('*') elif b==valb[1]: print('0') elif b==valb[2]: print('#') elif b==valb[3]: print('D') while 1: #利用while循环一直调用 a = int(input('第一共振峰:')) b = int(input('第二共振峰:')) a=adz(a) b=bdz(b) vala=[697,770,852,941] valb=[1209,1336,1477,1633] jm(a,b)