新聞中心

EEPW首頁 > 消費電子 > 設計應用 > 嵌入式音頻處理基礎(3)

嵌入式音頻處理基礎(3)

—— Fundamentals of Embedded Audio Processing (Part 3)
作者:David Katz, Rick Gentile ,Tomasz Lukasiak 時間:2008-11-28 來源:電子產(chǎn)品世界 收藏

  在本文的第三部分中,我們將介紹開發(fā)嵌入式應用的一些策略。我們將從描述處理中使用的一些標準方法開始,然后討論一些基本的算法。

本文引用地址:http://m.butianyuan.cn/article/89892.htm

音頻處理方法

把數(shù)據(jù)送入處理器內(nèi)核

  把數(shù)據(jù)送入處理器內(nèi)核有若干種方法。例如,一個前臺程序可以對一個串行端口中的新數(shù)據(jù)進行查詢,但這種傳輸方式在嵌入式媒體處理器中是不常用的,因為這樣會降低內(nèi)核的使用效率。

  取而代之的是,與音頻編解碼器相連的處理器一般用DMA引擎把數(shù)據(jù)從編解碼器的數(shù)據(jù)口(就像一個串行口)傳輸?shù)教幚砥骺捎玫哪硞€存儲空間內(nèi)。這種數(shù)據(jù)傳輸是以后臺操作的形式完成的,無需處理器內(nèi)核的干預。這里的唯一開銷是對DMA序列的設定以及一旦數(shù)據(jù)緩沖區(qū)的接收或發(fā)送完成之后對中斷的處理。

塊處理與樣點處理

  樣點處理和塊處理是處理數(shù)字音頻數(shù)據(jù)的兩種方法。在樣點處理的方法中,只要樣點一出現(xiàn),處理器就處理這個樣點。這里,在每個采樣周期中的處理操作都會有開銷。許多濾波器(例如FIR和IIR,將在下面敘述)是以這樣的方式實現(xiàn)的,因為這種方式的有效延遲會很低。

  另一方面,塊處理是基于把數(shù)據(jù)傳送到處理函數(shù)之前對特定長度緩沖區(qū)的填充。有些濾波器是用塊處理的方式實現(xiàn)的,因為這樣比樣點處理方式更有效。其中要說明的一點是,塊處理方法大大降低了針對每個樣點而調(diào)用處理函數(shù)的開銷。而且,許多嵌入式處理器包含有多個ALU, 可以對數(shù)據(jù)塊進行并行操作。另外,有些算法從本質(zhì)上就是以塊處理方式操作的。其中一個大家都知道的是傅里葉變換(以及它的實際使用的形式,快速傅里葉變換,或稱FFT),這種算法接受時域數(shù)據(jù)塊或空間域(spatial)數(shù)據(jù)塊,然后把這些數(shù)據(jù)塊轉(zhuǎn)換成頻域表示。

雙緩沖

  在基于塊處理的、使用DMA與處理器內(nèi)核進行數(shù)據(jù)傳遞的系統(tǒng)中,必須使用雙緩沖,以便在DMA傳輸和內(nèi)核之間進行仲裁。這會使處理器內(nèi)核和獨立于內(nèi)核的DMA引擎不會在同一時間對同一數(shù)據(jù)進行訪問,避免了數(shù)據(jù)一致性問題。為了對長度為N的緩沖區(qū)的處理進行改進,我們簡單地產(chǎn)生一個長度為2×N的緩沖區(qū)。對于一個雙向系統(tǒng),必須生成兩個長度為2×N的緩沖區(qū)。如圖1a中所示,處理器內(nèi)核正在對in1緩沖區(qū)進行處理,并將結(jié)果存儲在out1緩沖區(qū)中,而DMA引擎此時正在對in0進行填充,并對out0中的數(shù)據(jù)進行傳輸。圖1b指出,一旦DMA引擎完成對雙緩沖區(qū)左邊半個的操作之后,它就開始把數(shù)據(jù)傳送到in1,并從out1取出數(shù)據(jù),而此時的處理器內(nèi)核正在處理來自in0的數(shù)據(jù),并填入out0。這個結(jié)構(gòu)有時被稱為“乒乓式緩沖”,因為處理器內(nèi)核來回地對雙緩沖區(qū)的左右兩半進行處理。

  應該注意到,在實時系統(tǒng)中,串行端口的DMA(或者另一個與音頻采樣率關(guān)聯(lián)的外圍設備的DMA)規(guī)定了時序預算?;谶@個原因,塊處理算法必須以這樣的方式進行優(yōu)化,即它的執(zhí)行時間要小于或等于DMA對雙緩沖區(qū)的一半進行數(shù)據(jù)傳輸所需的時間。


圖1  用于流處理的雙緩沖結(jié)構(gòu)

