DTMF 应用
2024年3月7日大约 2 分钟
DTMF 应用练习
一般的电话键,在按下的时候会产生一个声音,基本上每个声音由两种主要的音频合成,称为双音多频 (Dual-Tone Multi-Frequency, DTMF) 讯号。
双音多频的拨号键盘是 4×4 的矩阵,每一行代表一个高频,每一列代表一个低频,如下图所示。当我们按下一个键时,就传送一个高频和低频的正弦讯号组合,比如按下 '1' 的时候,会产生 697 和 1209 Hz 的两种音频。
这个小单元,要使用上面所学到的快速傅立叶变换来观察按键的频率,从而解出按键的内容。
小明按电话键的时候,小英暗中进行侧录,采样率为 8000 Hz,振幅已调整为 -1~1 的实数,录制档案格式为 wav,存放在 此连结中,请试著播出来听看看,并下载到自己的电脑。
小英学过一些基本的 FFT 概念,决定要自己进行解码,她使用 octave 处理,试著写了以下一段程式码如下:
[y, fs] = audioread('dtmf-sample.wav'); % 读入音档
plot(y);
执行之后,可以看到以下的图形输出。
请你使用 help audioread
查看 audioread 指令的用法,并且依小英的程式码做看看。
- 根据上面的图形,小英估测这个电话号码应该有 7 个数字。仔细观察之后,发觉第一个数字的讯号,其样本数应该不到 1000 个。如果取 1024 点来做 FFT 的话,音框的总时间是 1024/8000 秒,所以频率的解析度 ,查看上面 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))); % 画出频谱图
这个程式的执行结果如下:
- 紧接著小英用图形的缩放功能,仔细检查了信号的两个峰值,最后发现应该是 697 和 1336 Hz。由此小英确定这个电话号码的第一个数字应该是 2。请你试著依上面的程式操作,并练习用图形缩效功能,查看小英的判断是否正确。
练习 5