说明

很多出题人可能会把手机或者其他设备打电话的拨号音作为一个题目技能中的考察点。

什么是DTMF?

双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如'1'相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。

事实上,我们手机拨打电话的拨号键盘如果没有经过厂商OEM或者刻意调整,一般都是DTMF的拨号音。

例如小米手机,出厂就是DTMF的声音(当然可以设置)

在拨号的时候,你会听到一段有规律且每个按键不会重复的声音,这就是传说中的“拨号音”了。有些大神可以通过人耳进行识别,识别你按下的按键。(不过因为这些音频振幅相似,所以需要刻苦训练)

如何识别他?

如果要辨识DTMF拨号音,我们可以通过工具“DTMF2NUM”进行分辨。

某剧中,有个大神就是通过人耳识别(所以说刻苦训练很重要诶)

工具地址:https://bbs.qsnctf.com/thread-267-1-1.html

分享一个好玩的

当然,寓教于乐。我们下面分享一个好玩的东西:

在某一个列车上,一个老太太把水弄到了旁边年轻人的衣服上。老太太不依不饶的说不是她。随即拿起了电话,拨通了一个号码。但是老太太忽略了乘务人员的记录仪,把老太太拨打电话的场景录了下来。

录完之后,老太太仍然不依不饶的要求赔偿,可结果是老太太的儿子的电话被拔了出来。

不是教大家干坏事的哦!只是想告诉大家如果拨号场景被录制,请一定要求录制方注意信息安全,防止信息泄露。

练习

因为DTMF2num的这个知识点,我出了一道题目放到了青少年CTF平台上。

题目地址:https://www.qsnctf.com/challenges#敢问路在何方-310

当然,我们只需要一个小工具就可以识别wav中的dtmf。

dtmf2num.exe xxx.wav

这就是识别结果了。

使用Python识别

import scipy.io.wavefile as wav
import scipy.fftpack as fft # 读取音频文件
fs, data = wav.read('dtmf.wav')
# 计算帧长
frame_length = int(fs * 0.01) # 10ms
# 分帧
frames = []
for i in range(0, len(data), frame_length):
frame = data[i:i+frame_length]
frames.append(frame)
# 识别拨号音
for frame in frames:
# 计算 FFT
fft_result = fft.fft(frame)
# 计算频率分量
frequencies = fft.fftfreq(len(fft_result)) * fs
# 计算振幅分量
amplitudes = abs(fft_result)
# 找到最大振幅对应的频率
max_amplitude_index = amplitudes.argmax()
max_frequency = frequencies[max_amplitude_index]
# 根据频率判断是哪个拨号音
if max_frequency in (697, 770):
print('拨号音:1')
elif max_frequency in (697, 770, 852, 941):
print('拨号音:2')
elif max_frequency in (770, 852):
print('拨号音:3')
elif max_frequency in (770, 852, 941, 1209):
print('拨号音:4')
elif max_frequency in (770, 941):
print('拨号音:5')
elif max_frequency in (852, 941, 1209, 1336):
print('拨号音:6')
elif max_frequency in (941, 1209):
print('拨号音:7')
elif max_frequency in (697, 770,852,941,1209,1336):
print('拨号音:8')
elif max_frequency in (770, 852, 941, 1209, 1336):
print('拨号音:9')
elif max_frequency in (941):
print('拨号音:*')
elif max_frequency in (941, 1336):
print('拨号音:0')
elif max_frequency in (941, 1209, 1336):
print('拨号音:#')

