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)
       
  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/jjj-fly/p/6771019.html
Copyright © 2011-2022 走看看