談談語音通信中的各種tone


今天談的這個主題(tone)存在於我們的日常打電話過程中。先舉兩個場景:1,你拿起固話話筒准備打電話,按電話號碼前先從話筒里聽到“嗡”的連續音,這叫dial tone(撥號音,表示你可以撥電話號碼了),你撥完號碼對方振鈴后你又聽到有規律的“嘟-嘟-”的斷續音,這叫ring back tone(回鈴音,表示對方已振鈴了)。2,你給企業服務號(比如中國移動的10086)打電話,對方叫你按鍵選擇,當你按下鍵后會聽到按鍵聲,這叫DTMF tone(雙音多頻音)。感覺到它存在於我們日常的打電話過程中了吧。現在我們就從技術的角度談談這些tone。

 

在語音通信中tone主要分兩大類:CPT(call progress tone,呼叫過程音)tone和DTMF(dual tone multi frequency,雙音多頻音)tone。CPT tone存在於通話過程中,主要用於告訴用戶目前在什么狀態,主要有dial tone(撥號音)/ringback tone(回鈴音)/busy tone(忙音)等。CPT tone是單頻音,即由一個頻率的正弦波形成。CPT tone沒有全球統一的標准,而是各個國家有自己的標准,比如中國的標准,歐洲的標准,美國的標准等。下表就是我們國家的標准:

                                           

還有其他類型的CPT tone,由於用的相對較少,這里就不一一列出了。相對於CPT tone是單頻音,DTMF tone是雙頻音,即用兩個頻率(一個高頻和一個低頻)的正弦波疊加去表示某個按鍵值。與CPT tone各國有自己的標准不同的是DTMF tone全球有統一的標准,下表列出了常用的16個按鍵值是由哪些高頻音和低頻音組合而成的:

                                                       

 

從軟件實現的角度對tone主要有兩類處理:tone generation,讓用戶聽到tone;tone detection,主要是指DTMF tone的detection,讓軟件知道哪個按鍵按下了,好進行后續的處理。我們先看tone generation,也就是生成單個頻率的正弦波(CPT tone)或者兩個頻率正弦波的疊加(DTMF tone),在信號處理上有相應的算法。對於單頻正弦波,各個采樣點上值的生成可通過如下的數學表達式求得:

                                                                             

其中a/y(0)/y(1)在各個頻點上的值已事先根據數學公式做成表,從而減少數學運算。對於DTMF這樣的雙頻率音來說,采樣點上的值就是兩個頻率采樣點上的值相加。Tone generation分兩個方向,local 和remote。Local是tone讓自己聽到,把生成的正弦波放到RX stream上;remote是tone讓對端聽到,把生成的正弦波放到TX stream上。對於像ring back tone等斷續音還需要timer控制放多長時間停多長時間。

 

再來看tone detection,這里主要是指對DTMF的tone detection。有專門的算法(Goertzel戈澤爾算法)來detect DTMF的鍵值,把DTMF的音頻信號(多幀的PCM信號)作為算法的輸入,經過一定幀數后得到的就是DTMF的鍵值。原理這里就不詳細講了,有興趣的可以看相關文章。有時候我們需要告訴對端按下的是什么DTMF鍵,即要把鍵值傳給對端,主要有三種方法,具體如下:

1,把DTMF音頻信號直接編碼得到碼流放在RTP中發給對端。對端收到RTP包后解碼復原出音頻信號,然后再通過DTMF detection算法得到鍵值。這通常被叫做in-band方法。

 

2,在本端做DTMF detection得到鍵值,然后根據RFC2833(后來升級成RFC4733)組成RFC2833包發給對端。對端收到RFC2833包后去解析就知道是哪個鍵值了。這通常被叫做out-of-band方法。RFC2833包也是用RTP做承載,不過它的payload type是動態的(96~127之間一個值),payload共4個字節(32個比特),具體如下:

                                                          

其中bit0-7(共8位)表示鍵值,bit8表示DTMF按鍵結束,bit9目前保留不用,bit10-15(共6位)表示按鍵信號的level(dBm表示),bit16-31(共16位)表示按鍵持續的時間(以采樣值為單位)。一個DTMF鍵會生成多個RFC2833包,對同一個鍵值而言,這些包的sequence number會每次加1,但是timestamp不變,duration會持續增加,以8k采樣率20ms為一包為例,第一個RFC2833包duration為160,第二個RFC2833包duration為320,依次向上加,直到END包(bit8置1)結束。END包會發3次(發3 次主要是為了防丟包),每個END包sequence number會加1,但是duration保持不變。

 

3,在本端做DTMF detection得到鍵值,然后通過SIP信令的INFO帶給對端,讓對端知道是哪個鍵值。

 

這三種方法中,具體用那種方法要看雙方設備的支持程度,在SDP中有個協商的過程,最終選用雙方都支持的一種方法(如果雙方都支持多種方法,還有一個優先級來控制選擇哪種方法)來傳送DTMF值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM