信号与系统——DTMF电话号码提取

摘要

本文主要介绍了DTMF 信号的检测方法,并对DTMF信号的原理、端点检测的常用方法和Goertzel算法进行了简要的介绍。在噪音的环境下,通过MATLAB计算信号的能量参数、短时能量和短时过零率,随后对信号在频域上进行分析,找出了按键音对应的数字号码。

关键词

端点检测 Goertzel 算法 DTMF 语音信号处理

问题重述

在音频信号中混杂了一段电话拨号音(DTMF编码),要求通过信号分离及频谱分析,了解信号的频谱成分,从频谱信息中提取电话号码。

DTMF(Dual Tone Multi Frequency):即双音多频信号,广泛的使用在全世界范围内的按键式电话机上。现今应用于通过电话发送信号来选择菜单操作的各种系统中。一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两个预分配的频率组:行频组和列频组。每一对这样的音频信号唯一表示一个数字或符号。[1]每个按键信号的持续时间大于40ms,任意两个相邻按键信号的间隔大于10 ms。下图是双音多频信号频率组合:

要识别出连续的DTMF信号,首先要进行的就是端点检测,即从输入音频信息中将信号音和背景噪声区分开来。然后信号解码就是要对每一段单独的信号声音做FFT变换,在频域中找到信号编码时的两个组合频率,将找到的行频和列频与CCITT的国际标准频率进行比照,从而找出具体按的按键号码。

音频的读入

使用audioread函数读入音频,返回值得各个采样点的幅度信息和信号的采样率,绘制图像如下所示(已完成归一化处理):

从图像和对比音频,我们可以得知,DTMF信号大致出现在2w至3.5w的区间,并且此区域的能量偏大,并且较为稳定。

端点检测

所谓端点检测就是从一段连续的按键音中找出每一个单独声音的起点和终点。在音频识别系统中,端点检测起着十分重要的作用。好的端点检测不仅能减少计算量和处理时间,而且能够提高信号识别的正确率。

端点检测的主要指标有短时能量,短时平均幅度,短时过零率,倒谱特征和子带能量等。其中倒谱特征主要应用于高级别的语言语音识别等系统。本程序仅用短时能量和短时过零率便可以有效的进行断点检测。

在实际应用中,背景噪声较低时用短时能量识别较为方便,而背景噪声较大时用短时过零率识别则更为有效。

这是因为背景噪声较小时,时域波形分布平坦,短时过零率门限和部分噪声门限区分度小,容易将噪声识别为信号。

当背景噪声较大时,短时能量对高电平的异常敏感性使得无法设置门限将噪声的高电平从有效信号中区别出来。

信号能量参数分析

其中,语音信号短时能量变化最大,所以能量均方差也最大,话带数据次之,而单音和DTMF信号的能量均方差则很小。[2]

要处理的音频的采样率是8192Hz,即每秒含有8192个样点。由于是用信号能量幅度变化的稳定度来进行识别,在这里选择以每25个抽样点进行均方差计算。计算公式如下所示,其中N为帧长。

F = ∑ 1 N ( x i − x ‾ ) F = \sum_{1}^{N}{(x_{i} - \overline{x})} F=1N(xix)

于是我们编写代码,并得到输出结果如下所示,

我们可以对产生这种结果的原因进行分析,由于是用方差来表示信号,虽然DTMF信号的能量变化比较稳定,但是由于混入了音频信号,方差仍然呈现了很大的变化,所以我们并不能采用分析方差的方法来确定端点。

短时过零率分析

过零率(Zero Crossing Rate):表示一帧语音中信号波形穿表示一帧语音中信号波形穿过横轴(零电平)的次数。对于连续信号,过零率意味着时域波形通过时间轴;而对于离散信号,如果相邻的采样值改变符号则称为过零。用下面的公式表示:(N为帧长度)

Z C R = ∑ n = 1 N − 1 x ( n ) ∗ x ( n + 1 ) ≤ 0 ZCR = \sum_{n = 1}^{N - 1}{x(n)*x(n + 1) \leq 0} ZCR=n=1N1x(n)x(n+1)0

得到每帧的过零率并绘制如下:

可见,依据过零率并不能得到任何有用的信息,这就像我们在先前提到的一样,背景噪声较小时,时域波形分布平坦,短时过零率门限和部分噪声门限区分度小,容易将噪声识别为信号。

短时能量分析

短时能量(Short Term Energy):音频信号时域分析的重要参数,每帧信号的短时能量,即对信号的帧内样本求和,是区分信号和噪声的一项技术指标。用下面的公式表示:(N为帧长度)

E 0 = ∑ n = 1 N x 2 ( n ) E_{0} = \sum_{n = 1}^{N}{x^{2}(n)} E0=n=1Nx2(n)

根据规定,DTMF信号在100ms 时间片内双音持续不少于45ms 且不多于55ms的时间,一般认为是50ms为一帧,为了更加精确的分析,我们每次取25ms进行分析,经过验证得到了较好的结果。

根据如上的公式,我们给出MATLAB程序,如下所示:

最后得到输出结果并绘制如下,可以看出在标注的点中,信号的能量与先前的能量不同,并且明显较为稳定,所以我们根据DTMF信号的性质可以判断,这些点就应当是信号的起点。

频谱分析

得到了每一个DTMF信号的起点终点后,我们将对这部分的信号进行频谱的分析,此处我们应用的是Goertzel算法提取频谱信息。

Goertzel算法由GeraldGoertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评价。

该算法非常适合DTMF信号的分析。因为被检测的信号只需关注于八个离散的频率,运算过程中也完全消除了复数的运算,这样使运算大大的被简化了,运算速度也很自然的得到了大幅度提高。[1]

MATLAB中已经内置了Goertzel函数,其调用格式为:

dft_data = goertzel(data, freq_indices)

dft_data是返回给定频率的幅值结果,data是待分析信号,freq_indices给出了将在哪些频率点计算傅里叶变换。对于DTMF信号的分析,我们只需要设置先前给出的DTMF信号定义中的八个频率即可。

为了一次性的计算九个点,我们使用了eval函数,虽然不便阅读,但是减少了代码的工作量。如下所示:

将得到的结果绘制在同一张表上,如下所示:

分析的结果非常的直观清晰,说明我们先前的端点检测和采用的Goertzel算法都较为合适。

实验结果

最终得到每个DTMF信号在8个频率点的幅值信息,分别取前四个和后四个频率点中最为显著的的频率点作为行频和列频,对比DTMF表,得出信号。同样的为了一次性的计算所有的信号,此处使用了eval函数,不便阅读,但是减少了代码的工作量。

函数的输出结果如下所示:

总结

在本次实验中,我们阐述了通用的信号分析的方法,即端点检测和频谱分析,我们将常见的端点检测的方法应用带有噪声的DTMF信号中,并最终确定了短时能量的方法进行端点的确定。

在频谱分析中,我们并没有采用常见的FFT和DFT变换,而是采用了Goertzel算法,提高了分析的简便性和算法的运行速度。

参考文献

  1. 张昊. 基于matlab的连续DTMF信号检测的程序实现[J]. 福建电脑,2009,25(4):160-161. DOI:10.3969/j.issn.1673-2782.2009.04.105.

  2. 徐丹,沈珂. 使用能量和过零率方法进行VAD、VBD、DTMF和单音高效识别[J]. 广东通信技术,2008,28(7):40-44. DOI:10.3969/j.issn.1006-6403.2008.07.009.

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值