1.簡介
雙音多頻dtmf(dual tone multi-frequency)信令,逐漸在全世界範圍內使用在按鍵式**機上,因其提供更高的撥號速率,迅速取代了傳統轉盤式**機使用的撥號脈衝信令。近年來dtmf也應用在互動式控制中,諸如語言選單、語言郵件、**銀行和atm終端等。
由於dtmf在傳統通訊領域中的廣泛使用,所以在voip中,dtmf仍是發揮著重要的作用。
乙個dtmf訊號由兩個頻率的音訊訊號疊加構成。這兩個音訊訊號的頻率來自兩組預分配的頻率組:行頻組或列頻組。每一對這樣的音訊訊號唯一表示乙個數字或符號。產生dtmf訊號,就是利用兩個不同頻率的正
弦波疊加以後形成的波形,解碼時則採用改進的goertzel演算法,從頻域搜尋兩個正弦波的存在。
下表描述了每個dtmf訊號的頻率。
1209 hz 1336 hz 1477 hz 1633 hz
697 hz123a
770 hz456b
852 hz789c
941 hz*02. dtmf#d
在voip
中的解決方案
由於在ip網中的通訊傳輸是採用包交換(
packet switch
)而不是傳統領域中的線路交換(
circuit switch
)以及ip
網的不穩定的特性,
dtmf
在voip
中應用的解決方案和傳統有所不同,並且暫時還未統一,有多種解決方案。
下面簡單介紹現有的各種方案。
3.用
sip信令的
info
方法攜帶
dtmf
訊號。
該方法是用
sip信令的
info
方法來明文定義來代表
dtmf
訊號。該種方法還在研究討論當中,有專家認為其並不適用,主要缺陷是因為
sip控制信令和**傳輸(
rtp)是分開傳輸,很容易造成
dtmf
訊號和**包不同步。
簡單舉個例子,在
voice mail
應用中,使用者根據提示音輸入乙個
dtmf
server
是在接受到該
dtmf
dtmf
訊號是通過
sip信令來傳輸的,而**流是通過
rtprtp
包先到,而該
dtmf
訊號的info
訊息延遲,導致
server
info
訊息。
4.在rtp
**傳輸中攜帶
dtmf
訊號。
該方法是將
dtmf
訊號和**流一樣,用
rtp包來傳輸,因而沒有
dtmf
訊號和**流不同步的問題,使用
h323
信令的voip
就是採用該種方法,相對來說比較成熟。
而其中又分
in band
和out of band
(rfc2833
)兩種。 l
in band dtmf
in band dtmf
是指直接將
dtmf
的音訊數碼訊號不經任何處理直接打成
rtp包在
ip網中傳輸。其中可能和使用者的語音**流混合(
mix)在一起傳輸。程式要獲知哪個包有
dtmf
訊號,是什麼
dtmf
訊號,必須實時檢查每個
rtp包裡面的**流資料,分析它的
頻域。
lout of band dtmf(rfc 2833)
out of band dtmf
是dtmf
訊號用專門的
rtp包進行標識,在
rtp包的頭域中就可得知該包是
dtmf
包,並且知道是什麼
dtmf
訊號。rfc2833
專門對此有定義。
5.動態生成
dtmf
音訊訊號
當程式需要產生乙個
dtmf
音訊數碼訊號時,當然可以讀取已經錄製好的檔案。
在這裡介紹如何利用演算法程式動態產生單個
dtmf
音訊數碼訊號。
前面介紹過
dtmf
訊號的原理是兩個不同頻率的正弦波疊加。
簡單的生成正弦波的公式:sample=sin(n*2*pi*f/samplerate)
n:取樣序數,由
0開始遞增 f
:正弦波的頻率
samplerate
:取樣頻率
sample
:序數n
時的得出的取樣值
如果要生成乙個取樣頻率是
8000hz
,取樣位是
8bit
的dtmf
訊號,則公式:
sample(n) = 128 + 63*sin(n*2*pi*f1/8000) + 63*sin(n*2*pi*f2/8000)
f1和
f2分別是該
dtmf
訊號的兩個正弦波頻率 其中
128 = 256/2
63 = 128 /2 – 1
同樣地,如果要生成
16bit
的dtmf
訊號,則公式:
sample(n) = 32768 + 16383*sin(n*2*pi*f1/8000) + 16383*sin(n*2*pi*f2/8000)
計算
dtmf
訊號是乙個耗費資源的過程,你可以通過不同途徑去優化你的**,最簡單的是預先計算好
2*pi*f1
和2*pi*f2
的值,減少
cpu的計算時間。
關於dtmf
訊號的時間間隔,
ccitt對dtmf訊號規定的指標是,傳送/接收率為每秒10個數字,即每個數字100ms。代表數字的音訊訊號必須持續至少45ms,但不超過55ms。100ms內其他時間為靜音,以便區別連續的兩個按鍵訊號。
6.根據
rtp包中的音訊訊號檢測
dtmf
訊號
在輸入訊號中檢測
dtmf
訊號,並將其轉換為實際的數字,這一解碼過程本質是連續的過程,需要在輸入的資料訊號流中連續地搜尋
dtmf
訊號頻譜的存在。
整個檢測過程分兩步:首先採用
goertzel
演算法在輸入訊號中提取頻譜資訊;接著作檢測結果的有效性檢查。
7. goertzel演算法
dtmf
解碼即是在輸入訊號中搜尋出有效的行頻和列頻。計算數碼訊號的頻譜可以採用
dft及其快速演算法
fft,而在實現
dtmf
解碼時,採用
goertzel
演算法要比
fft更快。通過
fft可以計算得到訊號所有譜線,了解訊號整個頻域資訊,而對於
dtmf
訊號只用關心其
8個行頻
/列頻及其二次諧波資訊即可(二次諧波的資訊用於將
dtmf
訊號與聲音頻號區別開)。此時
goertzel
演算法能更加快速的在輸入訊號中提取頻譜資訊。
8.參考
[1] 「generating dtmf tones using soundcard」tomi engdahl
[2] 「
雙音多頻dtmf技術在dsp系統中的實現
」 管慶徐勝
[3] 「
rtp payload for dtmf digits, telephony tones and telephony signals
」rfc2833
h. schulzrinne, s. petrack
[4] 「
」rfc1889
h. schulzrinne,, s. casner,r. frederick, and v. jacobson,
對DTMF在VOIP中應用的研究彙總
雙音多頻dtmf dual tone multi frequency 信令,逐漸在全世界範圍內使用在按鍵式 機上,因其提供更高的撥號速率,迅速取代了傳統轉盤式 機使用的撥號脈衝信令。近年來dtmf也應用在互動式控制中,諸如語言選單 語言郵件 銀行和atm終端等。由於dtmf在傳統通訊領域中的廣泛使用...
DTMF 在FreeSWITCH中的傳輸方式
在sip 通話中,傳輸按鍵資訊的方式很多,但還是統一稱作dtmf。其中在freeswitch中支援三種dtmf的傳輸方式。inband 這種方式和傳統的dtmf相似,不過是把雙音多頻內容用音訊編碼方式放到rtp資料裡進行傳輸。freeswitch預設不支援這種方式,因為這種方式需要檢測rtp包中的內...
雜湊表 在VOIP使用者資訊儲存中的應用
標頭檔案 ifndef hash h define hash h define ok 1 define error 0 define hash size 256 typedef struct hashnode 採用雙向鍊錶儲存 thashnode thashnode vsipuserlocation...