检测DTMF信号中的时间间隔

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检测DTMF信号中的时间间隔相关的知识,希望对你有一定的参考价值。

简 介: 通过上面分析可以看到,在改造的电话控制器发送信号的过程中会存在一定概率(大约1%左右)使得单个电话号码被分割成两个。在一定条件下,就会造成电话在拨出的时候多拨出一个号码,进而使得最终无法拨通电话。

关键词 DTMF旧电话拨号错误

1.1 1.2 1.3 拨码间断 目 录
Contents
问题背景 统计拨码间断 处理更长电话录音 问题分析 怎么造成的? 如何改进?

 

§01 码间断


1.1 问题背景

  这个问题仍然来自于对改造旧式电话出现的偶然拨码错误寻找错误原因。在 检测DTMF信号质量 对于利用计算机声卡录制的发送信号进行分析。对于发送的拨码信号通过FFT变换获得发送电话号码,对应的信号都是对。只是会看到在发送信号中存在一些抖动。这是一个连续的拨码中出现间隔。下面是截取57个拨码信号中可以看到出现的抖动,也就是号码出现间断。

▲ 图1.1.2 号码波形出现中断情况

1.1.1 间断时间

  下面是反映了一次发送11个电话号码过程中,在第一个号码中存在一个截断。

▲ 图1.1.2 带有间断的波形信号

  在图形上对于间隔测量,它对应的时间间隔为: t b = 24 104 × 2000 × 1 44100 = 10.5 m s t_b = 24 \\over 104 \\times 2000 \\times 1 \\over 44100 = 10.5ms tb=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 tqdm

wavefilename = '/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] - 4000
    endid = errorid[i] + 4000

    plt.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 Audiosegment

wavefilename = '/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 = 10

for i in range(num):
    startid = errorid[i] - 4000
    endid = errorid[i] + 4000

    plt.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信号中的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章

检测DTMF信号质量

数字信号基于matlab GUI DTMF信号生成与检测(带按键音)含Matlab源码 1086期

时间间隔计数器的检定计量方案

使用Goertzel算法识别DTMF信号

等效采样

ADC采样两路信号时,如何正确显示两路波形?