DTMF2num拨号音识别
说明
很多出题人可能会把手机或者其他设备打电话的拨号音作为一个题目技能中的考察点。
什么是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拨号音识别的更多相关文章
- 算法系列:FFT 001
转载自http://blog.csdn.net/orbit/article/details/17210461 2012年9月的时候,一个南京的大学生从电视台播放的一段记者采访360总裁周鸿祎的视频中破 ...
- GetLastError()函数返回值及含义
GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值, ...
- [转]架构蓝图--软件架构 "4+1" 视图模型
架构蓝图--软件架构 "4+1" 视图模型 本文基于多个并发视图的使用情况来说明描述软件密集型系统架构的模型.使用多重视图允许独立地处理各"风险承担人":最终用 ...
- AT指令(转)
资料来自网络 附录AT指令简编一. 一般命令1.AT+CGMI 给出模块厂商的标识.2.AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900) ...
- GetLastError返回值的含义
[0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句柄无效. [7]-存储控制块被损坏 ...
- UML基础与Rose建模实训教程
目 录 第1章 初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章 Rational Rose工具... 6 2.1 安装与配置Rational Ro ...
- C++实现VPN工具之VPN错误代码大全
该篇文章转自:<VPN问题全攻略>http://home.51.com/h012359/diary/item/10008457.html 以下是使用VPN版软件中常见的一些错误代码: 1. ...
- Windows Error Code(windows错误代码详解)
0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足,无法处理此 ...
- 配置HylaFAX传真服务器
配置HylaFAX传真服务器转自 http://blog.chinaunix.net/uid-8551991-id-248081.html参考:http://www.hylafax.org/howto ...
- Windows系统错误代码大全
1 Microsoft Windows 系统错误代码简单分析: 0000 操作已成功完成.0001 错误的函数. 0002 系统找不到指定的文件. 0003 系统找不到指定的路径. 0004 系统无法 ...
随机推荐
- 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...
- BGCN Rec:模型结构概述
简单论述 BGCN将user-item interaction,user-bundle interaction和bundle-item affiliation 关联到统一的异构图中.以项目节点为桥梁, ...
- 没有使用IaC的DevOps系统都是耍流氓
作为现代软件工程的基础实践,基础设施即代码(Infrastructure as Code, IaC)是云原生.容器.微服务以及DevOps背后的底层逻辑.应该说,以上所有这些技术或者实践都是以基础设施 ...
- VMware vSphere 8.0 正式版下载
请访问原文链接:https://sysin.org/blog/vmware-vsphere-8/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org vSphere 8.0 ...
- SpringBoot(二) - 核心配置文件
1.application.properties 和 application.yml 配置文件格式区别 1.1 文件格式 application.properties # 端口号 server.por ...
- python学习笔记----必备知识
一.必备知识 二.流程控制 https://blog.csdn.net/weixin_43304253/article/details/120778228 1.1语法特点: 1.1.1 代码注释 单行 ...
- Python爬虫requests请求库
requests:pip install request 安装 实例: import requestsurl = 'http://www.baidu.com'response = requests. ...
- 学习Java AES加解密字符串和文件方法,然后写个简单工具类
Reference Core Java Volume Ⅱ 10th Edition 1 对称加密 "Java密码扩展"包含了一个Cipher,它是所有密码算法的超类.通过getIn ...
- Gitea 1.18 功能前瞻(其三):增强文本预览效果、继续扩展软件包注册中心、增强工单实用功能、完善了用户邀请机制和SEO
今天是 10 月 26 日星期三,Gitea 周期性地发布了 1.18 的第一个 RC0 版本,在此阶段会收集一些功能和使用上的问题,随后还会发布 RC1,新功能的完整性和健壮性会逐步趋近正式版. 继 ...
- ES 客户端 RestHighLevelClient Connection reset by peer 亲测有效 2022-11-05
导读 最新公司ES集群老出现连接关闭,进而导致查询|写入ES时报错,报错日志显示如下 [2m2022-10-23 14:13:10.088[0;39m - [31mERROR[0;39m - [35m ...