1. 程式人生 > 實用技巧 >HTML5實現DTMF(電話撥號按鍵訊號)解碼、編碼,程式碼簡單易於移植

HTML5實現DTMF(電話撥號按鍵訊號)解碼、編碼,程式碼簡單易於移植

目錄

DTMF(Dual Tone Multi Frequency) 雙音多頻,由高頻群和低頻群組成,高低頻群各包含4個頻率;兩個頻率波形合成按鍵訊號(0-9 * # A B C D)。

SIP中檢測DTMF訊號的方法:SIPINFO、RFC2833、INBAND;至於這些是什麼我這個外行純屬熱鬧;拿兩個手機互打電話,中途按下的按鍵嘟嘟的聲音就是直接通過話音來傳輸DTMF訊號,屬於INBAND(帶內檢測)吧。

拿Adobe Audition開啟手機上的電話錄音檔案,可以直觀的肉眼看到整齊的DTMF訊號,分析一下就能很快GET到此訊號的解碼、編碼原理。

線上測試地址:線上測試

【圖1】簡單粗暴合成的PCM訊號雜波較多,但和華為手機打出來的錄音訊號差不多(他們雜波少點)

一、前言

1.1 HTML5實現DTMF的一些動機

我的GitHub開源庫 Recorder 功能日漸豐富,最近又有專案可能會用到DTMF的解碼功能,所以就用js實現了一下,本著易於移植的目的,相關程式碼都是簡單的純js程式碼,移植到別的語言非常方便。

涉及到三個原始碼,個個小巧:

  1. FFT:lib.fft.js 111行(程式碼+空行+註釋)
  2. DTMF解碼:dtmf.decode.js 192行(程式碼+空行+註釋)
  3. DTMF編碼:dtmf.encode.js 191行(程式碼+空行+註釋)

自評:高效能、準確度高、誤識別率低;歡迎到 線上測試,下載別的一個軟體 dtmf2num(命令列) 來對比傷害一下。

1.2 一些有效場景

(1) 10086

查話費請按1,嘟(你按了一個1),您的話費餘額為9億9千萬……不能否認,這些能力的實現是建立在DTMF訊號的編解碼之上。

(2) 軟電話

透過某些渠道,比如在你伺服器上的程式擁有了自動撥打電話的能力,你希望通過使用者按下某些按鍵後實現一些功能,比如輸入密碼,這樣你的伺服器端程式就需要帶上DTMF解碼功能。

(3) 小玩具

寫一些小玩具把玩。嘿哈