跳至主要內容

DTMF 应用

Jia-Yin大约 2 分钟

DTMF 应用练习

一般的电话键,在按下的时候会产生一个声音,基本上每个声音由两种主要的音频合成,称为双音多频 (Dual-Tone Multi-Frequency, DTMF) 讯号。

双音多频的拨号键盘是 4×4 的矩阵,每一行代表一个高频,每一列代表一个低频,如下图所示。当我们按下一个键时,就传送一个高频和低频的正弦讯号组合,比如按下 '1' 的时候,会产生 697 和 1209 Hz 的两种音频。

这个小单元,要使用上面所学到的快速傅立叶变换来观察按键的频率,从而解出按键的内容。

  1. 小明按电话键的时候,小英暗中进行侧录,采样率为 8000 Hz,振幅已调整为 -1~1 的实数,录制档案格式为 wav,存放在 此连结中open in new window,请试著播出来听看看,并下载到自己的电脑。

  2. 小英学过一些基本的 FFT 概念,决定要自己进行解码,她使用 octave 处理,试著写了以下一段程式码如下:

[y, fs] = audioread('dtmf-sample.wav'); % 读入音档
plot(y);

执行之后,可以看到以下的图形输出。

请你使用 help audioread 查看 audioread 指令的用法,并且依小英的程式码做看看。

  1. 根据上面的图形,小英估测这个电话号码应该有 7 个数字。仔细观察之后,发觉第一个数字的讯号,其样本数应该不到 1000 个。如果取 1024 点来做 FFT 的话,音框的总时间是 1024/8000 秒,所以频率的解析度 ΔF=8000/1024<8\Delta F = 8000/1024 < 8,查看上面 DTMF 的规范,显然要分辨各个频率是没有问题的。于是小英决定从第 200 个点开始,连续取 1024 个点来观察其频谱。于是小英又写了一个程式如下:
sample_rate = 8000;  % 采样速度
nstart = 200;        % 音框开始的位置
N = 1024;            % 音框总共的点数
[y, fs] = audioread('dtmf-sample.wav');   % 读入音档
df = 8000/1024;              % ΔF = 1/T < 8
ys = y(nstart:nstart+N-1);   % 取音框
ysf  = fft(ys);              % 计算音框的 FFT
fnum = (-N/2:(N/2)-1)*df;    % 计算对应的频率点
plot(fnum, abs(fftshift(ysf)));  % 画出频谱图

这个程式的执行结果如下:

  1. 紧接著小英用图形的缩放功能,仔细检查了信号的两个峰值,最后发现应该是 697 和 1336 Hz。由此小英确定这个电话号码的第一个数字应该是 2。请你试著依上面的程式操作,并练习用图形缩效功能,查看小英的判断是否正确。

练习 5

接下来,请你试著帮小英完成后面的工作,把电话号码都给解出来,请提供决定频率的程式码和关键图形。