語音編碼 c語言,語音編解碼算法G.723.1在DSP - 嵌入式新聞 - 電子發燒友網

1 引言

G.723.1是刪組織于1996年推出的一種低碼率的語音編碼算法標準,也是目前該組織頒布的語音壓縮標準中碼率最低的一種標準。G.723.1主要用于對語音及其它多媒體聲音信號的壓縮,目前在一些數字音視頻傳輸、高質量語音壓縮等系統中都得到廣泛應用。

2 G.723.1算法的復雜度分析

將G.723.1移植到TMS320C64xx后,就可借助TI集成開發工具CCS(Code Composer Studio)的Profile功能來評估其各個子程序或函數的執行運算量,從而把程序的優化集中在對程序性能影響最大的代碼上去。

通過分析可以看出,在G.723.1的編解碼算法中,碼本搜索所花費的運算量是比較大的,如Find_Best(),Find_Fcbk(),Find_Acbk():另外,在LPC分析和LSP參數的計算上也有運算量比較大的,如Comp_Lpc(),Lsp_Qnt(),Lsp_Svq()。

3 代碼的優化

代碼優化的工作有兩大目的:一是執行速度提高,實現實時;二是盡量不擴大程序體積(Code Size),使之在內存允許的范圍內。顯然,兩者存在一定的矛盾,當今超大規模集成電路的發展使RAM資源不再是系統的瓶頸,因此該部分工作的主要任務是怎樣提高執行速度。代碼的優化工作主要在CCS環境中進行。優化的原則是要充分考慮C64xx處理器超長指令字、多個運算單元和深度流水線的結構特點,以及避免過多的讀寫內存指令和程序轉移指令,充分發揮其強大的運算能力。具體方法包括(次序有先后):

3.1基本運算集的優化

G.723.1算法程序是用定點運算完成浮點運算,為了防止定點運算時可能溢出,許多運算需要進行飽和判斷,為此程序專門定義了基本運算集,實現諸如飽和加法、飽和乘法、除法和移位等操作。在程序中這些操作調用相當頻繁,經CCS的profile工具測試,基本運算函數集的調用占用了95%以上的CPU時間。因此,我們要從基本運算集的優化開始。在熟悉掌握C64xx指令集的前提下,分析基本運算集中各個函數完成的悉掌握C64xx指令集的前提下,分析基本運算集中各個函數完成的功能和對全局變量產生的影響,用C64xx指令取而代之或加以改編。其中包括對跳轉和流水線的優化討論、對乘積的飽和調整和全局變量OveRFlow的相關操作。

由于基本運算集以函數形式存在,兩次跳轉f函數的調用與返回1必不可少,將引起流水線的兩次打斷,表現為12個指令周期的占用。將這嶁基本運算函數集改成宏的形式,即將基本運算內嵌(inline)至lJ調用程序中,由此町以消除跳轉和流水線打斷帶來的指令周期占用,提高執行速度。雖然這樣做增加了代碼長度,多占用了一些內存,但由于基本運算函數體積均較小,再經過一定的代碼優化,在程序體積上的犧牲幾乎町以忽略。

基本運算的函數定義在BASIC.C文件里面,如果能夠對這些簡單甬數進行內聯指令(intrinsic)的優化,就能達到事半功倍的效果。內聯指令是匯編指令的直接映射,具有很高的效率。與此同時帶來的一個問題是溢出保護位Overflow的判斷,這是基本函數里用來標識溢出的全局變量,它的作用等同于CSR(Control Status Register)寄存器的SAT(SaturaTIon)位,當數據溢出時,SAT位被系統自動設置為1,所以編解碼函數里對Overflow的判斷可以轉化成對SAT位的判斷。引用CSR寄存器時需要在最開始的時候聲明extem cregister volaTIle ansigned int CSR。

C64xx指令提供了飽和乘法指令SMPY,實現16"16位的乘法與飽和結果調整,其執行操作如下:

if(cond){

if((src 1*src2<<1)!=0x80000000)

dst=((src 1*src2)<<1);

else

dst=0x7ffffff;

}

else

nop;

