说明

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

什么是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('拨号音:#')

最新文章

  1. Lab_2_SysOps_VPC_Linux_v2.5
  2. C# 科学计数法转换成数字
  3. iOS 导航栏实现总结
  4. Hash MD5 CRC 知识
  5. V​S​2​0​1​2​快​捷​键
  6. dede列表页分页地址优化(不同url相同内容问题解决)<转自http://www.966266.com>
  7. jQuery in action 3rd - Operating on a jQuery collection
  8. SQL Server跨库复制表数据错误的解决办法
  9. iOS XMPP(2)自己创建客户端
  10. LiLei&HanMeiMei的隐式马尔可夫爱情
  11. PHP学习笔记14-操作session
  12. 捆绑(Bundle)
  13. [转]Adventures in Xen exploitation
  14. Day1-python理论基础
  15. ZOJ-1655 Transport Goods---dijkstra变形&&最长路
  16. 解决 Mac launchpad 启动台 Gitter 图标无法删除的问题
  17. Django model对象接口
  18. CF1131D Gourmet choice
  19. VUE 安装&创建一个项目
  20. Docker+Jenkins+Maven+SVN搭建持续集成环境

热门文章

  1. ExcelHelper ->NPOI插件
  2. 2022最新最详细必成功的在Vscode中设置背景图、同时解决不受支持的问题
  3. CF Round #829 题解 (Div. 2)
  4. 驱动开发:内核监控Register注册表回调
  5. Dropout原理分析
  6. 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++52——计算数列和2/1,3/2,5/3,8/5......
  7. 使用 html2canvas 将页面中某一部分转为图片下载
  8. Go语言核心36讲07
  9. Bigkey问题的解决思路与方式探索
  10. Vue使用Element表单校验错误Cannot read property ‘validate’ of undefined