<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > G.723.1語(yǔ)音編碼算法的DSP實(shí)現方案

G.723.1語(yǔ)音編碼算法的DSP實(shí)現方案

作者: 時(shí)間:2012-05-14 來(lái)源:網(wǎng)絡(luò ) 收藏

隨著(zhù)通信、計算機網(wǎng)絡(luò )等技術(shù)的飛速發(fā)展,日益增加的客戶(hù)需求量和現有的通信信道容量之間的矛盾愈發(fā)突出。如何在有限的信道資源下,通過(guò)壓縮信源以提高傳輸效率已成為當前急需解決的問(wèn)題之一。為此誕生了許多語(yǔ)音壓縮處理方法,G.723.1便是ITU-T(國際電信聯(lián)盟電信標準化部門(mén))制定的H.324協(xié)議簇首推的標準,主要用于低比特率多媒體業(yè)務(wù)的話(huà)音或其他音頻信號分量的壓縮。它是一種雙速率標準,其中6.3 kb/s的速率提供了良好的話(huà)音質(zhì)量,而5.3kb/s的速率在提供較好通話(huà)質(zhì)量的同時(shí),也為系統設計者提供了更適合的靈活性[1]。
1 原理
G.723.1算法按幀(Frame)對語(yǔ)音數據進(jìn)行壓縮和解壓縮,每幀240個(gè)采樣點(diǎn),壓縮傳遞的參數包括線(xiàn)性預測系數、自適應碼本的延時(shí)和增益、激勵脈沖位置、符號及格點(diǎn)比特等。
  首先進(jìn)行高通濾波,去掉直流分量;接著(zhù)把一幀信號分成4個(gè)子幀,每個(gè)子幀60個(gè)采樣點(diǎn),分別進(jìn)行10階線(xiàn)性預測分析(LPC),得到各子幀的LPC參數,把最后一個(gè)子幀的LPC參數轉化成線(xiàn)譜對(LSP)參數進(jìn)行矢量量化編碼,送到解碼器。利用未量化的LPC參數構造短時(shí)感知加權濾波器,信號濾波后得到感覺(jué)加權的語(yǔ)音信號。每2個(gè)子幀(120樣點(diǎn))搜索一個(gè)開(kāi)環(huán)基音值,并以此為依據為每一個(gè)子幀構造一個(gè)諧波噪聲成形濾波器,對感知加權的語(yǔ)音信號進(jìn)行濾波。每一子幀的LPC綜合濾波器、感覺(jué)加權濾波器和諧波噪聲成形濾波器聯(lián)起來(lái),構成一個(gè)聯(lián)合濾波器,利用它的沖激響應和開(kāi)環(huán)基音周期,對每一子幀進(jìn)行閉環(huán)基音搜索,對開(kāi)環(huán)搜索的結果進(jìn)行修正。同時(shí)通過(guò)一個(gè)五階基音預測器對信號進(jìn)行預測,得到相應子幀的殘差信號。最后進(jìn)行固定碼本搜索,也就是對每一子幀的殘差信號進(jìn)行矢量量化,對應兩種不同的編碼速率采用兩種不同的方法:編碼速率為6.3kb/s時(shí),采用多脈沖最大似然量化(MP-MLQ)的方法,具有較高的重建語(yǔ)音質(zhì)量;編碼速率為5.3kb/d時(shí),采用代數碼本激勵線(xiàn)性預測(ACELP)方法。
  算法的解碼也是按幀進(jìn)行,主要對符合ITU-TG.723.1的碼流進(jìn)行解碼,得到相應的參數,根據語(yǔ)音產(chǎn)生的機理,合成語(yǔ)音信號。讀入一幀碼流后,分別進(jìn)行LSP參數、基音周期和激勵脈沖信號解碼,對LSP參數插值,然后轉化成各子幀的線(xiàn)性預測系數,構成LPC綜合濾波器。通過(guò)基音周期和激勵脈沖得到每一子幀的殘差信號,經(jīng)過(guò)基音后濾波,輸入到LPC綜合濾波器,產(chǎn)生合成語(yǔ)音信號。經(jīng)過(guò)共振峰后濾波和增益控制,形成高質(zhì)量的重建語(yǔ)音信號。
2 算法實(shí)現
2.1 硬件設計
  在選擇芯片時(shí),考慮了語(yǔ)音壓縮編碼算法的復雜度以及運算量,并對DPS芯片本身的運算能力、存儲空間大小、性能價(jià)格比、開(kāi)發(fā)軟件的完整性等多方面進(jìn)行綜合比較,最終選用TIC54xx系列的定點(diǎn)運算處理器TMS320C5416,開(kāi)發(fā)平臺是TMS320C5416 DSK。
  TMS320C5416的單指令周期為6.25ms,每秒執行的指令數為160M,使用了6級指令流水線(xiàn)結構,這些都很適合G.723.1語(yǔ)音編碼算法的實(shí)現。采用一個(gè)40 bitALU、128K×16 bit片內RAM(包括64 kB的片內DARAM和64 KB的片內SARAM)、3個(gè)獨立的16bit數據內存總線(xiàn)、1個(gè)程序內存總線(xiàn)、3個(gè)McBSP、6信道DMA控制器、1個(gè)8/16 bit并行增強主機端口接口及2個(gè)16 bit計時(shí)器[2,3]。
  在DSK的基礎上,可以搭建出語(yǔ)音開(kāi)發(fā)硬件系統平臺,如圖1所示。

