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