協議: DTMF相關FAQ

最近工作中需要一些關於多媒體會議相關協議的知識,這裏作一個筆記,以便以後查看。下面的知識來於網絡,本人做了一個整理。原文請參考 文獻鏈接。


Q. What is DTMF ?

A. 雙音多頻信號(Dual-Tone Multi-Frequency, DTMF),電話系統中電話機交換機之間的一種用戶信令,通常用於發送被叫號碼。在使用雙音多頻信號之前,電話系統中使用一連串的斷續脈衝來傳送被叫號碼,稱爲脈衝撥號。脈衝撥號需要電信局中的操作員手工完成長途接續。雙音多頻信號是貝爾實驗室發明的,其目的是爲了自動完成長途呼叫。

  雙音多頻的撥號鍵盤是4×4的矩陣,每一行代表一個頻,每一列代表一個頻。每按一個鍵就發送一個頻和頻的正弦信號組合,比如'1'相當於697和1209赫茲(Hz)。交換機可以解碼這些頻率組合並確定所對應的按鍵。

雙音多頻鍵盤
  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四個字母於現代電話已不用。

特殊音頻

事件 低頻 高頻
忙音 480 Hz 620 Hz
回鈴音(美及英式) 440 Hz 480 Hz
撥號音(美及英式) 350 Hz 440 Hz


Q. 當程序需要產生一個DTMF音頻數字信號時,可以讀取已經錄製好的文件,但如何動態生成DTMF音頻信號?

A. 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內其他時間爲靜音,以便區別連續的兩個按鍵信號。


Q. DTMF的傳輸方式:Info, In Band, Out of Band(RFC2833) ?

A. 

1, 用SIP信令的INFO方法攜帶DTMF信號。該種方法還在研究討論當中,有專家認爲其並不適用,主要缺陷是因爲SIP控制信令和媒體傳輸(RTP)是分開傳輸,很容易造成DTMF信號和媒體包不同步。在 Voice Mail應用中,用戶根據提示音輸入一個DTMF信號,隨後開始留言。Server是在接受到該DTMF信號後開始保存用戶的留言。然而由於DTMF信號是通過SIP信令來傳輸的,而媒體流是通過RTP來傳輸的,有可能用戶留言的RTP包先到,而該DTMF信號的INFO消息延遲,導致Server不保存用戶的語音留言直至接受到INFO消息。
2, 將DTMF信號和媒體流用RTP包來傳輸,因而沒有DTMF信號和媒體流不同步的問題,使用H323信令的VOIP就是採用該種方法,相對來說比較成熟。而其中又分In band和Out of band(RFC2833)兩種。
In Band DTMF
In Band DTMF是指直接將DTMF的音頻數字信號不經任何處理直接打成RTP包在IP網中傳輸。其中可能和用戶的語音媒體流混合(mix)在一起傳輸。程序要獲知哪個包有DTMF信號,是什麼DTMF信號,必須實時檢查每個RTP包裏面的媒體流數據,分析它的頻域。
Out of Band DTMF(RFC 2833)
Out of Band DTMF是DTMF信號用專門的RTP包進行標識,在RTP包的頭域中就可得知該包是DTMF包,並且知道是什麼DTMF信號。RFC2833專門對此有定義。
Q. RFC2833如何傳輸DTMF?
A.RTP 2833: RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals. 
RTP的負載格式如下:
0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     event     |E|R| volume    |          duration             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

與DTMF相關的在telephone-event負載格式中的命名事件包括:
                     Event  encoding (decimal)
                     _________________________
                     0--9                0--9
                     *                     10
                     #                     11
                     A--D              12--15
                     Flash                 16

                     Table 1: DTMF named events
撥打911後的RTP數據包爲:
0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |
   | 2 |0|0|   0   |0|     96      |              28               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           timestamp                           |
   |                             11200                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           synchronization source (SSRC) identifier            |
   |                            0x5234a8                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |F|   block PT  |     timestamp offset      |   block length    |
   |1|     97      |            11200          |         4         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |F|   block PT  |     timestamp offset      |   block length    |
   |1|     97      |   11200 - 6400 = 4800     |         4         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |F|   Block PT  |
   |0|     97      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     digit     |E R| volume    |          duration             |
   |       9       |1 0|     7     |             1600              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     digit     |E R| volume    |          duration             |
   |       1       |1 0|    10     |             2000              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     digit     |E R| volume    |          duration             |
   |       1       |0 0|    20     |              400              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          Figure 2: Example RTP packet after dialing "911"

Q. 帶內信令和帶外信令

A. 在很久很久以前(long long ago),那時候人們還處於模擬通信和機械式交換機的時代(縱橫或者步進),那時候不存在獨立的信令網,交換機之間的“語言交流(信令)”和語音信號在一條傳輸通道上跑。這就是帶內信令。後來發展了,交換機之間的“語言交流(信令)”和語音信號的傳輸分別走不同的傳輸通道,建立起獨立的信令網,這樣信令信號走信令網,語音走語音的傳輸通道,兩者分道揚鑣,這就是帶外信令!

帶內信令是指信號的頻率在話音頻率範圍之內(0.3~3.4kHz)。帶內信號是在話音通道內傳遞的。
帶外信令,又叫共路信令,是一種採用在信息傳輸頻率/信道之外的頻率/信道傳輸信令技術。在帶內信令可能受到各種網絡問題影響的情況下,帶外信令經常被用於傳輸控制命令以報告相關的錯誤信息。


參考文獻:

1,  http://zh.wikipedia.org/wiki/DTMF

2,  http://blog.csdn.net/kukumouse/article/details/2270279

3,  http://www.ietf.org/rfc/rfc2833.txt





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章