DTMF2num拨号音识别的更多相关文章

  1. 算法系列:FFT 001

    转载自http://blog.csdn.net/orbit/article/details/17210461 2012年9月的时候,一个南京的大学生从电视台播放的一段记者采访360总裁周鸿祎的视频中破 ...

  2. GetLastError()函数返回值及含义

    GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值, ...

  3. [转]架构蓝图--软件架构 "4+1" 视图模型

    架构蓝图--软件架构 "4+1" 视图模型 本文基于多个并发视图的使用情况来说明描述软件密集型系统架构的模型.使用多重视图允许独立地处理各"风险承担人":最终用 ...

  4. AT指令(转)

    资料来自网络 附录AT指令简编一. 一般命令1.AT+CGMI 给出模块厂商的标识.2.AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900) ...

  5. GetLastError返回值的含义

    [0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句柄无效. [7]-存储控制块被损坏 ...

  6. UML基础与Rose建模实训教程

    目  录 第1章  初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章  Rational Rose工具... 6 2.1 安装与配置Rational Ro ...

  7. C++实现VPN工具之VPN错误代码大全

    该篇文章转自:<VPN问题全攻略>http://home.51.com/h012359/diary/item/10008457.html 以下是使用VPN版软件中常见的一些错误代码: 1. ...

  8. Windows Error Code(windows错误代码详解)

    0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足,无法处理此 ...

  9. 配置HylaFAX传真服务器

    配置HylaFAX传真服务器转自 http://blog.chinaunix.net/uid-8551991-id-248081.html参考:http://www.hylafax.org/howto ...

  10. Windows系统错误代码大全

    1 Microsoft Windows 系统错误代码简单分析: 0000 操作已成功完成.0001 错误的函数. 0002 系统找不到指定的文件. 0003 系统找不到指定的路径. 0004 系统无法 ...

随机推荐

  1. P7113 [NOIP2020] 排水系统 (拓扑排序)

    (不想打高精,也不想学习其他大佬的神仙写法,打了90分的错解). 本题容易想到用拓扑排序处理,涉及分数的加法,用long long会超时,不过通分时先除后乘卡一下也可以拿90分. 结构体真是个复杂的东 ...

  2. Python模拟服务端

    本机服务端 import socket # 获取到socket sk = socket.socket() # 获取到地址 ip 和 端口号 address = ('127.0.0.1', 8001) ...

  3. python-D3-语法入门1

    Python语法注释 什么是注释 注释其实就是对一段代码的解释说明(注释是代码之母) 如何编写注释 方式1:解释说明文字前加警号 (pycharm中有快捷键ctrl+?) # 注释(单行注释) 方式2 ...

  4. 测试杂谈——一条SQL引发的思考(二)

    在前段时间,曾写过一篇关于SQL问题的文章,测试杂谈--一条SQL引发的思考(一). 今天这篇,算是个问题记录吧,问题并不复杂,但对于测试同学而言,确实是个需要关注的点. 问题分析 最近在日常工作中, ...

  5. Annocation(注解)的使用示例

    示例一:生成文档相关的注解示例二:在编译时进行格式检查(JDK内置的三个基本注解)@Override: 限定重写父类方法, 该注解只能用于方法@Deprecated: 用于表示所修饰的元素(类, 方法 ...

  6. instanceof的使用和向下转型

    x instanceof A:检验x是否为类A的对象,返回值为boolean型 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instance ...

  7. tensorboard图表显示不全的问题

    之前跑bcq生成tensorboard文件的时候,有二十个点用来描图,然而后10个数据点总是不显示,之后将tensorboard换成tensorboardX便解决了问题. 比如 from torch. ...

  8. JQuery中的DataTables表格插件

    一.DataTables表格插件的简介 DataTables是一个jQuery的表格插件.它具有以下特点: 自动分页处理 即时表格数据过滤 数据排序以及数据类型自动检测 自动处理列宽度 可通过CSS定 ...

  9. Windows7下驱动开发与调试体系构建——0.概述

    本文集内容为windows7x64下驱动开发与调试体系构建,内容目录如下: 1.驱动开发的环境准备 2.R3与R0的通信示例 3.自建调试体系概述 4.在x64下使用汇编代码 5.实战反调试标记位(N ...

  10. linux-web基础

    web基础 [TOC] 网上冲浪 网上冲浪:在Internet互联网上获取各种信息,进行工作.娱乐,在英文中上网是" surfing the internet",因"su ...