將原指令中的乘法指令改為SMPY.就可以完成乘法和飽和調整兩種計算,這樣可以省去飽和調整3條指令。與此類似,其它的飽和運算,C64xx都提供了相應的指令實現,將普通運算指令替換為飽和運算指令,飽和結果調整部分的運算均可以省去。

3.2主程序的優化

主程序的優化手段主要采用了以下幾種方法:

(1)使用內聯函數(intrinsics)

內聯函數是可直接映射為C64xx指令的特殊函數,它在指令前加上"_”表示。例如:

#define L_add(L_var1,L_var2)? _sadd(L_var1,L_var2)

#define L_mult(var1,vat2)? _smpy(var1,var2)

等,基本函數的內聯優化需要對原函數的定義和內聯指令都比較熟悉。

使用內聯函數代替相應的C語句是一種非常簡便高效的優化方法。如上面提到的飽和乘法,在C語句中。我們通常要使用兩個嵌套的條件判斷語句來檢查結果是否溢出,而指令int_smpy(int a.int b) 則在完成乘b的運算后,再做一次飽和處理,這樣一條DSP指令就可完成C語言中多條語句才能完成的計算,可以節省很多時鐘周期。

(2)循環展開(loop—unrolling)

程序中的有很多的雙重循環和多暈循環(比如代數碼本搜索計算),由于C64xx優化器在優化時只在最內層循環中形成一個指令流水(最多可以達到8級流水),這樣循環語句就不能充分利用軟件流水線,而且對于內部循環次數較少的情況,消耗在prolog和eplog上的時鐘周期也不可忽視。針對這種情況,一個有效的辦法就是將雙重或多重循環展開,降低循環次數。這樣雖然代碼長度增加了,但有更多的運算能夠參加到pipeline中。由于減少了流水線排空和提高了功能單元的利用率,程序執行速度會大大提高。

(3)減少分支和調用指令,減少判斷指令

程序中的分支、調用以及判斷指令會引起程序的跳轉,而每個跳轉指令都有5個延遲間隙。因此延長了程序執行時間;另外,循環內跳轉也會使軟件流水受到阻塞,降低了代碼執行效率。優化中,可以使用內嵌、合并判斷語句來減少判斷次數或用邏輯指令替代判斷的方法盡可能的消除中斷流水線指令帶來的影響。

(4)使用字或雙字存取和計算

C64xx系列DSP是32位CPU,當16位數據在內存中連續存放時,可利用uint_amem4(void*ptr)或double & _amemd8 (void*ptr)指令進行字或雙字數據的讀取或存貯。這樣每次可同時存取2個或4個16位數據,由于從內存執行取數操作需要4個delay,所以減少存取次數可以節省大量的時鐘同期;同時,可利用C64xx指令集中特有的打包指令_pack2(unsigned a,unsigned b),_packh2(unsigned a,unsigned b)等將兩個16位數打包成一個32位數,在進行乘、加計算時則利用_add 2(int a,int b)、_mpy2(int a,int b)同時完成兩組16位數的加法和乘法,效率比單純16位數的加法和乘法提高一倍。

3.3匯編編程的優化

線性匯編是TI提供的一種匯編語言,其指令系統和匯編語言的指令系統完全相同,但在編寫時不需要指定寄存器和操作單元,也不需要考慮延時的問題,因此編寫線性匯編相對要容易一些。

經過以上的優化后,音頻編碼程序在DM642上的運行狀況有了很大改善,但是經測試仍然沒有到達可以接收的程度,而高級語言的效率幾乎發揮到了極致,所以在具體分析耗時大的模塊特點后,采用線性匯編語言重新編寫C代碼的低效率段程序,迸一步提高程序的執行效率。

在編寫線性匯編優化代碼的過程中,為了提高代碼執行效率,我們需要遵循以下原則:

(1)寫并行代碼:通過使用匯編指令并行執行的方法減少循環內的執行周期數,優化線性匯編代碼。這里的關鍵問題是弄清指令相關性,只有不相關的指令才能并行執行。辨別指令是否相關.可以使用相關圖。

(2)處理跳轉指令和轉移指令:匯編程序的一大特點就是頻繁地跳轉,當滿足不同的條件時,要求程序進行不同的操作,或跳到相應的位置。對于“大于”、“大于等于”、“小于”、“小于等于”等較為接近的邏輯判斷和處理,應慎重對待,否則將產生邏輯性錯誤,并且很難調試。當發生溢出需進行相應處理時,這種現象尤為突出。