本文引用地址:http://dyxdggzs.com/article/257516.htm

  輸入語(yǔ)音信號由麥克風(fēng)輸入,經(jīng)過(guò)立體聲音頻多媒體數字信號編碼芯片PCM3002 A/D轉換后成為數字信號,接著(zhù)送入內進(jìn)行編碼壓縮處理。處理后的數據經(jīng)過(guò)解壓得到重建的語(yǔ)音信號,最后送入PCM3002 D/A轉換為模擬信號,通過(guò)耳機或揚聲器得以收聽(tīng)到。
2.2 算法實(shí)現流程
  根據G.723.1算法,設計實(shí)現流程如圖2所示。


  從流程圖中可以看到,首先關(guān)閉中斷、初始化芯片和開(kāi)發(fā)平臺;然后進(jìn)行程序運行前的硬件配置,主要是配置外設,打開(kāi)DMA和McBSP。配置結束后打開(kāi)中斷屏蔽控制寄存器,等待中斷的到來(lái)。McBSP接收中斷發(fā)生時(shí),DMA接收PCM3002發(fā)來(lái)的數據并存入緩沖區,并判斷是否滿(mǎn)一幀240個(gè)數據。如果不滿(mǎn)幀,就直接等待下一次McBSP接收中斷;如果滿(mǎn)一幀,通過(guò)DMA通道3將240個(gè)語(yǔ)音數據復制到緩沖區BUFF1,同時(shí)置位新幀標志位new_data,然后對數據進(jìn)行編解碼處理。整個(gè)編解碼結束后,將得到的一幀240個(gè)合成語(yǔ)音數據復制到緩沖區BUFF2中,等待新幀標志位重新置1后進(jìn)行下一幀的編解碼處理。McBSP發(fā)送中斷時(shí),DMA把發(fā)送緩沖區的一個(gè)數據發(fā)送給PCM3002后,判斷是否滿(mǎn)一幀。如果不滿(mǎn)幀,就直接等到下一次McBSP發(fā)送中斷;如果滿(mǎn)一幀,即PCM3002接收到了240個(gè)數據,則把BUFF2中新一幀240個(gè)合成語(yǔ)音數據復制到發(fā)送緩沖區,等待下一次McBSP發(fā)送中斷。
2.3 DSP/BIOS的配置
  將成功實(shí)現的算法移植到TI公司提供的TMS320C5416上,采用DSP/BIOS技術(shù)編程實(shí)現。DSP/BIOS配置工具主要是設置DSP/BIOS各個(gè)模塊的參數和創(chuàng )建API調用對象[4]。用DSP/BIOS配置工具,對象可以被預先創(chuàng )建和設置,使用這種方法創(chuàng )建靜態(tài)對象,不僅可以合理利用內存空間、減小代碼長(cháng)度、優(yōu)化數據結構,還有利于程序編譯前通過(guò)驗證對象的屬性預先發(fā)現錯誤。
3 程序優(yōu)化
  實(shí)時(shí)實(shí)現語(yǔ)音信號的編解碼最基本的要求是編解一幀語(yǔ)音信號的時(shí)間要少于采集一幀語(yǔ)音信號的時(shí)間,即要求G.723.1的一幀語(yǔ)音編解碼時(shí)間要少于30ms。對G.723.1標準算法進(jìn)行時(shí)間評估時(shí)發(fā)現,一幀的運算量大概需要49 M個(gè)時(shí)鐘周期,約為300 ms,這顯然無(wú)法在TMS320C5416DSP上實(shí)時(shí)運行。因此有必要從多方面進(jìn)行優(yōu)化。
3.1 循環(huán)優(yōu)化
  G.723.1實(shí)現中的很多運算是在循環(huán)內完成的,在循環(huán)內部特別是嵌套較深的循環(huán)內部,減少一條指令可以大大降低程序的操作次數。固定碼本搜索中為了確定四個(gè)脈沖的位置和幅度,用到了四重嵌套循環(huán),每重循環(huán)8次,在最內層循環(huán)減少一條指令,整個(gè)程序就減少84=4096條指令。因此在G.723.1的實(shí)現過(guò)程中,盡量將內層循環(huán)的指令搬移到外層,外層循環(huán)的指令搬移到整個(gè)循環(huán)體外,從而縮短程序執行時(shí)間,滿(mǎn)足實(shí)時(shí)性的要求。
  此外,適當選擇循環(huán)指令,如RPT(重復下條指令),RPTZ(累加器清零并重復下條指令)和RPTB(塊重復指令)等,也能縮短循環(huán)時(shí)間。如RPT允許重復執行緊隨其后的一條指令,由于要重復的指令只需要取指一次,與利用跳轉指令BANZ進(jìn)行循環(huán)相比,效率要高得多。特別是對于乘累加和數據傳送多周期指令(MAC、MVDK 和MVPD等),在執行一次之后就變成了單周期指令,大大提高了執行效率。
