检测DTMF信号中的时间间隔
简 介: 通过上面分析可以看到,在改造的电话控制器发送信号的过程中会存在一定概率(大约1%左右)使得单个电话号码被分割成两个。在一定条件下,就会造成电话在拨出的时候多拨出一个号码,进而使得最终无法拨通电话。
关键词
: DTMF,旧电话,拨号,错误
Contents
§01 拨码间断
1.1 问题背景
这个问题仍然来自于对改造旧式电话出现的偶然拨码错误寻找错误原因。在 检测DTMF信号质量 对于利用计算机声卡录制的发送信号进行分析。对于发送的拨码信号通过FFT变换获得发送电话号码,对应的信号都是对。只是会看到在发送信号中存在一些抖动。这是一个连续的拨码中出现间隔。下面是截取57个拨码信号中可以看到出现的抖动,也就是号码出现间断。
▲ 图1.1.2 号码波形出现中断情况
1.1.1 间断时间
下面是反映了一次发送11个电话号码过程中,在第一个号码中存在一个截断。
▲ 图1.1.2 带有间断的波形信号
在图形上对于间隔测量,它对应的时间间隔为:tb=24104×2000×144100=10.5mst_b = {{24} \over {104}} \times 2000 \times {1 \over {44100}} = 10.5mstb=10424×2000×441001=10.5ms
▲ 图1.1.3 间断时间测量
根据 Dual Tone Multi Frequency (DTMF) 给定参数,对于Genave Superfast 支持 20ms声音时间,5ms的间隔。因此,上面的号码的间断就有可能会造成同一个号码被发送了两次,从而产生电话拨码错误。
下图就是在 Dual Tone Multi Freq 给出的两种拨码标准。
▲ 图1.1.4 Genave拨码标准
左:20ms声音,20ms间隔; 右:20ms声音,5ms间隔
1.1.2 问题所在
根据上面现象和猜猜,需要进行:
- 统计在录制的电话音频信号中,存在这样的间断的概率、间断时间分布;
- 分析产生这间断原因以及解决方案。
1.2 统计拨码间断
测量拨码间断,利用检测DTMF信号质量中相似的分析方法,来获得拨码中的间断时间间隔。
1.2.1 统计波形上升沿阈值
下面是WAV2.WAV信号波形。
▲ WAV2.WAV信号波形
设置一个阈值(比如:20000),统计所有大于该阈值数据之间的间隔。
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
from scipy import signal
from scipy.io import wavfile
from tqdm import tqdmwavefilename = '/home/aistudio/data/data126234/wav2.wav'sample_rate,sig = wavfile.read(wavefilename)dataseg = list(where(sig[:,0] > 20000))
posid = dataseg[0]
posdelta = array([s1-s2 for s1,s2 in zip(posid[1:], posid[:-1])])
下面是绘制的间隔的大小波形。其中非常大的间隔来自于两次拨码之间的间隔。将这大的拨码间隔去掉。
▲ 图1.2.1 波形间隔统计
下面是将所有大于4000间隔都去掉之后,所剩下的时间间隔。可以看到绝大部分都位于400(9ms)之内。但还有五个间隔超过了400。
dataseg = list(where(sig[:,0] > 20000))
posid = dataseg[0]
posdelta = array([s1-s2 for s1,s2 in zip(posid[1:], posid[:-1])])
posdelta[where(posdelta>4000)]=0
▲ 图1.2.3 时间间隔对应的小于4000采样点的分布
下面代码统计了间隔在400 ~ 4000之间数据个数,总共5个。
pos1 = where((posdelta < 4000) & (posdelta > 400))
errorid = array(posid[1:])[pos1]
print("shape(errorid): {}\n".format(shape(errorid)))
shape(errorid): (5,)
1.2.2 间断信号
下面是将出现间断的波形绘制出,可以看到它们的存在的确是将原来的一个号码分割成两个了。
plt.clf()
plt.figure(figsize=(10,10))
num = len(errorid)for i in range(num):startid = errorid[i] - 4000endid = errorid[i] + 4000plt.subplot(num,1,i+1)plt.plot(sig[startid:endid,1])plt.xlabel('n')plt.ylabel('value')plt.grid(True)plt.savefig('/home/aistudio/stdout.jpg')
plt.show()
▲ 图1.2.4 出现的五次波形间断情况
在WAV2文件中,总共有大约570个电话号码,出现五次电话号码被中断,这种错误概率大约是1%左右。
1.3 处理更长电话录音
为了得到这种电话号码中断出现的分布,下面对录制了大约3个小时,总共出现错误断裂的号码个数为 44个。
下面给出了前面10个出现中断的拨码信号。可以看到在这些情况下,这些电话号码就会变成两个号码。
▲ 图1.3.1 对于出错信号波形
from headm import * # =from scipy import signal
from scipy.io import wavfile
from tqdm import tqdm
from pydub import AudioSegmentwavefilename = '/home/aistudio/data/data126234/DTFM-RECORD-2022-1-21.mp3'sound = AudioSegment.from_file(file=wavefilename)
left = sound.split_to_mono()[0]
sample_rate = sound.frame_rate
sig = frombuffer(left._data, int16)printt(shape(sig), sample_rate:)dataseg = list(where(sig > 15000))
posid = dataseg[0]
posdelta = array([s1-s2 for s1,s2 in zip(posid[1:], posid[:-1])])pos1 = where((posdelta < 4000) & (posdelta > 400))
errorid = array(posid[1:])[pos1]printt(errorid:,len(errorid):)plt.clf()
plt.figure(figsize=(10,20))
num = len(errorid)
num = 10for i in range(num):startid = errorid[i] - 4000endid = errorid[i] + 4000plt.subplot(num,1,i+1)plt.plot(sig[startid:endid])plt.xlabel('n')plt.ylabel('value')plt.grid(True)plt.savefig('/home/aistudio/stdout.jpg')
plt.show()
※ 问题分析 ※
通过上面分析可以看到,在改造的电话控制器发送信号的过程中会存在一定概率(大约1%左右)使得单个电话号码被分割成两个。在一定条件下,就会造成电话在拨出的时候多拨出一个号码,进而使得最终无法拨通电话。
下面是在 电话双音频拨号声音中的干扰信号 分析的实际出错电话拨号波形,现在看来,波形中间存在着较大的中断,经过电话线的传递(卷积上电话线的单位冲激响应)之后,发生了形变。
▲ 图2.1 实际上录制拨码出错对应的信号波形
由此可以得出结果:拨码出错的来源应该是控制板内部的软件问题,造成发送拨码中间出现随机的中断,而不是接口电路以及线路的问题。
2.1 怎么造成的?
为什么会出现这种情况?这种情况可能:
- 来自于核心板控制器再发送拨出信号是,被中断。使得信号输出不连续;
- 或者是在核心板发送给接口板USB数据中,存在着误码,造成输出信号不连续;
具体分析,需要软件开发者去分析一下接口板在数据接受与缓冲方面的特性。
2.2 如何改进?
由于电话接口板载普通的微机测试中表现良好,所以猜测这是由Andriod核心板在执行过程中,多任务下使得发送电话拨打数据被中断,引起输出信号有间隔。
建议,在往电话接口板通过USB发送拨号信息的时候,将任务设置为最高级别,同时将其它的操作系统中断进行屏蔽。使得拨号过程不被其他任务中断。
■ 相关文献链接:
- 改造旧式电话
- 拨码错误
- 检测DTMF信号质量
- 计算机声卡录制
- [ Dual Tone Multi Frequency (DTMF) ](https://www.sigidwiki.com/wiki/Dual_Tone_Multi_Frequency_(DTMF)
● 相关图表链接:
- 图1.1.2 号码波形出现中断情况
- 图1.1.2 带有间断的波形信号
- 图1.1.3 间断时间测量
- 图1.1.4 Genave拨码标准
左:20ms声音,20ms间隔; 右:20ms声音,5ms间隔 - WAV2.WAV信号波形
- 图1.2.1 波形间隔统计
- 图1.2.3 时间间隔对应的小于4000采样点的分布
- 图1.2.4 出现的五次波形间断情况
- 图1.3.1 对于出错信号波形
检测DTMF信号中的时间间隔相关推荐
- 测试ESP32S基本模块的功能,并验证是否可以应用在AI智能车竞赛检测激光信号中
▌01 ESP32测试模块 在 ESP32-S模块转接板设计与实现 给出了基于 利用CH340C制作MicroPython ESP8266,ESP32的下载器-改进型 对于ESP32进行开发的方式. ...
- 基于matlab的DTMF信号的产生和检测(1)
DTMF是什么?Double Tone Multiple Frequency就是这个,双音多频信号,不仅在我们现在的音频电话中使用,还在数据通信中处理各种数据流等信息. 一个DTMF信号由两个单音频正 ...
- 使用C语言编写DTMF检测程序,DSP课程设计---DTMF信号的产生及检测.doc
DSP课程设计---DTMF信号的产生及检测 DSP课程设计 实 验 报 告 DTMF信号的产生及检测 院(系): 电子信息工程学院通信工程专业 设计人员:宋佳阳 学号目录 一.设计任务书- 3 - ...
- 【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )
文章目录 一.正弦信号 的 自相关函数 分析 一.正弦信号 的 自相关函数 分析 正弦信号 s(n)=Asinωns(n) = A \sin \omega ns(n)=Asinωn , 其 幅度 A ...
- 基于MATLAB的DTMF信号的仿真分析
FPGA教程目录 MATLAB教程目录 ----------------------------------------------------------------------- 双音多频信号由于 ...
- 信号处理中简单实用的方法——寻找信号中的峰值和谷值
在信号处理中,经常会需要在时间域或频率域寻找峰值和谷值.MATLAB工具箱中已有峰值检测的函数(findpeaks函数),本次将结合函数说明对峰值和谷值的检测. 如果只找一个峰值可以用max函数,而需 ...
- matlab 双音频信号的检测,双音频(DTMF)信号的产生与检测.doc
双音频(DTMF)信号的产生与检测 XXXXXXX大学 毕 业 论 文 (设 计) 题目:双音频(DTMF)信号的产生与检测 学生姓名 学 号 专 业电子信息工程 班 级2008级1班 指导教师 学 ...
- matlab提取语音信号基频检测,语音信号处理中基频提取算法综述
[实例简介] 语音信号处理中基频提取算法综述,论述了各种基频检测的算法,对比分析各方法与思想,不错的总结 增刊 张杰等:语音信号处理中基频提取算法综述 101 信号是由频率具有谐波关系的信号组成的,因 ...
- android自动发送dtmf,Android通话中发送DTMF信号
由于android中sdk没有提供相关功能,所以在Android中如果要自定义拨号盘发送DTMF信号,需要通过反射调用相关方法,并且需要系统签名还有运行在phone进程中,同时需要phone进程的ui ...
最新文章
- Python设计模式-职责链模式
- 使用C#调用外部Ping命令获取网络连接情况
- 『笔记』windows与CentOS间文件传输(win下实行)
- 剑指offer 算法 (画图让抽象问题形象化)
- 2020-2021年度第二届全国大学生算法设计与编程挑战赛(春季赛)【部分题题解】
- #1413 : Rikka with String 后缀自动机 + 二级差分
- 8.Boost之unordered_set
- mysql卸载权限不够_Linu下启动MySQL结果显示:env: /etc/init.d/mysql:权限不够怎么解决?...
- hadop 查看DataNode的资源使用情况信息(web接口)
- easyui页内跳转
- 基于SSM的社区消毒防疫物资系统
- 51单片机交通信号灯c语言程序,89C51单片机交通灯程序
- 判断文件是否为图片格式
- 微信小程序——卡片列表显示listview(带阴影)
- TCP/IP协议分析实验
- tomcat 简介
- python两个自定义函数_Python自定义函数实现求两个数最大公约数、最小公倍数示例...
- 在线编辑视频、去重消重去水印视频深度处理什么视频批量采集下载软件好?在什么网站下载好?...
- 陕师大民教育计算机试题,陕师大计算机研究生考试真题2010年试题.doc
- 计算机桌面字大怎么变小,电脑桌面图标文字大怎么变小
热门文章
- 函数计算新功能-----支持C#函数
- 第一记: JS变量类型判断(VUE源码解读)
- SP3946 MKTHNUM - K-th Number(整体二分)
- python3+selenium入门08-鼠标事件
- msyql request quit
- 美博士环保聚焦“限漆令”出台之后的涂料行业
- 一个很适合用来套用后台的框架
- android中常用的快捷键
- 初始化页面的时候,如何使TextMode=Password的asp:textbox有默认值显示?
- UVa 1057 - Routing