(3)盡量減少循環體內的指令數[7]:G.72.1的算法實現,有許多是在循環內部完成的,有些地方如同定碼本搜索過程中,為了確定四個非0脈沖的位置和幅度,還用到了多重循環。在循環內部,特別是在嵌套較深的循環內部,減少一條指令可以大大降低程序的操作次數。例如。對于一個每重循環8次的四重嵌套循環,在最內層循環每減少一條指令,整個程序可以少執行84=4096語句。因此在設計程序時,能夠放在循環體外執行的語句.盡量放在循環體外執行。

(4)展開程序體:盡在一定條件下,盡量展開程序,以減少子程序的調用和返回次數,犧牲空問換取時間。

經匯編優化器優化后,代碼效率比C語言直接編譯有明顯提高。

4 優化工作的創新點

在對G.723.1的優化中.本文在前人研究成果的基礎上,針對DSP C64xx系列芯片提}n了一些有價值的新方法。這些創新點在不同程度上提高了代碼的優化速度和執行效率,在語音編解碼的DSP實時實現中起到了關鍵性作用。下面,本文將以舉例的方式闡明一些經典的方法。

(1)編寫連接命令文件.cmd

明確了系統的程序和數據映射地址后,編寫連接器命令文件將部分調用次數較多的函數、堆棧段、數據段放入內存:cmd文件內容如下:

一L\evmdm642_echocfg.cmd //連接CCS提供的連接命令文件

SECTIONS

{

.tahles>SDRAM

.cinit>ISRAM?? //將變量初值表放入內存

. far >SDRAM

.const>ISRAM //將常數段放入內存

.pinit>SDRAM

. tin >SDRAM

.text>SDRAM

.test >ISRAM

}

一levmdm642bsl.lib //連接庫文件

一levmdm642_edma_aic23.164??? //連接驅動程序的庫文件

一lc6xlx_edma_mcasp.J64?? //連接串口McASP的庫文件

其中.test是筆者在C程序內用#pragma CODE_SECTION或DATA_SECTION自定義的段。

(2)高速緩沖寄存器Cache的使用

Cache即高速緩存,是位于CPU和片內存儲器之間的規模小速度快的存儲器。Cache的工作原理是保存CPU中最常用的數據。當Cache中保存著CPU要讀寫的數據時,CPU直接訪問Cache。由于Cache的速度與CPU相當,CPU能在零等待狀態下迅速地實現數據存取。只有在Cache中不舍有CPU所需的數據時CPU才去訪問片內存儲器。因此Cache的有效利用對整個程序速度的提高有著舉足輕重的作用。在主函數中加入以下代碼,使Cache使能:

CACHE_clean? (CACHE_L2ALL,0,0};? //清除Cache內原有內容

CACHE_setL2Mode? (CACHE_64KCACHE);? //設置Cache的大小為64K

CACHE_enableCaching? (CACHE_EMIFA_CE00);? //Cache使能

添加以上代瑪后,測試速度由原來的20幀/s提高到了400幀/s。提高了將近20倍。

5 結束語

本文詳緇分紹了G.723.1標準的DSP代碼優化工作,重點描述了代碼優化的方法和本課題的創新點.對于算法中的一些函數提出了獨創性改寫方法。基于線性匯編的優化以及Cache的有效利用使本課題的工作取得了顯著成果,在沒有降低音質的情況下,實現了DSP的語音實時編解碼。

本文作者創新點:在對G.723.1的優化中,針對TMS320DM 642 DSP系列芯片提出了一些有價值的新方法。例如:編寫連接命令文件.cmd和高速緩沖寄存器Cache的使用。這些創新點在不同程度上提高了代碼的優化速度和執行效率,在語音編解碼的DSP實時實現中起到了關鍵性作用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529475.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

四川大學 設計專業 C語言必修,四川大學C語言2001年真題_跨考網