二維(2D)DMA

  當數(shù)據(jù)通過像I2S這樣的數(shù)據(jù)鏈路傳輸時,它可能會包含多個聲道。這些聲道可以全是從一條數(shù)據(jù)線上通過復用而輸入到同一個串行端口的。在這種情況下,2D DMA可以用來對數(shù)據(jù)進行解交織,從而使每個聲道在存儲器中是線性分配的??梢钥匆幌聢D2中對這一安排的圖示,其中從左右聲道來的樣點被解復用到兩個分離的數(shù)據(jù)塊。這個自動數(shù)據(jù)安排對于那些使用塊處理的系統(tǒng)是極其有用的。


圖2  2D DMA引擎用于解交織  (a) I2S立體聲數(shù)據(jù)輸入 (b)分離的左右緩沖區(qū)

基本操作

  在音頻處理中有三個基本的構(gòu)建模塊。它們是加法操作、乘法操作和時間延遲。許多更復雜的效果和算法可以用這三個基本操作來實現(xiàn)。加法器顯而易見的任務是把兩個信號加在一起。乘法可以用于提升或衰減音頻信號。在大多數(shù)媒體處理器中,可以在一個周期內(nèi)完成多次加法和乘法操作。

  時間延遲有點復雜。在許多音頻算法中,當前的輸出取決于過去的輸入和輸出之間的組合。這種延遲效果是用延遲線實現(xiàn)的,而延遲線只不過是存儲器中用來保持過去數(shù)據(jù)的一個數(shù)組。例如,一個回聲算法可以對每個聲道保持500 mS的輸入樣點。當前輸出值可以用當前輸入值與稍微衰減的過去樣點進行相加后得到。如果音頻系統(tǒng)是基于樣點的處理方式,那么程序設計人員可以簡單地跟蹤一個輸入指針和一個輸出指針(兩者之間保持500 mS樣點數(shù)的間隔),并且在每個采樣周期之后增加這兩個指針。

  由于延遲線要被隨后的各組數(shù)據(jù)重復使用,因此,輸入與輸出指針將需要從延遲線緩沖區(qū)的末尾回繞到起始端。在C/C++中,這通常是在指針增加操作時再附帶一次求模操作(%)完成的。

  對于那些支持循環(huán)緩沖(見圖3)的處理器來說,這個回繞操作不會增加額外的處理周期。在這種情況下,一個循環(huán)緩沖區(qū)的起始位置和長度必須只提供一次。在處理過程中,軟件增加或減少緩沖區(qū)內(nèi)的當前指針,如果當前的指針位置落在緩沖區(qū)的兩個端點之外,則由硬件使指針回繞到緩沖區(qū)的起始位置。如果沒有這個自動地址生成功能,程序設計人員就必須手動地保持對緩沖區(qū)的跟蹤,因而會浪費有用的處理周期。


圖3 (a) 使用循環(huán)緩沖區(qū)的延遲線的圖示 (b) 循環(huán)緩沖區(qū)在存儲器中的布局

  由延遲線結(jié)構(gòu)可以引出一個叫做梳狀濾波器的重要的音頻構(gòu)建模塊,它本質(zhì)上是一個帶有反饋的延遲線。當多個梳狀濾波器同時使用的時候,可以產(chǎn)生混響的效果。

信號的產(chǎn)生

  在有些音頻系統(tǒng)中,也許需要合成一個信號(例如一個正弦波)。泰勒級數(shù)的函數(shù)近似法可以用來對三角函數(shù)進行仿真。而且,用均勻隨機數(shù)發(fā)生器來產(chǎn)生白噪聲是很容易的。

  但是,合成的方法也許并不適用于某些給定系統(tǒng)的處理預算。在具有充足存儲器的定點系統(tǒng)中,您可以取而代之地使用查表的方法來產(chǎn)生信號。這樣做的負面效應是占用了寶貴的存儲器資源,所以,作為一種折衷考慮,可以使用混合的方法。例如,您可以存儲一個不太精細的函數(shù)表,以節(jié)省存儲器。在運行時,準確的值可以用插值的方法從函數(shù)表中提取出來,而插值操作比使用泰勒級數(shù)近似法的時間大為縮短。這個混合法提供了在計算時間和存儲器資源之間的很好的平衡。

濾波與算法

  音頻系統(tǒng)中的數(shù)字濾波器被用來對指定頻帶內(nèi)的聲波能量進行衰減或提升。最常用的濾波器形式是高通、低通、帶通和點阻。這些濾波器中的任何一種都有兩種實現(xiàn)方法。這就是有限沖擊響應(FIR)濾波器和無限沖擊響應(IIR)濾波器,而且它們組成了搭建像參數(shù)均衡器和圖示均衡器那樣更復雜的濾波算法的構(gòu)建模塊。

