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