一、單項選擇題(在每小題的四個備選答案中&#xff0c;選出一個正確的答案&#xff0c;并將其號碼寫在答題紙上。請注意注明題號。每小題1分&#xff0c;共計6分)1、‘\t’表示什么?①字符串常數②標識符③變量④字符常量答案&#xff1a;④2、對宏定義不正確的描述是哪一個?…

大整數乘法c語言數組,很大的數相乘怎么辦?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include&nbsp #include&nbsp using&nbsp namespace&nbsp std;int&nbsp main(int&nbsp argc,&nbsp char&nbsp *argv[]){&nbsp &nbsp&nbsp &nbsp long&nbsp i,j, c,l…

血型遺傳關系c語言編程,根據血型遺傳關系,編程實現:○1.輸入

滿意答案df4dfw5e562017.05.28采納率&#xff1a;51% 等級&#xff1a;6已幫助&#xff1a;106人//僅作參考#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "string.h"int studentNum 0;#define MAXSTUDENT (1…

linux tcb,在Linux中從潛藏密碼遷移至tcb怎么做?

潛藏密碼作為Linux產品的既定事實標準已經有好多年了&#xff0c;md5密碼的運用亦是如此。但是&#xff0c;運用傳統的潛藏密碼要領也有不足之處&#xff0c;甚至md5也不像以前那么安全了。潛藏密碼文件的一個缺點就是&#xff0c;任意一個須要查詢個別潛藏密碼(如您的密碼)的使…

android 通話結束廣播,在Android中以編程方式結束通話

侃侃爾雅您無需成為系統應用程序。首先&#xff0c;com.android.internal.telephony在您的項目中創建包&#xff0c;并將其放入名為“ ITelephony.aidl” 的文件中&#xff1a;package com.android.internal.telephony; interface ITelephony { boolean endCall(); vo…

android url 快捷方式,Android向桌面添加快捷方式,使其指向特定的(URL)網頁

/** 在桌面添加快捷方式* param icon 快捷方式圖標* param name 快捷方式名稱* param uri 快捷方式的intent Uri*/public void addShortcut(Parcelable icon, String name, Uri uri){Intent intentAddShortcut new Intent(ACTION_ADD_S…

帶nfc 的 android 華為,華為手機NFC功能,原來這么好用,不會用真可惜幾千塊錢了...

華為手機NFC功能&#xff0c;原來這么好用&#xff0c;不會用真可惜幾千塊錢了2019-05-06 17:40:259點贊12收藏6評論華為手機在國內也是數一數二的了&#xff0c;那么用華為手機的小伙伴&#xff0c;怎么能錯過華為手機中NFC的功能呢&#xff1f;下面就隨小編一起來了解一下吧。…

android adb apk包名,ADB命令簡單使用--查看包名、activity等

1、連接設備adb connect ip2、查看連接的設備adb devices3、安裝/卸載Android 應用adb install packagesnameadb uninstall packagesname4、查看設備安裝包名adb shell pm list packages5、查看安裝包的路勁adb shell pm path packagename6、包pull到本地adb shell pull 包路徑…

小米3升級android 6.0,可升級Android 6.0機型一覽 小米手機亮了

前不久&#xff0c;Android M被谷歌正式確定為6.0系統&#xff0c;代號Marshmallow&#xff0c;預計年底前發布。而對于普通用戶來說&#xff0c;最關心的就是自己的手機能不能升級。不過別著急&#xff0c;在此之前&#xff0c;我們不妨看看Android 6.0有哪些新功能。一、Andr…

android 開發人員模式,Android

選取月份2021 年 5 月 (9)2021 年 4 月 (11)2021 年 3 月 (7)2021 年 2 月 (7)2021 年 1 月 (7)2020 年 12 月 (10)2020 年 11 月 (8)2020 年 10 月 (8)2020 年 9 月 (6)2020 年 8 月 (7)2020 年 7 月 (12)2020 年 6 月 (10)2020 年 5 月 (14)2020 年 4 月 (10)2…

安裝華為鴻蒙,魅族選擇與鴻蒙合作,華為這下要成了?

嚯&#xff0c;咱們的魅族可真爭氣&#xff01;眼看華為6月2日的大新聞箭在弦上蓄勢待發&#xff0c;一句“你好&#xff0c;鴻蒙”的問候&#xff0c;瞬間引爆了微博&#xff1a;具體有多熱鬧&#xff0c;你們瞧瞧這轉發和點贊&#xff1a;眾所周知&#xff0c;華為鴻蒙自從公…

瀏覽器兼容性怎么設置HTML,ie10瀏覽器中兼容性設置在哪里

之前ie瀏覽器一直被詬病的因素之一就是兼容性&#xff0c;不過ie10瀏覽器可以對兼容性進行設置&#xff0c;使得在兼容性視圖中顯示所有網站&#xff0c;具體怎么設置呢。下面由學習啦小編為你整理了ie10瀏覽器兼容性設置在哪里的解決方法&#xff0c;希望對你有幫助!ie10兼容性…

如何查詢高考成績2021年的成績排位,2020年高考成績排名怎么查,高考成績排名是怎么排的...

一、2020年高考成績排名怎么查考生查詢自己的排名&#xff0c;首先要在本省教育信息網查詢自己的高考分數&#xff0c;再查找該分數對應高考年份的一分一段表&#xff0c;在表中可以查到自己的名次&#xff0c;注意不要搞錯文理。二、什么是“一分一段表”它顯示每一個分數全省…

ksu7對講機調頻軟件_科普 | 數字對講機的群呼功能原理是什么?你了解多少?...

點擊上方藍字關注我們&#xff01;無線對講機群呼&#xff0c;是為了更好地達到1個數字對講機能夠同一時間跟多個數字對講機實現語音通話。群呼跟單呼有很多共同之處&#xff0c;下面我們和大家來說說數字對講機群呼與單呼不同點。當1個數字對講機處在待機狀態的情況下機要發動…

計算機學不學工程制圖,大一,馬上要考試了,不想再學工程制圖了?

買買提烤串累計幫助了195人工科和文科思維方式是不一樣的。本人剛好高中理科&#xff0c;大學學文的&#xff0c;而且一專業是中文&#xff0c;二專業管理。大多數工科的特點是靠努力為主的&#xff0c;除了特別難的那種專業&#xff0c;大多數工科的特點是這樣的&#xff1a;除…

輔助駕駛等級_雙AMR電機位置傳感器,助力自動駕駛安全出行

好文章當然要分享啦~如果您喜歡這篇文章&#xff0c;請聯系后臺添加白名單&#xff0c;歡迎轉載喲~在自動駕駛汽車快速發展的今天&#xff0c;汽車電氣化趨勢逐漸朝著半自動駕駛和全自動駕駛發展&#xff0c;尤其是&#xff0c;為了讓電子轉向助力(EPS)和電子制動系統滿足必要的…

計算機怎么建立共享網絡打印機共享,電腦如何連接局域網中的共享打印機—兩種方法...

多臺電腦而只有一臺打印機的時候可以通過連接局域網的方式共享打印機&#xff0c;這樣就不需要給每一臺電腦都配上打印機了。下面是學習啦小編收集整理的電腦如何連接局域網中的共享打印機—兩種方法&#xff0c;希望對大家有幫助~~電腦連接局域網中的共享打印機—兩種方法操作…

python判斷字符串結尾-字符串#69301_27種Python字符串操作方法大全

1、去空格及特殊符號代碼如下:s.strip().lstrip().rstrip(,)2、復制字符串代碼如下:#strcpy(sStr1,sStr2)sStr1 strcpysStr2 sStr1sStr1 strcpy2print sStr23、連接字符串代碼如下:#strcat(sStr1,sStr2)sStr1 strcatsStr2 appendsStr1 sStr2print sStr14、查找字符代碼如…

html5 密碼框明文,elementUI的密碼框的密文和明文

基于elementui 框架的登錄時密碼框的明文和密文登錄1、templatev-model.trim"ruleForm.password"placeholder"請輸入密碼":type"passw"clearableblur"onBlur">2、scriptdata(){return{icon: "el-input__icon el-icon-view&quo…

1個顯示器分割2畫面_我家房子100㎡,原始設計有2個衛生間,糾結保留1個還是2個...

100平米左右的新房裝修&#xff0c;設計布局最糾結。尤其是&#xff0c;面積本來就是中等、不大的戶型&#xff0c;開發商還給配了2個衛生間。一個主衛&#xff0c;一個客衛。那么問題來了&#xff1a;對于主臥衛生間&#xff0c;我到底是保留還是改成其他的用途&#xff1f;只…