G.723.1編譯碼算法的DSP實現

其中,τξ是一個中間參數,d是r〔n〕和h〔n〕之間的相關值,Φ是沖激響應的協方差矩陣。C、ε的計算:

對奇位置的碼矢量,先把偶脈沖移一個樣本位置,然后用上式計算。
3 算法實現
3.1 硬件設計
系統框圖如圖1所示。本文引用地址:http://www.104case.com/article/150508.htm

模擬的語音信號通過TP3057的A/D轉換變為數字信號送入ADSP-2181(采樣頻率8kHz)。TP3057是美國國家半導體公司生產的A律編/解碼器,它包含一個利用A/D和D/A轉換結構的A律脈沖編碼調制的編解碼器/濾波器單片電路和一個串行PCM接口。其中,編碼部分還包含一個可調輸入增益的放大器、一個有源RC前置濾波器、自動調零電路、一個A率壓縮編碼器。解碼部分包括一個A律解碼器和截止頻率為3400Hz的低通濾波器。前者從A律壓擴的信號中重建模擬信號,后者校正譯碼器輸出的sinx/x響應并濾除高頻信號。
ADSP-2181是Analog Devices公司生產的一種性能優越的單片機,適合于高速的數字信號處理。 ADSP-2181除了三個運算單元、數據地址發生器和一個程序序列器,還含有兩個串行口、一個16位的內部IDMA口、一個8位的BDMA口、一個可編程定時器、外部中斷能力及片內程序和數據存儲器。片內集成了80k字節的存儲器,包括16k長度為24bit的程序存儲器和16k長度為16bit的數據存儲器。
利用IDMA口的自動接受發送功能,可以方便地實現ADSP-2181與主CPU間的數據交互。PC機通過IMDA口將程序裝載入ADSP-2181內部存儲器中。在ADSP-2181全速執行時,主機可以查詢其狀態,讀取壓縮后的碼流,也可送入待解碼的數據。
3.2 軟件設計
軟件設計包括三個模塊:接口模塊、編碼模塊和解碼模塊。
接口模塊實現ADSP-2181與主CPU之間的數據交換。該模塊包括DSP的主控程序和數據傳輸兩部分。DSP的主控程序負責將采集到的語音數據分幀,送入編碼器,并將接受到的碼流分類后送入解碼模塊。數據傳輸部分負責采集數據和與主CPU的數據交換。
DSP程序根據ITU-TG.723.1標準定點算法,分為初始化(G723—Init)、編碼(G723—Incode)、解碼(G723—Decode)三個模塊。
G723—Icode對包含240個采樣點的一幀信號進行編碼,返回12個或10個字長的二進制數據。
輸入數據由串口得到,放在數組G723—Enc—Inp中,返回值放在數組G723—Enc—Out中,對于6.3kbps長工為12個字,對于5.3kbps長度為10個字。其格式按照G.723.1標準進行封裝。
G723—Decode根據接收到的12字或10字打包數據重建240個語音樣點。輸入數據放在G723
Dec—Inp中,輸出放在數組G723—Dec—Out中。
主機程序采用VisualC++編寫,通過串口與DSP通信。
3.3 C語言的優化
開發中采用AD公司的集成仿真軟件VisualDSP++,但是通常,C編譯器能完成整個工作的70%,而30%的進一步優化必須通過手寫匯編來實現。
3.3.1 循環展開
使用具有并行能力的DSP開發軟件時,一個重要的思想就是充分利用DSP的字長和數目眾多的運算單元,盡量把循環體展開。通過增加每次循環中執行的指令數來減少總的循環次數,可使得在同樣的時鐘周期內能運行更多的指令,提高了循環的效率。
3.3.2 提高寄存器的利用率
DSP芯片內部的運算單元運行效率非常高,但如果寄存器和數據總線之間的數據交換頻繁,將使DSP的執行效率大打折扣。因為DSP在進行內存操作時,往往需要若干周期的延遲,如Load指令要有4個周期的延遲,Store指令需要2個周期的延遲。為了減少耗時的內存操作,可以在程序進入循環體之前,將要頻繁使用的數據預先放入寄存器,然后反復調用,實踐證明這種方法可以提高一部分效率。
4 實驗結果
所有代碼全部通過了ITU-T測試矢量的測試。
測試結果表明,對于高碼率(6.3kbps)所需計算量為24.8MIPS,對于低碼率(5.3kbps),所需計算量為21.3MIPS。該實現可以在IP電話、視頻會議中得到廣泛應用。
評論