李永田,秦世文,李玉成,王明建,董詩洋
(空軍工程大學航空機務士官學校,河南信陽,464000)
如今,智能手機已經(jīng)完全融入了我們的日常生活。我們頻繁地敲擊手機鍵盤,輸入電話號碼,輸入各種密碼或驗證碼,編輯微信或短信,操作手機銀行、網(wǎng)上購物等,每次敲擊手機鍵盤時,經(jīng)常會聽見“嘟嘀嗒”的按鍵聲,這些聲音都存在泄密的可能。在現(xiàn)實生活中許多地方存在泄密的可能。例如,電視以及有聲媒體采訪公眾人物時,注意不要把撥號聲音也放出來。我們平常使用手機撥打電話(如手機銀行)時,千萬注意身旁是否有人錄音,否則電話號碼或密碼很容易被還原出來,造成嚴重的隱患。為了防范密碼泄露,在輸入密碼的時候電話銀行系統(tǒng)一般會更改聲調(diào),使得撥號音聽上去怪怪的,這樣做的目的就是防止有人識別你的撥號音。
我們平常所用的電話,是通過雙音多頻(Dual Tone Multi-Frequency,DTMF)信號向交換機傳遞命令的,我們每按下電話鍵盤上的一個按鍵,就會同時發(fā)出兩個不同頻率的聲音,轉(zhuǎn)化為電流在對面解析。通過某些軟件手段便可以還原號碼按鍵音,進而解析出號碼。
一個完整的電話機鍵盤如圖1 所示,有10 個數(shù)字鍵和2個字符鍵。根據(jù)國際電報電話咨詢委員會(國際電信聯(lián)盟前身)建議,每個數(shù)字或字符都要用到兩個單頻信號的組合進行傳輸。因此,鍵盤上每個按鍵所對應的信號都可以表示為:
圖1 電話機鍵盤的頻率陣列
其中fL和fH分別表示按鍵所在行和列對應的頻率值,4個行上標注的頻率值697Hz、770、852、941 組成了低頻組,4 個列上標注的頻率值1209、1336、1477 和1633Hz 組成了高頻組。鍵盤號碼和頻率的對應關系如圖1 所示。
這些頻率的取值是經(jīng)過特別設計的:①這些頻率都處于人的可聽范圍內(nèi),因此按鍵下去時人可以聽到;②這8 個頻率中沒有一個頻率是其他任意一個頻率的倍數(shù);③任意兩個頻率的組合、相加或相減都不等于其他任意一個頻率。因此這些特性不僅簡化了雙音多頻信號的解碼,同時也降低了雙音多頻誤檢的概率。
根據(jù)國際電報電話咨詢委員會的規(guī)定,要求每100ms傳輸一個鍵盤數(shù)字或符號,代表數(shù)字的音頻信號持續(xù)時間必須為45~55ms。為了區(qū)分兩個連續(xù)地按鍵號碼,在100ms內(nèi)其他時間應該為靜音(無信號),電話信號的抽樣頻率應該為8kHz。
只要熟悉信號處理時頻變換關系,就很容易看出不同時間段對應的頻率值,再根據(jù)DTMF 信號原理就可以馬上反推出按鍵值,也就是通過離散傅里葉變換(Discrete Fourier Transformation,DFT),先將DTMF 信號轉(zhuǎn)換成頻域,然后在頻域上判斷各個頻點的能量。通過Matlab仿真可得,圖2 給出的就是按鍵1 的時域波形和頻域波形,可以很直觀地看出按鍵1 其實就是由兩個單頻信號構(gòu)成的(697Hz 和1209Hz)。
圖2 按鍵1 的時域波形和頻域波形
圖3 給出了按鍵0~9 的時域波形和頻域波形,可以很直觀地看出每個按鍵其實就是由兩個單頻信號構(gòu)成的。DTMF 信號在高低頻處的頻譜幅度非常大,其他頻率處幾乎為0。將DTMF 信號轉(zhuǎn)換為離散時間序列,然后執(zhí)行DFT,檢測幅度頻譜最大的兩個頻率。本論文實現(xiàn)的DTMF 信號的編碼和譯碼是理想情況下的編譯碼,實際中DTMF 信號在傳輸過程中會混疊有大量的噪聲,不能通過簡單的計算固定頻率處的幅度來確定信號的頻率成分。
圖3 按鍵0~9 的時域波形和頻域波形
圖4 中給出的就是按鍵0~9 撥號音的時頻圖,仿真程序為了更好地模擬真實情況,在源代碼中還引入了撥號間隔時間(blk)和傳輸噪聲(noise)這兩個仿真參數(shù)。從圖中結(jié)果可以看出,按鍵1,2,3 具有相同的低頻信號(697Hz),而它們的高頻信號是逐個上升的,其他按鍵頻率的變換關系與此類似。
圖4 按鍵0~9 的時頻圖
直接計算DFT 的計算量較大,而DTMF信號檢測只需要計算少數(shù)幾個頻點的頻譜。所以工程商通常采用濾波器法或者Goertzel算法來完成DTMF 信號的檢測。
濾波器法識別按鍵的原理如圖5 所示,該方法最關鍵的步驟就是設計8 個帶通濾波器,每個帶通濾波器的中心頻率對應著低/高頻組的各個頻率點。將待識別的撥音號碼(DTMF 信號波形)依次通過這8 個帶通濾波器,理論上只有頻率成分與濾波器中心頻率一致的信號才能通過,在濾波器輸出端檢測能量最大者即可判斷出低/高頻序號,最后通過鍵盤上頻率陣列的對應關系即可反推出按鍵值。
圖5 濾波器法識別按鍵值
將輸入值(DialNum)任意更改為電話機鍵盤上不同的按鍵值,逐個檢驗估計值(keynum)。我們發(fā)現(xiàn)利用濾波器法識別單個按鍵值并不能達到100%的準確率,識別效果對輸入信號的時長、快速傅里葉變換(Fast Fourier Transform,F(xiàn)FT)點數(shù)、濾波器階數(shù)等參數(shù)都比較敏感,利用濾波器法識別按鍵值的瓶頸在于各個帶通濾波器的幅頻特性并不理想。
圖6 中給出的是中心頻率分別為697Hz 和852Hz 的帶通濾波器的幅頻特性,源代碼中采用基于頻率采樣的方法設計數(shù)字濾波器。從圖6 中可以看出,4 個帶通濾波器的通帶部分都重合在一起,770Hz、852Hz 和941Hz 的單頻信號能大部分通過697Hz 的帶通濾波器,換句話說,697Hz 的帶通濾波器對770Hz、852Hz 和941Hz 的單頻信號濾除效果并不理想。
圖6 帶通濾波器幅頻特性對比
理論上,DTMF 信號只會在兩個固定的頻率點上出現(xiàn)能量,如何準確、高效地估計這兩個頻率值是識別撥號音的關鍵所在。傳統(tǒng)的頻譜估計方法,得到的是一個頻率區(qū)間內(nèi)所有頻率點的估計結(jié)果,而對于DTMF 信號,我們只關心那8個固定頻率點上的功率譜估計值。
Goertzel 算法是估計DTMF 信號功率譜最經(jīng)典、最實用的方法,該算法只估計DTMF 信號特定頻率點上的功率譜。這種算法充分利用序列的周期特性減少了DFT 的計算量。
其計算公式為:
式中,WN=e-j2π/N;N 為采樣點數(shù),k是求DFT的頻點序號向量。應用中Goertzel 算法的計算量的大小是由N值確定的。計算的N 值越大,即采樣序列越長,在fs已經(jīng)確定的情況下(本文為8000),其信號的頻率分辨率能力就越強,同時帶來的時延也越長。因此對于采樣點數(shù)N 的選擇取決于系統(tǒng)所需要的頻率分辨率。如果N 的值過小,信號檢測時,相鄰的音頻會落入同一檢測窗口,無法分辨,引起誤判。若N 值過大,既增加了無用的計算量,又造成時延的加大。故當N 點采樣結(jié)束時,即可完成對信號指定頻率的幅值判斷,大大提高了系統(tǒng)的實時性。Goertzel 算法一次只計算一個頻點的傅里葉分量,本文中N 的值取為205。
圖7 中可以看出,左邊較低的信號為697Hz 信號的頻率分量,另一根為1209Hz信號。使用Goertzel 算法相同的計算結(jié)果,對于指定的音頻697Hz,算法能夠計算出其頻率幅度。另外可以發(fā)現(xiàn),音頻信號與背景噪聲的功率差別比較大,這也是用閾值法判斷音頻是否存在的依據(jù)。
圖7 利用Goertzel 算法估計DTMF 信號的功率譜(按鍵1)
從圖8 中可以看出,Goertzel 算法只估計出事先給定的7 個頻率點上的功率譜(只需要7 個頻率值即可表示純數(shù)字的按鍵)。此時只需要檢測出最大的兩個能量值對應的頻率點,即可從鍵盤上頻率陣列的對應關系反推出按鍵值。通過這種方法可以對用戶某些重要操作按鍵進行錄音,然后對錄音數(shù)據(jù)在時域上進行檢測,再將有效區(qū)域通過Goertzel 算法轉(zhuǎn)換到頻域進行數(shù)字分類,通過比照DTMF 編碼表得到用戶所有按鍵數(shù)據(jù)。
圖8 利用Goertzel 算法估計DTMF 信號的功率譜(按鍵1~9)
利用Goertzel 算法識別手機號碼,識別效果遠好于濾波器法,而且對于傳輸噪聲等具有一定的抗干擾能力。需要注意的是,該程序直接把手機撥號音切分為11 個DTMF 信號后進行功率譜估計,省去了聲音信號端點檢測的過程,在實際應用中這些流程是必不可少的。
另外當信號長度延長時,將使DFT 的計算量也變大,但是由于DTMF 信號檢測不關心頻譜的相位信息,只關心頻譜的幅度信息,所以通過Goertzel 算法只需要經(jīng)過N 次的迭代就可以快速計算出頻譜的幅度。
Goertzel 算法實質(zhì)是對DFT 的快速運算,但可以有選擇地計算個別頻率點處的DFT 值,從而避免造成內(nèi)存和計算資源的浪費。
在本論文“基于Matlab 平臺系統(tǒng)仿真的Goertzel 算法的聽撥號音識別研究”案例中,介紹了如何利用兩個單頻信號的組合來仿真電話撥號音,而本論文則是根據(jù)DTMF 信號波形,通過估計頻率值推斷按鍵值。
雙音多頻撥號系統(tǒng)是一種典型的信號處理系統(tǒng),可實現(xiàn)雙音多頻信號的生成、檢測以及識別。Goertzel 算法只計算單一頻率對應的頻譜分量,在檢測信號時簡化了相位的計算,因而計算量得到精簡。對覆蓋全部頻譜而言,Goertzel有著更高的復雜度,但對單一頻率而言,它的效率更高,適合各種小型處理器和嵌入式設備。對于音頻檢測,Goertzel算法可以使用遞歸的方式在存儲數(shù)據(jù)的同時開始計算,節(jié)省了大量的存儲單元,很好地消除了采集數(shù)據(jù)所需要的時延,提高了通信的實時性。無論在硬件成本上,還是計算效率上,Goertzel 算法不但優(yōu)于傳統(tǒng)的獨立識別方法,也明顯優(yōu)于使用DFT 的軟件解碼方案。
綜上所述,Matlab 平臺能夠很好地生成和檢測DTMF信號。Goertzel 算法是計算序列DFT 和檢測DTMF 并且計算輸入數(shù)字的一個可行的方法。