雙音多頻訊號（，簡稱：），電話系統中電話機與交換機之間的一種信令，最常用於撥號時傳送被叫號碼。不過雙音多頻的發明，除了縮短撥號時間，也擴充套件了撥號之外的功能，例如自動總機、互動式語音應答。 在雙音多頻訊號普及之前，電話系統中使用一連串的斷續脈衝來傳送被叫號碼，稱為脈衝撥號。脈衝撥號需要電信局中的操作員手工完成長途接續。由脈衝撥號到雙音複頻這幾年轉換期當中，新設計的電話機為了能相容於兩種系統，大都設計為複頻 脈衝 TONE PULSE 兩用。 雙音多頻訊號是貝爾實驗室發明的，其目的是為了自動完成長途呼叫。 因為傳統的脈衝撥號，只能把訊號送到電話接上的這一臺電信交換機，但長距通話時，往往必須經由多臺電信交換機才能完成，雙音多頻訊號可以克服這個障礙，利用本來就用來傳送聲音的電話線傳送使用者的按鍵訊號。 因為雙音多頻的發明，讓自動總機與互動式語音應答得以發展，此類裝置可以在接聽電話後自動宣讀預錄的語音，再依據發話端的按鍵訊號做相對回應。 多頻訊號 按鍵 雙音多頻的撥號鍵盤是 color Red 44 的矩陣，有 color RoyalBule 10 個數字鍵和 color RubineRed 6 個字元鍵，每個數字或字元都是由兩個單頻訊號的組合來進行傳輸，因此鍵盤上每個按鍵所對應的訊號都可以表示為 mathcal xtmathrm Asin 2 pi f_color Maroon L tmathrm Bcos 2 pi f_color Maroon H t，其中 f_color Maroon L 和 f_color Maroon H 分別表示按鍵所在的行和列對應的頻率值。換句話說每一行代表一個高頻，每一列代表一個低頻。也就是說每按一個鍵就傳送一個高頻和低頻的正弦訊號組合，比如 1 相當於 697 和 1209 赫茲（Hz）。交換機可以解碼這些頻率組合並確定所對應的按鍵。 ATT 貝爾實驗室提出用 DTMF 訊號作為音訊電話的撥號訊號，因為這種方式可以提供更高的撥號速率，且容易被自動檢測和識別。但反之，DTMF 訊號的這個優點也很容易變成致命的缺點，因為容易被交換機檢測和識別，也就意味著容易被意圖為之第三方破解。破解的原理很簡單，只要能估計出 DTMF 訊號中兩個單頻訊號的頻率值，再根據底下電話機鍵盤的頻率陣列表格的對應關係就可以反推出按鍵值。 雙音多頻鍵盤 1209 Hz 1336 Hz 1477 Hz 1633 Hz 697 Hz 1 2 3 A 770 Hz 4 5 6 B 852 Hz 7 8 9 C 941 Hz 0 D 注意：ABCD 四個字母並不使用於撥號鍵盤，但常做為機器對機器的控制訊號，例如 DTMF 格式的來話顯示。 按鍵識別實驗 根據撥號音識別號碼的關鍵就在於準確估計出 DTMF 訊號的頻率值。有很多種方法可以估計 DTMF 訊號的頻率值，在此舉例兩種實現方法，一種是基於 帶通濾波器 的方法，另一種方法為基於 格策爾演演算法 Goertzel algorithm。 1 帶通濾波器演算法 濾波器演算法識別按鍵的關鍵是設計 8 個帶通濾波器，每個帶通濾波器的中心頻率對應著低 高頻組的各個頻率點。將待識別的撥號音也就是 DTMF 的訊號波型依次透過這 8 個帶通濾波器。理論上只有頻率成分與濾波器中心頻率一致的訊號才會透過，在濾波器輸出端檢測能量最大者即可判斷出低 高頻序號，最後再透過電話機鍵盤的頻率陣列表格的對應關係即可反推出按鍵值。 以下展示使用帶通濾波器演算法應用於 MATLAB 程式碼 clear clc fs8000 t0800fs fcolumns1 697fcolumns2 770fcolumns3 852fcolumns4 941 frow1 1209frow2 1336frow3 1477 num0 sin 2pifcolumns4tsin 2pifrow2t 數字 0 num1 sin 2pifcolumns1tsin 2pifrow1t 數字 1 num2 sin 2pifcolumns1tsin 2pifrow2t 數字 2 num3 sin 2pifcolumns1tsin 2pifrow3t 數字 3 num4 sin 2pifcolumns2tsin 2pifrow1t 數字 4 num5 sin 2pifcolumns2tsin 2pifrow2t 數字 5 num6 sin 2pifcolumns2tsin 2pifrow3t 數字 6 num7 sin 2pifcolumns3tsin 2pifrow1t 數字 7 num8 sin 2pifcolumns3tsin 2pifrow2t 數字 8 num9 sin 2pifcolumns3tsin 2pifrow3t 數字 9 numStar sin 2pifcolumns4tsin 2pifrow1t 符號 numJin sin 2pifcolumns4tsin 2pifrow3t 符號 blank zeros size num1 間隔 f fcolumns1 fcolumns2 fcolumns3 fcolumns4 frow1 frow2 frow3 f_Low fcolumns1 fcolumns2 fcolumns3 fcolumns4 f_High frow1 frow2 frow3 設計帶通濾波器 low frequency N 400 Bandwidth 70 B_Low zeros 4N1 存放低頻組的濾波器係數 for i 14 Wo f_Low i wc1 Wo Bandwidth2 2 pifs wc2 Wo Bandwidth2 2 pifs B_Low i fir2 N0wc1piwc2pi10110 end 設計帶通濾波器 high frequency N 200 Bandwidth 110 B_High zeros 3N1 存放高頻組的濾波器係數 for i 13 Wo f_High i wc1 Wo Bandwidth2 2 pifs wc2 Wo Bandwidth2 2 pifs B_High i fir2 N0wc1piwc2pi10110 end DialNum num1 DTMF 訊號 sound DialNum 計算當前訊號與各個頻率點的距離 low frequency Diatance_Low zeros 14 for i 14 Output filter B_Low i 1DialNum Diatance_Low 1i max abs fft Output end maxnum_lowindex_low max Diatance_Low 1 計算當前訊號與各個頻率點的距離 high frequency Diatance_High zeros 13 for i 13 Output filter B_High i 1DialNum Diatance_High 1i max abs fft Output end maxnum_highindex_high max Diatance_High 1 判斷按鍵 if index_low 1 index_high 1 keynum 1 elseif index_low 1 index_high 2 keynum 2 elseif index_low 1 index_high 3 keynum 3 elseif index_low 2 index_high 1 keynum 4 elseif index_low 2 index_high 2 keynum 5 elseif index_low 2 index_high 3 keynum 6 elseif index_low 3 index_high 1 keynum 7 elseif index_low 3 index_high 2 keynum 8 elseif index_low 3 index_high 3 keynum 9 elseif index_low 4 index_high 2 keynum 0 elseif index_low 4 index_high 1 keynum elseif index_low 4 index_high 3 keynum end keynum 2 格策爾演演算法 Goertzel algorithm 理論上 DTMF 訊號只會在兩個固定的頻率點上出現能量，如何準確又高效地估計這兩個頻率值 低 高頻組 是識別撥號音的關鍵。傳統的頻譜估計方法得到的是一個頻率區間內所有頻率點的估計結果，而對於 DTMF 訊號我們只在乎那 8 個固定頻率點上的功率譜估計值。而 Goertzel 演算法就是估計 DTMF 訊號功率譜最經典又實用的方法，這個演算法只估計 DTMF 訊號特定頻率點上的功率譜。 以下展示 MATLAB 利用 Goertzel 演演算法估計 DTMF 訊號的範例 clear clc fs8000 t02000fs fcolumns1697fcolumns2770fcolumns3852fcolumns4941 frow11209frow21336frow31477 num0sin 2pifcolumns4tsin 2pifrow2t 數字 0 num1sin 2pifcolumns1tsin 2pifrow1t 數字 1 num2sin 2pifcolumns1tsin 2pifrow2t 數字 2 num3sin 2pifcolumns1tsin 2pifrow3t 數字 3 num4sin 2pifcolumns2tsin 2pifrow1t 數字 4 num5sin 2pifcolumns2tsin 2pifrow2t 數字 5 num6sin 2pifcolumns2tsin 2pifrow3t 數字 6 num7sin 2pifcolumns3tsin 2pifrow1t 數字 7 num8sin 2pifcolumns3tsin 2pifrow2t 數字 8 num9sin 2pifcolumns3tsin 2pifrow3t 數字 9 numStarsin 2pifcolumns4tsin 2pifrow1t 符號 numJinsin 2pifcolumns4tsin 2pifrow3t 符號 blankzeros size num1 間隔 ffcolumns1 fcolumns2 fcolumns3 fcolumns4 frow1 frow2 frow3 freq_indicesround ffslength t1 DTMF 訊號 CellPhoneNumnum1 blank num3 blank num9 blank num8 blank num0 blank num7 blank num6 blank num6 blank num5 blank num2 blank num4 CellPhoneNum02randn size CellPhoneNumCellPhoneNum sound CellPhoneNum for i1221 DialNumberCellPhoneNum i1length t1ilength t dft_datagoertzel DialNumberfreq_indices temp sort abs dft_datadescend 找最大的兩個頻率點數值 temp_index1 find abs dft_data temp 1 temp_inedx2 find abs dft_data temp 2 if temp_index1 temp_inedx2 保證 temp_index1 代表低頻，temp_index2 代表高頻 index_low temp_index1 index_high temp_inedx2 else index_low temp_inedx2 index_high temp_index1 end 判斷按鍵 if index_low 1 index_high 5 keynum 1 elseif index_low 1 index_high 6 keynum 2 elseif index_low 1 index_high 7 keynum 3 elseif index_low 2 index_high 5 keynum 4 elseif index_low 2 index_high 6 keynum 5 elseif index_low 2 index_high 7 keynum 6 elseif index_low 3 index_high 5 keynum 7 elseif index_low 3 index_high 6 keynum 8 elseif index_low 3 index_high 7 keynum 9 elseif index_low 4 index_high 6 keynum 0 elseif index_low 4 index_high 5 keynum elseif index_low 4 index_high 7 keynum end PhoneCell_Indent round i2 keynum end display PhoneCell_Indent 顯示識別結果 特殊音訊 特別頻率 事件 低頻 高頻 週期 on off 忙音 480 Hz 620 Hz 05 s 05 s 回鈴音（美及英式） 440 Hz 480 Hz 1 s 4 s 撥號音（美及英式） 350 Hz 440 Hz 持續長音 歐式音調： 事件 低頻 高頻 忙音（歐洲大部） 425 Hz 回鈴音（英國和愛爾蘭） 400 Hz 450 Hz 回鈴音（歐洲大部） 425 Hz 撥號音（英國） 350 Hz 450 Hz 撥號音（歐洲大部） 425 Hz 另見 星號 井號 Category 電話 Category 電話信令