新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > 基于軟件的DTMF產生器及其性能分析

        基于軟件的DTMF產生器及其性能分析

        作者: 時間:2005-04-06 來源:網絡 收藏

        摘要:簡述信號的基本原理,提出使用SPCE061芯片的D/A端口和使用I/O端口模擬D/A信號的兩種實現方案,并通過實驗和仿真對兩種實現方案進行對比。實驗證明,由于D/A精度較高,采用D/A輸出的信號質量比使用I/O電阻網絡的DTMF質量好;但在采樣頻率足夠高的情況下,使用I/O電阻網絡仍然可以滿足電信標準要求。

        關鍵詞:雙音多頻(DTMF) sin函數計算 SPCE061A MATLAB仿真

        在全世界范圍內,雙音多頻DTMF(Dual Tone Multi Frequency)信令逐漸使用在按鍵式電話機上,因其提供更高的撥號速率,迅速取代了傳統轉盤式電話機使用的撥號脈沖信號。近年來,DTMF也應用在交互式控制中,如語言菜單、語言郵件、來電顯示、電話銀行和ATM終端等。在芯片內部沒有內置DTMF器時,用普通D/A甚至于用4~5個普通I/O口和簡單的電阻網絡來模擬D/A實現DTMF信號的產生,將擴大DTMF在工程中的應用,具有一定的應用價值。本文主要研究以上兩種用產品 DTMF信號的方案。

        DTMF信號由8個頻率兩兩組合而成。這8個頻率又分為低頻群和高頻群兩組。低頻群的4個頻率依次為697Hz、770Hz、852Hz、941Hz;高頻群的4個頻率依次為1209Hz、1336Hz、1477Hz、1336Hz。在通信領域應用中,DTMF主要用于電話機撥號信號和CID(Caller Identification,來電顯示)信號的傳送。在應用于電話機的撥號信號中,按照國家電信標準,其信號持續時間和間隔時間都不小于40ms,而頻率偏差不大于1.5%。

        1 傳統的可編程硬件DTMF發生器原理

        傳統的DTMF發生器芯片有Hotel公司的HT9200A/B、Mitel公司的MT8880等。部分MCU也內置了DTMF發生器,其DTMF信號產生原理可簡述如下:

        將振蕩器產生的高頻振蕩信號分別送至兩個計數器,當計數器達到預設的值時,產生一次反轉信號輸出,形成低頻方波。其中計數器寄存器可用設置且有自動裝載功能。通過這兩個計數器可設置輸出的兩路方波頻率。編寫控制程序時,只須將對應頻率的計數值寫入控制寄存器便可自動產生所需的頻率信號。

        從以上兩路輸出的方波再進行信號正弦化處理和幅度控制,然后將兩路信號同時送至信號混合器輸出。這樣,如果其中一路輸出的方波頻率接近DTMF低頻群中的一個頻率,而另一路接近DTMF高頻群中的一個頻率,從混合器輸出的信號便是所需的DTMF信號了。

        2 用D/A產生DTMF信號

        DTMF軟件產生器是兩個用軟件模擬的二階數字在弦波振蕩器,一個用于產生低頻,一個用于產生高頻。典型的DTMF信號頻率范圍是697Hz~1633Hz。選取8192Hz作為采樣頻率,即可滿足Nyquist條件。系統中信號合成的函數方程為

        Y(n)=a0+a1sin(2Pif0n/fs)+a2sin(2Pif1n/fs) (1)

        式中:a0為直流分量;f0、f1分別為DTMF中的低頻和高頻;fs為采樣頻率,在此定為8192Hz;a1、a2分別為f0、f1的振幅;n為采樣點數。

        2.1 sin函數的計算

        采樣頻率并不是DTMF的8個頻率中各頻率的整數倍,若采用查表法得到各采樣點處理的D/A輸出值,由于查表意味著輸出值周期性的出現,則要求采樣頻率是輸出頻率的多個周期的整數倍。又由于輸出數據表中需要包括多個周期,而且要逼近上述的整數倍,因此輸出頻率必須是采樣頻率整數倍的倍數。由此產生以下幾個問題:

        ①多個周期的數據表較大(平均一個頻率20字左右);

        ②數據表中各數值的計算煩雜;

        ③產生的信號頻率存在頻偏。

        若采用計算sin函數的方法,以上問題都將迎刃而解。只是,如何計算sin函數呢?在傳統的電子計算機系統中,處理浮點數比處理整數要復雜且占用CPU較多的時間;而在鄭易里片機系統中,一般對程序運行的時間都有要求。因此,本文采用了定點小數近似表示浮點數的方法,再利用線性插值法計算各點處的正弦函數值。

        定點小數的表示方法:將需要表示的小數空間乘上一個系數映射到整數所能所示的空間。本文使用16位的單片機SPCE061,其D/A的精度為10位,DAC輸出寄存器為16位數據的高10位;sin函數的值域為[-1,+1],取整數域[0x0000,0x03ff]映射sin函數值中的[0,+1],取補數映射sin函數值中的負值,即可滿足DTMF輸出精度要求。要求將1映射為0x03ff,因此,當函數值為正時,應乘以0x03ff即1023,經取整后作為計算sin函數子程序的輸出;當函數值為負時,只須將對應的正時的函數值取補便可得到。

        計算sin函數時,將0~2π映射為整數域的[0x0000,0x4000],因此,可通過整數域的第13和12位獲得象限信息。查表時只計算第一象限[0, π/2]的正弦值,其它象限的函數仁政由三角函數公式計算得到。第一象限sin函數的計算:0~π/2被映射到整數域的[0x0000,0x1000],將其分為16等分,將分割點上的函數值建立數據表,即將0、0x0100、0x0200等17個點處對應的正弦值列表,若弧度值x介于兩分割點x1與x2之間,則通過查表獲得sin(x1)與sin(x2),則有:

        sin(x)=sin(x1)+[sin(x2)-sin(x1)](x2-x1)/256

        其它象限可根據三角函數公式獲得類似的計算公式。

        2.2 DTMF信號的軟件合成

        由于在DTMF的傳輸過程中,高頻在線路中的傳輸損耗比低頻高,為了保證信號到達交換機時高、低頻信號電平基本相當,在DTMF信號產生器中,標準規定頻率組合中高頻分量電平應比低頻分量電平高21dB。在DTMF硬件產生器中,這一處理是在高、低頻信號混合器之間的低頻通道中加適當的衰減電路完成的;而在用D/A產生DTMF信號的過程中,高、低頻信號的混合也是由軟件完成的。因此,必須在高、低頻信號的產生過程中就考慮使低頻信號的振幅略低于高頻信號,這樣才能從輸出的信號中獲得所需的電平差。由2.1中所描述的sin函數計算得的函數值,為實際函數值的1023倍。式(1)中,取y(n)的電壓范圍為0~5V,直流分量a0為2V;令高頻信號的電平為Sh,低頻信號的電平為S1,單位為dBm,則有

        Sh=-20lg(Vh/V0) S1=-20lg(V1/V0) 1Sh-S12

        取Vh/V1=6/5,則Sh-S1≈1.6dB,即取a1為5,a2為6,即可得到高、低頻的電平差為1.6dB的信號。將y(n)映射為SPCE061的D/A輸出值[0x0000,0xffc0],則DAC的輸出為(0xffc0/5)y(n),公式如下:

        設 A=1023sin(2Pif0n/fs)

        B=1023sin(2f1n/fs)(n=0,1,2…)

        DAC(n)=(0xffc0/5) y(n)=

        12.8(1023a0+a1A+a2B)=

        26189+5A+6B (2)

        式(2)中的A和B都由計算sin的子程序求得。由于2π在量化為整數時為0x4000,即16384,而fs=8192Hz,實際的sin函數子程序自變量便簡化為(2nf0和0x3fff),這對于單片機的處理是相當容易的。由上述公式求得的DAC值,已將計算結果數據移到了高10位,可直接輸出到D/A寄存器。

        3 用I/O口模擬D/A產生DTMF信號

        在某些應用中,所使用的MCU比較簡單,如8051;或者因為對成本控制的要求而不能使用帶D/A的MCU,但又需要用這些MCU產生DTMF信號,其替代方案是用多個I/O口和電阻網絡來模擬D/A。當然,這樣的電路產生的DTMF,其輸出精度會比由D/A產生的低,噪聲也會比較大,但在某些應用中已經可以滿足DTMF輸出的要求了。

        圖1是用4個I/O口模擬D/A輸出的原理圖。

        圖1中的4個I/O口可以表示16種狀態。經過列表計算這16種狀態下的等價上拉電阻和下拉電阻,可得出各狀態下的分壓值。以VCC為5V為例,則模擬D/A輸出的精度為0.3086V,只相當于一個精度很低的D/A。經過實驗測試,用4個I/O口、8192Hz的采樣頻率輸出DTMF信號時,必須用5個I/O口輸出才能達到普通電話機撥號器的要求;若采用4個I/O口輸出,則要求采樣頻率大于12kHz。本文介紹的方案中,采用了4個I/O口、16384Hz作為采樣頻率,利用輸出信號與地之間的電容充放電來平滑用I/O口輸出的階梯波形,這樣可減小失真,使輸出的DTMF信號更接近標準的正弦波疊加。

        4 用MATLAB仿真的實驗結果

        MATLAB是一種功能相當強大的數字運算、仿真的軟件,用其作數字信號處理也是相當簡單的事件。下面的實驗就是利用SPCE061A芯片通過其D/A和4個I/O口產生DTMF信號,將其耦合輸出到聲卡的LINE IN輸入口,采樣獲得DTMF信號的數據,再將信號數據轉化到MATLAB軟件中進行離散FFT,獲得具頻率域的信息。圖2是用D/A輸出的DTMF信號“1”的波形;圖3是用D/A輸出的DTMF信號頻譜;圖4是用4個I/O口模擬產生的DTMF信號“1”的波形;圖5是用4個I/O口模擬輸出的DTMF信號頻譜。圖3和圖5是用MATLAB軟件仿真的結果。從圖2~5可看出:所產生的DTMF信號,其頻率完全集中的規定的兩個頻率上。兩種方案下產生的DTMF波形,通過MATLAB計算得到的能量最大值出現的頻率都為1206Hz和次大值頻率689Hz,頻偏分別為0.25%和1.14%,都在DTMF信號規定的范圍之內。頻率的偏差是由于信號及離散傅里葉變換的量化誤差引起的。

        圖2和圖4信號波形的橫坐標為時間,約12ms;縱坐標為聲卡采樣量化電壓值,聲卡采樣精度為16位,采樣頻率為44.1kHz;圖3和圖5中的橫坐標為頻率;縱坐標為離散FFT分析結果(用復數表示的頻率域信息)的模。圖3中,除了DTMF的兩個頻率外,其它頻率沒有出現大的毛刺,波形非常漂亮,信號失真度低。

        圖5中,除DTMF的兩個頻率外,其它頻率有多處出現了毛刺,信號失真度比圖3所顯示的大。

        5 總結

        本文論述了用D/A產生DTMF的一般方法,并提出了用普通I/O模擬D/A產生DTMF的方法。在沒有DTMF硬件產生器的單片機應用中,可以根據實際情況選用上述兩種軟件產生的DMTF的方案。建議選擇具有D/A的MCU。用D/A產生DTMF比用I/O口模擬產生雙音多頻信號有以下幾個優點:D/A精度較高(普通D/A都有8位或8位以上),產生的信號失真度小;采樣頻率要求較低,能滿足尼奎斯特條件即可,軟件產生信號時用中斷定時輸出,中斷頻率也就比較低,從而占用CPU時間較少;用D/A輸出DTMF信號,不需要電阻網絡,外圍電路簡單。用D/A輸出DTMF信號的缺點是:要求MCU具有D/A輸出,在應用中存在局限性;在某些低端的應用中,帶D/A的MCU的其它資源也較多,成本相對比較高。用多個I/O口來模擬D/A就沒有上述局限性,只需要4個以上的I/O口,1.5MIPS左右的指令執行速度(上述實驗中采用的MCU主頻為6.144MHz,大部分指令執行時間為3~8個機器周期)。這兩個要求是大部分低檔、低檔成本的MCU(包括部分51系列芯片)都具有的,故由此方案實現的系統更有利于控制成本;而精度的不足、失真度大等問題,可以通過增加I/O口的個數來解決。若沒有多余的I/O口,根據實際應用情況,可以考慮將某些I/O口分時復用。

        當然,產生DTMF的方法還有很多。用軟件產生可以用PWM的方式(要求MCU具有較高的執行速度),用硬件產生可以用信號發生器等;但相對于用D/A或者普通I/O口來說,其復雜程度和成本都分比較高。因此,用D/A或者普通I/O產生DMTF信號有更廣泛的應用。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 潼南县| 教育| 九龙县| 平塘县| 双柏县| 炎陵县| 揭东县| 朝阳县| 修武县| 山阳县| 广平县| 汶上县| 邵武市| 营山县| 酒泉市| 永昌县| 甘泉县| 罗平县| 桃源县| 清远市| 平阳县| 新乐市| 金昌市| 安乡县| 临猗县| 连南| 凤凰县| 横峰县| 关岭| 德州市| 贵德县| 枣阳市| 顺义区| 怀集县| 闻喜县| 当涂县| 义马市| 河源市| 福泉市| 江孜县| 朝阳市|