嵌入式音頻處理基礎(chǔ)(3)
在本文的第三部分中,我們將介紹開(kāi)發(fā)嵌入式音頻應(yīng)用的一些策略。我們將從描述音頻處理中使用的一些標(biāo)準(zhǔn)方法開(kāi)始,然后討論一些基本的音頻算法。
本文引用地址:http://www.ex-cimer.com/article/89892.htm音頻處理方法
把數(shù)據(jù)送入處理器內(nèi)核
把數(shù)據(jù)送入處理器內(nèi)核有若干種方法。例如,一個(gè)前臺(tái)程序可以對(duì)一個(gè)串行端口中的新數(shù)據(jù)進(jìn)行查詢,但這種傳輸方式在嵌入式媒體處理器中是不常用的,因?yàn)檫@樣會(huì)降低內(nèi)核的使用效率。
取而代之的是,與音頻編解碼器相連的處理器一般用DMA引擎把數(shù)據(jù)從編解碼器的數(shù)據(jù)口(就像一個(gè)串行口)傳輸?shù)教幚砥骺捎玫哪硞€(gè)存儲(chǔ)空間內(nèi)。這種數(shù)據(jù)傳輸是以后臺(tái)操作的形式完成的,無(wú)需處理器內(nèi)核的干預(yù)。這里的唯一開(kāi)銷是對(duì)DMA序列的設(shè)定以及一旦數(shù)據(jù)緩沖區(qū)的接收或發(fā)送完成之后對(duì)中斷的處理。
塊處理與樣點(diǎn)處理
樣點(diǎn)處理和塊處理是處理數(shù)字音頻數(shù)據(jù)的兩種方法。在樣點(diǎn)處理的方法中,只要樣點(diǎn)一出現(xiàn),處理器就處理這個(gè)樣點(diǎn)。這里,在每個(gè)采樣周期中的處理操作都會(huì)有開(kāi)銷。許多濾波器(例如FIR和IIR,將在下面敘述)是以這樣的方式實(shí)現(xiàn)的,因?yàn)檫@種方式的有效延遲會(huì)很低。
另一方面,塊處理是基于把數(shù)據(jù)傳送到處理函數(shù)之前對(duì)特定長(zhǎng)度緩沖區(qū)的填充。有些濾波器是用塊處理的方式實(shí)現(xiàn)的,因?yàn)檫@樣比樣點(diǎn)處理方式更有效。其中要說(shuō)明的一點(diǎn)是,塊處理方法大大降低了針對(duì)每個(gè)樣點(diǎn)而調(diào)用處理函數(shù)的開(kāi)銷。而且,許多嵌入式處理器包含有多個(gè)ALU, 可以對(duì)數(shù)據(jù)塊進(jìn)行并行操作。另外,有些算法從本質(zhì)上就是以塊處理方式操作的。其中一個(gè)大家都知道的是傅里葉變換(以及它的實(shí)際使用的形式,快速傅里葉變換,或稱FFT),這種算法接受時(shí)域數(shù)據(jù)塊或空間域(spatial)數(shù)據(jù)塊,然后把這些數(shù)據(jù)塊轉(zhuǎn)換成頻域表示。
雙緩沖
在基于塊處理的、使用DMA與處理器內(nèi)核進(jìn)行數(shù)據(jù)傳遞的系統(tǒng)中,必須使用雙緩沖,以便在DMA傳輸和內(nèi)核之間進(jìn)行仲裁。這會(huì)使處理器內(nèi)核和獨(dú)立于內(nèi)核的DMA引擎不會(huì)在同一時(shí)間對(duì)同一數(shù)據(jù)進(jìn)行訪問(wèn),避免了數(shù)據(jù)一致性問(wèn)題。為了對(duì)長(zhǎng)度為N的緩沖區(qū)的處理進(jìn)行改進(jìn),我們簡(jiǎn)單地產(chǎn)生一個(gè)長(zhǎng)度為2×N的緩沖區(qū)。對(duì)于一個(gè)雙向系統(tǒng),必須生成兩個(gè)長(zhǎng)度為2×N的緩沖區(qū)。如圖1a中所示,處理器內(nèi)核正在對(duì)in1緩沖區(qū)進(jìn)行處理,并將結(jié)果存儲(chǔ)在out1緩沖區(qū)中,而DMA引擎此時(shí)正在對(duì)in0進(jìn)行填充,并對(duì)out0中的數(shù)據(jù)進(jìn)行傳輸。圖1b指出,一旦DMA引擎完成對(duì)雙緩沖區(qū)左邊半個(gè)的操作之后,它就開(kāi)始把數(shù)據(jù)傳送到in1,并從out1取出數(shù)據(jù),而此時(shí)的處理器內(nèi)核正在處理來(lái)自in0的數(shù)據(jù),并填入out0。這個(gè)結(jié)構(gòu)有時(shí)被稱為“乒乓式緩沖”,因?yàn)樘幚砥鲀?nèi)核來(lái)回地對(duì)雙緩沖區(qū)的左右兩半進(jìn)行處理。
應(yīng)該注意到,在實(shí)時(shí)系統(tǒng)中,串行端口的DMA(或者另一個(gè)與音頻采樣率關(guān)聯(lián)的外圍設(shè)備的DMA)規(guī)定了時(shí)序預(yù)算?;谶@個(gè)原因,塊處理算法必須以這樣的方式進(jìn)行優(yōu)化,即它的執(zhí)行時(shí)間要小于或等于DMA對(duì)雙緩沖區(qū)的一半進(jìn)行數(shù)據(jù)傳輸所需的時(shí)間。
圖1 用于流處理的雙緩沖結(jié)構(gòu)
二維(2D)DMA
當(dāng)數(shù)據(jù)通過(guò)像I2S這樣的數(shù)據(jù)鏈路傳輸時(shí),它可能會(huì)包含多個(gè)聲道。這些聲道可以全是從一條數(shù)據(jù)線上通過(guò)復(fù)用而輸入到同一個(gè)串行端口的。在這種情況下,2D DMA可以用來(lái)對(duì)數(shù)據(jù)進(jìn)行解交織,從而使每個(gè)聲道在存儲(chǔ)器中是線性分配的??梢钥匆幌聢D2中對(duì)這一安排的圖示,其中從左右聲道來(lái)的樣點(diǎn)被解復(fù)用到兩個(gè)分離的數(shù)據(jù)塊。這個(gè)自動(dòng)數(shù)據(jù)安排對(duì)于那些使用塊處理的系統(tǒng)是極其有用的。
圖2 2D DMA引擎用于解交織 (a) I2S立體聲數(shù)據(jù)輸入 (b)分離的左右緩沖區(qū)
基本操作
在音頻處理中有三個(gè)基本的構(gòu)建模塊。它們是加法操作、乘法操作和時(shí)間延遲。許多更復(fù)雜的效果和算法可以用這三個(gè)基本操作來(lái)實(shí)現(xiàn)。加法器顯而易見(jiàn)的任務(wù)是把兩個(gè)信號(hào)加在一起。乘法可以用于提升或衰減音頻信號(hào)。在大多數(shù)媒體處理器中,可以在一個(gè)周期內(nèi)完成多次加法和乘法操作。
時(shí)間延遲有點(diǎn)復(fù)雜。在許多音頻算法中,當(dāng)前的輸出取決于過(guò)去的輸入和輸出之間的組合。這種延遲效果是用延遲線實(shí)現(xiàn)的,而延遲線只不過(guò)是存儲(chǔ)器中用來(lái)保持過(guò)去數(shù)據(jù)的一個(gè)數(shù)組。例如,一個(gè)回聲算法可以對(duì)每個(gè)聲道保持500 mS的輸入樣點(diǎn)。當(dāng)前輸出值可以用當(dāng)前輸入值與稍微衰減的過(guò)去樣點(diǎn)進(jìn)行相加后得到。如果音頻系統(tǒng)是基于樣點(diǎn)的處理方式,那么程序設(shè)計(jì)人員可以簡(jiǎn)單地跟蹤一個(gè)輸入指針和一個(gè)輸出指針(兩者之間保持500 mS樣點(diǎn)數(shù)的間隔),并且在每個(gè)采樣周期之后增加這兩個(gè)指針。
由于延遲線要被隨后的各組數(shù)據(jù)重復(fù)使用,因此,輸入與輸出指針將需要從延遲線緩沖區(qū)的末尾回繞到起始端。在C/C++中,這通常是在指針增加操作時(shí)再附帶一次求模操作(%)完成的。
對(duì)于那些支持循環(huán)緩沖(見(jiàn)圖3)的處理器來(lái)說(shuō),這個(gè)回繞操作不會(huì)增加額外的處理周期。在這種情況下,一個(gè)循環(huán)緩沖區(qū)的起始位置和長(zhǎng)度必須只提供一次。在處理過(guò)程中,軟件增加或減少緩沖區(qū)內(nèi)的當(dāng)前指針,如果當(dāng)前的指針位置落在緩沖區(qū)的兩個(gè)端點(diǎn)之外,則由硬件使指針回繞到緩沖區(qū)的起始位置。如果沒(méi)有這個(gè)自動(dòng)地址生成功能,程序設(shè)計(jì)人員就必須手動(dòng)地保持對(duì)緩沖區(qū)的跟蹤,因而會(huì)浪費(fèi)有用的處理周期。
圖3 (a) 使用循環(huán)緩沖區(qū)的延遲線的圖示 (b) 循環(huán)緩沖區(qū)在存儲(chǔ)器中的布局
由延遲線結(jié)構(gòu)可以引出一個(gè)叫做梳狀濾波器的重要的音頻構(gòu)建模塊,它本質(zhì)上是一個(gè)帶有反饋的延遲線。當(dāng)多個(gè)梳狀濾波器同時(shí)使用的時(shí)候,可以產(chǎn)生混響的效果。
信號(hào)的產(chǎn)生
在有些音頻系統(tǒng)中,也許需要合成一個(gè)信號(hào)(例如一個(gè)正弦波)。泰勒級(jí)數(shù)的函數(shù)近似法可以用來(lái)對(duì)三角函數(shù)進(jìn)行仿真。而且,用均勻隨機(jī)數(shù)發(fā)生器來(lái)產(chǎn)生白噪聲是很容易的。
但是,合成的方法也許并不適用于某些給定系統(tǒng)的處理預(yù)算。在具有充足存儲(chǔ)器的定點(diǎn)系統(tǒng)中,您可以取而代之地使用查表的方法來(lái)產(chǎn)生信號(hào)。這樣做的負(fù)面效應(yīng)是占用了寶貴的存儲(chǔ)器資源,所以,作為一種折衷考慮,可以使用混合的方法。例如,您可以存儲(chǔ)一個(gè)不太精細(xì)的函數(shù)表,以節(jié)省存儲(chǔ)器。在運(yùn)行時(shí),準(zhǔn)確的值可以用插值的方法從函數(shù)表中提取出來(lái),而插值操作比使用泰勒級(jí)數(shù)近似法的時(shí)間大為縮短。這個(gè)混合法提供了在計(jì)算時(shí)間和存儲(chǔ)器資源之間的很好的平衡。
濾波與算法
音頻系統(tǒng)中的數(shù)字濾波器被用來(lái)對(duì)指定頻帶內(nèi)的聲波能量進(jìn)行衰減或提升。最常用的濾波器形式是高通、低通、帶通和點(diǎn)阻。這些濾波器中的任何一種都有兩種實(shí)現(xiàn)方法。這就是有限沖擊響應(yīng)(FIR)濾波器和無(wú)限沖擊響應(yīng)(IIR)濾波器,而且它們組成了搭建像參數(shù)均衡器和圖示均衡器那樣更復(fù)雜的濾波算法的構(gòu)建模塊。
有限沖擊響應(yīng)(FIR)濾波器
FIR濾波器的輸出是由當(dāng)前和過(guò)去輸入之和確定的,而其中的每個(gè)輸入樣點(diǎn)首先要乘以一個(gè)濾波器系數(shù)。示于圖4a中的FIR求和公式,也叫做“卷積”,是信號(hào)處理中最重要的操作之一。在這個(gè)公式的句法中,x為輸入向量,y為輸出向量,而h為濾波器系數(shù)。圖4a表示了FIR的實(shí)現(xiàn)結(jié)構(gòu)圖。
卷積是在媒體處理中非常常用的操作,因而許多處理器都可以在一個(gè)周期內(nèi)完成一條乘累加(MAC)指令,同時(shí)還可以完成多個(gè)數(shù)據(jù)的訪問(wèn)操作(讀或?qū)?。
圖4 (a)FIR濾波器的公式和結(jié)構(gòu) (b) IIR濾波器的公式和結(jié)構(gòu)
無(wú)限沖擊響應(yīng)(IIR)濾波器
與輸出僅僅取決于輸入的FIR濾波器不同,IIR濾波器則依靠輸入和過(guò)去的輸出。IIR濾波器的基本公式是一個(gè)差分方程,如圖4b所示。由于當(dāng)前輸出對(duì)于過(guò)去輸出的依從關(guān)系,IIR濾波器經(jīng)常被稱為“遞歸式濾波器”。圖4b也給出了IIR濾波器結(jié)構(gòu)的圖示。
快速傅里葉變換
我們往往可以更好地描述音頻信號(hào)的特性,那就是用頻率組成。傅里葉變換以時(shí)域信號(hào)作為輸入,并把信號(hào)重新安排到頻域里,而傅里葉反變換則完成逆向的工作,把頻域表示變換回時(shí)域。從數(shù)學(xué)上看,時(shí)域中的操作與頻域中的操作之間存在一些很妙的特性關(guān)系。特別是,時(shí)域卷積(或者FIR濾波器)等效于頻域的相乘。如果沒(méi)有傅里葉變換這個(gè)特別的優(yōu)化方法,即快速傅里葉變換(FFT),那么這個(gè)信號(hào)處理中的珍品就不可能變?yōu)閷?shí)用。事實(shí)上,F(xiàn)IR濾波器往往有更高效的實(shí)現(xiàn)方法,那就是把輸入信號(hào)和濾波器系數(shù)用FFT變換到頻域,然后將兩個(gè)變換式相乘,最后再用傅里葉反變換把乘積變換回時(shí)域。
在音頻處理中還經(jīng)常使用其他一些變換。其中包括最常用的修正離散余弦變換(MDCT),這是許多音頻壓縮算法的基礎(chǔ)。
采樣率轉(zhuǎn)換
有時(shí)您會(huì)需要把信號(hào)的采樣率轉(zhuǎn)換到另一個(gè)不同的采樣率。用到變采樣率的一個(gè)情況是,您需要對(duì)一個(gè)以8 kHz采樣的音頻信號(hào)進(jìn)行解碼,但是您使用的DAC并不支持這個(gè)采樣率。另一個(gè)情況是,當(dāng)一個(gè)信號(hào)被過(guò)采樣之后,需要轉(zhuǎn)換成一個(gè)較低的頻率,因而可以縮短計(jì)算時(shí)間。把信號(hào)從一個(gè)采樣率變換到另一個(gè)采樣率的過(guò)程叫做變采樣率(或SRC)。
提高采樣率的方法叫做插值,而降低采樣率的方法叫做抽取。對(duì)信號(hào)進(jìn)行M倍抽取是通過(guò)只保留每個(gè)M樣點(diǎn)而拋棄所有其余的樣點(diǎn)來(lái)完成的。對(duì)信號(hào)進(jìn)行L倍插值是通過(guò)對(duì)原來(lái)信號(hào)的每?jī)蓚€(gè)樣點(diǎn)之間補(bǔ)充L-1個(gè)零來(lái)完成的。
雖然插值和抽取的因子都是整數(shù),但您可以對(duì)輸入信號(hào)接連使用插值和抽取而得到一個(gè)有理數(shù)的變換因子。當(dāng)您用5倍進(jìn)行上采樣,然后用3倍作下采樣,那么最后的因子為5/3 = 1.67。
圖5 通過(guò)上采樣和下采樣的采樣率轉(zhuǎn)換
老實(shí)說(shuō),我們有點(diǎn)過(guò)分地簡(jiǎn)化了SRC的過(guò)程。為了避免對(duì)信號(hào)補(bǔ)零(補(bǔ)零會(huì)引起頻域的鏡像成分)而引起的人工痕跡,被插值的信號(hào)在當(dāng)作輸出或當(dāng)作抽取器的輸入而被使用之前,必須經(jīng)過(guò)低通濾波。通過(guò)使用一個(gè)知曉與L-1個(gè)插值樣點(diǎn)相對(duì)應(yīng)的輸入都是零值的特定FIR濾波器結(jié)構(gòu),這個(gè)抗鏡像低通濾波器可以在輸入采樣率下進(jìn)行,而不必在較快速率的輸出采樣率下進(jìn)行。
同樣,在被抽取之前,不符合Nyquest采樣定律的輸入信號(hào)必須被低通濾波,以避免混疊。使用知曉輸出樣點(diǎn)中那些被拋棄的樣點(diǎn)是不需要進(jìn)行濾波計(jì)算的FIR濾波器結(jié)構(gòu),這個(gè)抗混疊低通濾波器可以設(shè)計(jì)成以抽取后采樣率進(jìn)行操作,而不必在較快速的輸入采樣率下操作。圖5表示了變采樣率的流程圖。應(yīng)該注意到,抗鏡像濾波器和抗混疊濾波器是可以合二為一的,以便節(jié)省計(jì)算量。
顯然,對(duì)于這些嵌入式音頻的論題,我們僅僅能夠給出一個(gè)很表層的討論,但對(duì)于嵌入式音頻處理應(yīng)用的開(kāi)發(fā),我們還是希望已經(jīng)提供了一個(gè)有用的框架,并提到了其中各種必需考慮的問(wèn)題。
評(píng)論