跳至主要內容

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

接下來,請你試著幫小英完成後面的工作,把電話號碼都給解出來,請提供決定頻率的程式碼和關鍵圖形。