zoukankan      html  css  js  c++  java
  • 利用音频频率破解输入数字

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

    实验工具:

    同时最主要的是测出拨号音的频率这里用到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)
       
  • 相关阅读:
    ADO.NET批量插入数据方法比较
    Thread was being aborted 分析与解决
    第三方刻录软件介绍
    ASP.NET登陆SQL Server数据库
    word 2010页眉页码从第三页开始设置
    误删除、误格式化后的灾难恢复方案
    Asp.Net4.0新特性概述
    ArcGIS Server的切图原理深入
    ArcGIS的缓存技术
    ArcGIS Server操作Mxd文件详细讲解
  • 原文地址:https://www.cnblogs.com/jjj-fly/p/6771019.html
Copyright © 2011-2022 走看看