3.2 使用內聯(lián)函數
  CCS提供的內聯(lián)函數集中有一些常用的基本運算函數,如加、飽和加、減、飽和減、長(cháng)數乘等。這些函數可以很方便地被調用,就像調用C函數一樣,只要在函數名前加一個(gè)“_”,例如_L_SUB(a,b)。這些內聯(lián)函數是用匯編語(yǔ)句編寫(xiě)的,編譯時(shí)C編譯器將這些內聯(lián)函數用對應的匯編語(yǔ)句代替,所以執行效率很高。在程序的開(kāi)始部分頭文件中,用#include“intrindefs.h”,代替#include“basic.h”,就是把文件“basic.c”從工程中去掉,從而實(shí)現對“basic.c”中許多基本運算函數的優(yōu)化,提高了執行效率。
3.3 使用宏定義
  在G.723.1標準的定點(diǎn)C程序中,所有基本運算都以調用子函數的形式執行。這樣做對程序的規范化設計有好處,同時(shí)也在很大程度上降低了程序的運算效率。將基本運算由子函數調用改為宏定義可以去掉函數調用的開(kāi)銷(xiāo),加快運算速度,程序的運算效率明顯提高。這種優(yōu)化方式會(huì )帶來(lái)代碼量的增大,但還是在芯片存儲空間的容許范圍內。
3.4 合理使用流水線(xiàn)操作
  C54芯片具有6級深度的流水線(xiàn),可以完成預取指、取指、譯碼、產(chǎn)生操作數地址、讀取操作數和執行等6個(gè)操作,這就出現了指令的重疊。然而CPU總線(xiàn)、寄存器資源是有限的,當不同級別的流水線(xiàn)試圖利用同一條總線(xiàn)或訪(fǎng)問(wèn)同一資源時(shí),就可能發(fā)生時(shí)序上的沖突。如果流水線(xiàn)沖突,CPU自動(dòng)通過(guò)指令延遲的方法解決,有些沖突指令延遲后可以避免,有些則不能避免,需要在指令中間加入NOP空指令才能解決。但這樣消耗了額外的時(shí)鐘周期。重新安排指令順序有時(shí)可以避免沖突,提高程序執行效率,尤其是當NOP指令在循環(huán)內部時(shí),可以節省不少的開(kāi)銷(xiāo)。分析程序編譯后生成的匯編語(yǔ)言程序,觀(guān)察分析是否可以進(jìn)行優(yōu)化??梢杂脛?chuàng )建相關(guān)圖,重新分配運算單元和寄存器、創(chuàng )建排序表重新調整指令順序等方法去掉NOP指令,同時(shí)避免流水線(xiàn)沖突。
3.5 優(yōu)化效果
  G.723.1語(yǔ)音編解碼程序經(jīng)過(guò)優(yōu)化保證了該算法在DSP中的實(shí)時(shí)實(shí)現。G.723.1協(xié)議幀長(cháng)30 ms,另外有7.5 ms的前瞻,故總幀長(cháng)為37.5ms。在硬件仿真模式下對整個(gè)程序運行進(jìn)行測試,結果表明,一幀語(yǔ)音信號的編解碼在5.3 kb/s模式下需要3 402 338clocks,約20.3 ms;在6.3 kb/s模式下需要5 134 901 clocks,約22.83 ms,均低于算法要求的30ms,在TMS320VC5416上最終完成了G.723.1標準的實(shí)時(shí)實(shí)現。其中各主要模塊和主要代碼段在優(yōu)化前后占用周期和空間的對比分別如表1和表2所示。


  信噪比是衡量語(yǔ)音編解碼質(zhì)量的客觀(guān)標準,計算時(shí)常用長(cháng)時(shí)信噪比和短時(shí)(分段)信噪比兩種準則。短時(shí)(分段)信噪比采用分段(通常是10ms~30ms)的方法來(lái)分別計算每一段語(yǔ)音信號的信噪比,因此很適合反映量化器對不同電平輸入段的量化質(zhì)量。本文采用短時(shí)(分段)信噪比作為衡量標準。
  設每段有N個(gè)語(yǔ)音采樣點(diǎn),則第m段的分段信噪比定義為:
  
x(n)是原始信號,y(n)是輸出信號,N是幀長(cháng),M是幀的總數。
  本文對G.723.1標準進(jìn)行測試,就圖3所示語(yǔ)音信號計算其短時(shí)信噪比。圖中總幀數150幀,幀長(cháng)為240個(gè)采樣點(diǎn),按照上式計算SNR=13.56dB。因此可知G.723.1有較高的短時(shí)信噪比,語(yǔ)音編解碼質(zhì)量較好,得到的語(yǔ)音信號比較清晰。




關(guān)鍵詞: DSP 語(yǔ)音編碼 算法

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>