利用音频频率破解输入数字

(如果你有异于常人的听力,可以分辨出每个按键硬的区别,请绕道,本文不适合你)

实验工具:

同时最主要的是测出拨号音的频率这里用到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)
   

 

posted @ 2017-04-26 21:12  金牛小子  阅读(1163)  评论(0编辑  收藏  举报