有限沖擊響應(FIR)濾波器

  FIR濾波器的輸出是由當前和過去輸入之和確定的,而其中的每個輸入樣點首先要乘以一個濾波器系數(shù)。示于圖4a中的FIR求和公式,也叫做“卷積”,是信號處理中最重要的操作之一。在這個公式的句法中,x為輸入向量,y為輸出向量,而h為濾波器系數(shù)。圖4a表示了FIR的實現(xiàn)結(jié)構(gòu)圖。

  卷積是在媒體處理中非常常用的操作,因而許多處理器都可以在一個周期內(nèi)完成一條乘累加(MAC)指令,同時還可以完成多個數(shù)據(jù)的訪問操作(讀或?qū)?。


圖4 (a)FIR濾波器的公式和結(jié)構(gòu)  (b) IIR濾波器的公式和結(jié)構(gòu)

無限沖擊響應(IIR)濾波器

  與輸出僅僅取決于輸入的FIR濾波器不同,IIR濾波器則依靠輸入和過去的輸出。IIR濾波器的基本公式是一個差分方程,如圖4b所示。由于當前輸出對于過去輸出的依從關(guān)系,IIR濾波器經(jīng)常被稱為“遞歸式濾波器”。圖4b也給出了IIR濾波器結(jié)構(gòu)的圖示。

快速傅里葉變換

  我們往往可以更好地描述音頻信號的特性,那就是用頻率組成。傅里葉變換以時域信號作為輸入,并把信號重新安排到頻域里,而傅里葉反變換則完成逆向的工作,把頻域表示變換回時域。從數(shù)學上看,時域中的操作與頻域中的操作之間存在一些很妙的特性關(guān)系。特別是,時域卷積(或者FIR濾波器)等效于頻域的相乘。如果沒有傅里葉變換這個特別的優(yōu)化方法,即快速傅里葉變換(FFT),那么這個信號處理中的珍品就不可能變?yōu)閷嵱谩J聦嵣?,F(xiàn)IR濾波器往往有更高效的實現(xiàn)方法,那就是把輸入信號和濾波器系數(shù)用FFT變換到頻域,然后將兩個變換式相乘,最后再用傅里葉反變換把乘積變換回時域。

  在音頻處理中還經(jīng)常使用其他一些變換。其中包括最常用的修正離散余弦變換(MDCT),這是許多音頻壓縮算法的基礎。

采樣率轉(zhuǎn)換

  有時您會需要把信號的采樣率轉(zhuǎn)換到另一個不同的采樣率。用到變采樣率的一個情況是,您需要對一個以8 kHz采樣的音頻信號進行解碼,但是您使用的DAC并不支持這個采樣率。另一個情況是,當一個信號被過采樣之后,需要轉(zhuǎn)換成一個較低的頻率,因而可以縮短計算時間。把信號從一個采樣率變換到另一個采樣率的過程叫做變采樣率(或SRC)。

  提高采樣率的方法叫做插值,而降低采樣率的方法叫做抽取。對信號進行M倍抽取是通過只保留每個M樣點而拋棄所有其余的樣點來完成的。對信號進行L倍插值是通過對原來信號的每兩個樣點之間補充L-1個零來完成的。

  雖然插值和抽取的因子都是整數(shù),但您可以對輸入信號接連使用插值和抽取而得到一個有理數(shù)的變換因子。當您用5倍進行上采樣,然后用3倍作下采樣,那么最后的因子為5/3 = 1.67。


圖5  通過上采樣和下采樣的采樣率轉(zhuǎn)換

  老實說,我們有點過分地簡化了SRC的過程。為了避免對信號補零(補零會引起頻域的鏡像成分)而引起的人工痕跡,被插值的信號在當作輸出或當作抽取器的輸入而被使用之前,必須經(jīng)過低通濾波。通過使用一個知曉與L-1個插值樣點相對應的輸入都是零值的特定FIR濾波器結(jié)構(gòu),這個抗鏡像低通濾波器可以在輸入采樣率下進行,而不必在較快速率的輸出采樣率下進行。

  同樣,在被抽取之前,不符合Nyquest采樣定律的輸入信號必須被低通濾波,以避免混疊。使用知曉輸出樣點中那些被拋棄的樣點是不需要進行濾波計算的FIR濾波器結(jié)構(gòu),這個抗混疊低通濾波器可以設計成以抽取后采樣率進行操作,而不必在較快速的輸入采樣率下操作。圖5表示了變采樣率的流程圖。應該注意到,抗鏡像濾波器和抗混疊濾波器是可以合二為一的,以便節(jié)省計算量。

  顯然,對于這些嵌入式音頻的論題,我們僅僅能夠給出一個很表層的討論,但對于嵌入式音頻處理應用的開發(fā),我們還是希望已經(jīng)提供了一個有用的框架,并提到了其中各種必需考慮的問題。



關(guān)鍵詞: 音頻 200811

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