【導(dǎo)讀】音頻工程師面臨的挑戰(zhàn)是設(shè)計設(shè)備,提供更好的音頻保真度,支持更多音頻通道,處理更高的采樣率和位深度,同時保持緊張的實(shí)時處理預(yù)算。
音頻工程師面臨的挑戰(zhàn)是設(shè)計設(shè)備,提供更好的音頻保真度,支持更多音頻通道,處理更高的采樣率和位深度,同時保持緊張的實(shí)時處理預(yù)算。
在許多音頻應(yīng)用中,系統(tǒng)性能的主要瓶頸是音頻數(shù)據(jù)的高效移動。多年來,數(shù)字信號處理器 (DSP) 架構(gòu)引入了各種創(chuàng)新,從 DSP 內(nèi)核卸載了許多 I/O 或數(shù)據(jù)移動任務(wù),使其能夠?qū)W⒂谛盘柼幚砣蝿?wù)。
直接內(nèi)存訪問 (DMA) 引擎是當(dāng)今大多數(shù)高性能 DSP 的關(guān)鍵組件。DSP 可以配置 DMA 引擎來訪問片上和片外資源,并促進(jìn)它們之間的傳輸,而不必顯式訪問存儲器或外設(shè)。這些 DMA 傳輸可以與關(guān)鍵 DSP 內(nèi)核處理并行執(zhí)行,以獲得性能。
標(biāo)準(zhǔn) DMA 引擎非常適合傳統(tǒng)的一維和二維算法處理,例如塊復(fù)制和基本數(shù)據(jù)排序。但是,許多音頻算法需要更復(fù)雜的數(shù)據(jù)傳輸。延遲線就是一個例子,它由前一個時間點(diǎn)的音頻樣本組成,用于創(chuàng)建所需的音頻效果(例如回聲)。傳統(tǒng)的 DMA 性能對于管理延遲線來說并不是的,需要對 DMA 架構(gòu)進(jìn)行創(chuàng)新,以有效地處理所需的音頻算法。
是否需要DMA加速?
這個問題的答案是肯定的,原因有兩個。首先,許多高性能 DSP 引擎中的 DMA 通道數(shù)量限制了 (pro) 音頻應(yīng)用。其次,由于對高質(zhì)量音頻的需求,音頻應(yīng)用中的傳統(tǒng)DMA通常需要更多的CPU參與
圖1。音頻應(yīng)用框圖
上面的框圖描述了典型音頻應(yīng)用中的數(shù)據(jù)流。每個效果獲取前一個效果的輸出,處理數(shù)據(jù),并將其輸出轉(zhuǎn)發(fā)到數(shù)據(jù)處理鏈中的下一個效果(例如,Phaser 效果的輸出被輸入到 Delay 效果,Delay 效果的輸出被發(fā)送到混響) 。
上圖所示的數(shù)字音頻效果依賴于延遲線來實(shí)現(xiàn)。在描述完整的效果系統(tǒng)時,需要多個延遲線。改變設(shè)計中使用的延遲長度會改變音頻效果的質(zhì)量。
延遲線是線性時不變系統(tǒng),其輸出信號是延遲了 x 個樣本的輸入信號的副本。在 DSP 上實(shí)現(xiàn)延遲線的有效方法是使用循環(huán)緩沖器。循環(huán)緩沖區(qū)存儲在線性存儲器的專用部分中;當(dāng)緩沖區(qū)被填滿時,新的數(shù)據(jù)被寫入,從緩沖區(qū)的開頭開始。
循環(huán)緩沖區(qū)數(shù)據(jù)由一個進(jìn)程寫入,由另一個進(jìn)程讀取,這需要單獨(dú)的讀寫指針。讀寫指針不允許交叉,這樣未讀數(shù)據(jù)就不會被新數(shù)據(jù)覆蓋。循環(huán)緩沖區(qū)的大小由效果所需的延遲決定。在本文中,先進(jìn)先出 (FIFO) 和循環(huán)緩沖區(qū)名稱可以互換使用。
當(dāng)使用傳統(tǒng)的 DMA 引擎在基于延遲的音頻效果中移動數(shù)據(jù)時,會為信號處理鏈中的每個效果分配一個單獨(dú)的循環(huán)緩沖區(qū)。饋送到特定音頻效果的輸入數(shù)據(jù)存儲在分配給該效果的循環(huán)緩沖區(qū)中。下面的框圖顯示了更詳細(xì)的數(shù)據(jù)流。在下面圖 2 的框圖中,循環(huán)緩沖區(qū)由環(huán)表示。使用循環(huán)緩沖區(qū)的環(huán)形表示,因?yàn)樗@示分配給循環(huán)緩沖區(qū)的線性地址空間的包裝。當(dāng)指針通過循環(huán)緩沖區(qū)前進(jìn)時,地址將增加,直到遇到回繞條件,導(dǎo)致指針重置到內(nèi)存地址或循環(huán)緩沖區(qū)的起始點(diǎn)。
圖2. 使用傳統(tǒng)DMA引擎時的Pro音頻應(yīng)用數(shù)據(jù)流框圖
為了產(chǎn)生不同的延遲,DMA 必須從延遲線內(nèi)的不同位置檢索延遲數(shù)據(jù)。如果使用塊處理,則會檢索一組數(shù)據(jù)而不是僅一個樣本。
傳統(tǒng)的 DMA 引擎通常允許程序員指定幾個完整描述所需傳輸?shù)膮?shù)。通常,這些參數(shù)是源地址、目標(biāo)地址、源和目標(biāo)的索引以及傳輸計數(shù)。每次 DMA 傳輸將需要一個典型 DMA 總體功能的通道。
在上面的框圖中,有五個循環(huán)緩沖區(qū)。傳統(tǒng)的 DMA 引擎必須經(jīng)過編程才能將數(shù)據(jù)移入和移出每個緩沖區(qū)。在上面所示的應(yīng)用中,處理一個數(shù)據(jù)塊至少需要 11 次 DMA 傳輸。
這是所需的 DMA 傳輸?shù)臄?shù)量,假設(shè)從每個循環(huán)緩沖區(qū)中只檢索每個效果的一個延遲。在典型應(yīng)用中,每個數(shù)據(jù)塊的 DMA 傳輸數(shù)量會高得多。例如,混響效果的實(shí)現(xiàn)總是需要來自其循環(huán)緩沖區(qū)的多個延遲。
隨著實(shí)現(xiàn)的音頻效果數(shù)量的增加,所需的傳統(tǒng) DMA 傳輸數(shù)量也會增加。因此,系統(tǒng)中可用的傳統(tǒng) DMA 通道的數(shù)量會限制可實(shí)現(xiàn)的音頻效果的數(shù)量。
傳統(tǒng) DMA 在音頻應(yīng)用中的局限性
標(biāo)準(zhǔn) DMA 引擎在以連續(xù)或固定間隔移動長數(shù)據(jù)塊時表現(xiàn)良好。固定間隔傳輸?shù)囊粋€示例是 DMA 引擎訪問延遲線的每四個數(shù)據(jù)樣本。
當(dāng)訪問不連續(xù)或以固定間隔進(jìn)行時,典型的 DMA 性能并不是的。當(dāng)傳統(tǒng)的 DMA 引擎移動循環(huán)緩沖區(qū)數(shù)據(jù)以生成數(shù)字音頻效果時,CPU 在處理一個數(shù)據(jù)塊時必須干預(yù)至少兩次對 DMA 參數(shù)進(jìn)行編程。當(dāng)數(shù)據(jù)訪問環(huán)繞環(huán)形緩沖區(qū)邊界時,CPU 需要對 DMA 參數(shù)進(jìn)行編程,并干預(yù)管理延遲線。
圖3. 合唱框圖
合唱效果是說明這一點(diǎn)的一個簡單算法示例,如上圖 3 所示。合唱效果通常用于改變樂器的聲音,使其聽起來像是多個樂器在演奏,如果樂器中有人聲,那么此效果往往會使單個聲音聽起來像合唱團(tuán)。我們感知多個聲音或樂器,因?yàn)楫?dāng)多個聲音或樂器同時演奏時,總是存在不的同步和輕微的音高變化。這些是合唱效果的主要特征。
在圖 3 中,Chorus 顯示為輸入與其兩個延遲副本的組合。音調(diào)偏差是通過延遲輸入副本中緩慢變化的延遲量來建模的。延遲緩慢變化,偏差量及其頻率由低頻振蕩器 (LFO) 控制。
如下圖4中的Chorus實(shí)現(xiàn)圖所示,延遲線是通過使用環(huán)形緩沖區(qū)(由兩個同心圓表示)來實(shí)現(xiàn)的。圖 4 中呈現(xiàn)的合唱實(shí)現(xiàn)意味著使用塊處理。此合唱示例中的塊大小是四個樣本。傳入的樣本按順時針方向存儲到循環(huán)緩沖區(qū)中。
圖4. Chorus 實(shí)現(xiàn)框圖
塊處理同時管理數(shù)據(jù)塊(多個樣本),而不是只管理一個樣本。在此示例中,CPU 等待四個輸入樣本可用,然后計算四個輸出樣本。它通過將輸入樣本塊與從循環(huán)緩沖區(qū)獲取的兩個延遲數(shù)據(jù)塊相結(jié)合來處理這些樣本。
在使用傳統(tǒng) DMA 控制器的情況下(如下圖 5),每次輸入數(shù)據(jù)塊準(zhǔn)備就緒時,CPU 都會收到中斷通知。然后CPU計算合唱輸出。
圖5. 采用傳統(tǒng) DMA 時 Chorus 實(shí)現(xiàn)時間表
本例中的 DMA 引擎分配必須執(zhí)行兩個關(guān)鍵操作:
1) 將一塊輸入樣本存儲到循環(huán)緩沖區(qū)(以供將來參考)2) 從循環(huán)緩沖區(qū)檢索兩塊延遲數(shù)據(jù)(為下一個輸入樣本塊準(zhǔn)備延遲數(shù)據(jù))。
在這種情況下,CPU 必須通過跟蹤和編程源地址和目標(biāo)地址來協(xié)助 DMA,并在數(shù)據(jù)訪問繞過緩沖區(qū)邊界時進(jìn)行干預(yù)。這需要在每次傳輸之前配置 DMA 引擎。
在 CPU 重新配置 DMA 之前,每個偏移量必須由 CPU 計算(或從預(yù)先計算的表中獲?。PU 帶寬得到利用,因?yàn)樗仨氃诿看蝹鬏斨爸匦屡渲?DMA 引擎。在圖 5 中,CPU 時間線活動顯示為兩行:行顯示了處理合唱效果所需的 CPU 活動,第二行顯示了配置 DMA 所需的 CPU 活動。
在復(fù)雜的數(shù)字音頻效果(例如混響)的情況下,必須從循環(huán)緩沖器中檢索的延遲塊的數(shù)量可以達(dá)到256或更多。此外,這些延遲塊中的每一個都不是固定間隔的,并且隨著算法運(yùn)行,偏移量不斷變化。隨著循環(huán)緩沖區(qū)中數(shù)據(jù)訪問量的急劇增加,更復(fù)雜的數(shù)字音頻效果算法(如混響)將需要更多的 CPU 周期。這使得可用于實(shí)際應(yīng)用程序的 CPU 帶寬減少。
當(dāng)多個數(shù)字音頻效果相繼出現(xiàn)時(如圖 1 所示),CPU 將必須協(xié)助 DMA 移動每個處理階段所需和產(chǎn)生的數(shù)據(jù)。在這些任務(wù)期間,CPU 和 DMA 必須同步。同步由 DMA 促進(jìn),它會中斷 CPU。
因此,系統(tǒng)中的中斷數(shù)量會隨著系統(tǒng)復(fù)雜度的增加而增加。這些中斷會帶來很高的開銷,因?yàn)楸仨毐4婕拇嫫饕员A羯舷挛摹3酥?,中斷還會經(jīng)過處理管道并破壞指令緩存的微妙效率。保留上下文會消耗大量周期,并進(jìn)一步改變指令緩存的性能。管道的過度中斷也直接影響整體性能。
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進(jìn)行處理。
推薦閱讀: