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