江波



摘 要 SHARC DSP廣泛應用于數字音頻產品中,為分析SHARC DSP音頻算法開發中的調試數據,采用了文件讀寫、數據流、操作數組和存儲空間等4種數據輸入輸出方法,以及在軟件開發平臺VisualDSP++中實現的主要步驟及關鍵代碼。以參量均衡算法為例說明如何用MATLAB對調試數據進行分析。
【關鍵詞】音頻 數據模擬 SHARC DSP VisualDSP++
1 引言
目前很多數字音頻產品都是采用DSP作為信號處理平臺。為降低產品開發難度、加快進度,國內廠家目前使用較多的是基于圖標編程的專用音頻DSP,如ADI公司的ADAU1701 SigmaDSP和TI公司的TAS3108。然而這類基于圖標編程的DSP雖然使用方便,但算法功能卻受限于現有的算法圖標,僅適合較常用的功能,且不同廠家開發的產品易出現同質化的現象。為提升產品的競爭力,有些廠家研究出自己的音頻處理算法,在通用DSP上通過編程實現。ADI公司生產的SHARC系列DSP是數字音頻產品中常用的通用DSP,其軟件開發平臺是VisualDSP++(近年推出了CCES軟件,支持與SigmaDSP開發軟件平臺的互連,目前VisualDSP++還是得到廣泛應用)。在SHARC DSP上調試音頻算法時,除了需將算法通過程序實現外,還需對算法程序調試的調試數據進行分析。以下討論DSP開發平臺上音頻數據輸入輸出模擬的實現方法及如何用MATLAB對調試數據進行分析。
2 音頻數據輸入輸出模擬
常見的DSP音頻信號處理框圖如圖1所示。
其中音頻算法一般需要在DSP軟件開發平臺中先通過軟件仿真的方式進行調試,在這個過程中沒有外部聲音信號輸入,也無法將處理好的聲音信號輸出給外部設備,所以需要對圖1中的信號輸入輸出部分進行模擬。下面討論在VisualDSP++5.0上模擬輸入輸出音頻數據的幾種方法。
2.1 通過文件讀寫進行模擬
通過調用文件操作函數,對WAV、PCM等常用的聲音文件進行讀寫,圖2是操作框圖。
本例程有兩點需要注意:一是WAV文件有44個字節的文件頭,不能作為聲音數據進行處理,因為文件頭有保存文件類型大小等,不是聲音的具體數據;二是在SHARC DSP中各種數據類型的比特數,比如short int/int/float等數據類型均為32比特。
2.2 通過數據流進行模擬
數據流可以模擬通過外部端口或存儲器與DSP處理器進行數據傳輸。在VisualDSP++菜單中選擇“Settings\Streams\Add”,彈出圖3所示界面。
共有Source和Destination兩欄,通過對這兩欄的相關參數進行設置即可模擬數據的輸入輸出。
模擬數據輸入:在Source欄設定File路徑,在Destination欄設定Debug target,既可以是各種接口,也可以是存儲器地址。為方便處理,可以在程序中定義一個變量,然后將該變量地址作為接收文件數據的Debug target。
模擬數據輸出:在Source欄設定Debug target,在Destination欄設定File路徑。實際的算法仿真時,可以將保存輸出數據的變量地址作為Debug target,程序運行時系統就會將輸出數據保存到輸出文件中。
數據流模擬時都要使用到數據文件(后綴名為dat),這種dat文件要滿足一定的格式,即將所有數據排成一列,可以通過Matlab或C語言編程對dat文件進行讀寫。更簡便的方法是通過CoolEdit軟件進行dat文件讀寫:若要寫一個dat文件,則先打開一個聲音文件,然后選擇另存,類型選txt,最后寫自己定義的文件名(后綴寫dat);并將該dat文件中的前面幾行文件頭信息去掉;若要讀一個dat文件,直接打開該文件,然后選定采樣率和數據量化比特數即可。
2.3 通過操作數組進行模擬
以上兩種方法主要模擬數據量較大、無法預存到存儲空間的情況,對于少量數據的情況,輸入數據的模擬可以定義一個輸入數組,用原始聲音數據對其初始化。輸出數據的模擬也可以定義一個輸出數組,將所有處理好的數據都存入這個數組。
輸入數組的初始化有幾種方法,最直接的方法是將所有數據列出來,但對于幾百甚至幾千個數據的情況,顯得頁面不夠簡潔,建議用以下兩種方法。
2.3.1 匯編語言環境下用dat文件初始化數組
首先將原始數據寫入一個dat文件(例如input.dat),然后新建一個asm文件,定義數組名(例如_inputx),選擇存儲區(例如seg_dmda)。以下是相關代碼:
.global _inputx;// 聲明全局變量
.SECTION/DM seg_dmda;// 定義數組存放的存儲區
.VAR _inputx[N]= "input.dat"; // 用input.dat文件的數據對數組初始化
然后在C語言文件中先將_inputx聲明為外部變量:extern int inputx[N],這樣就可以調用了。這里有兩點需要注意:一是在asm文件中數組名前面有一個“_”,而在C語言文件中則無需加這個符號;二是在C語言中inputx數組的數據類型由input.dat中的數據類型確定,若為float型,則將聲明外部變量語句改為:extern float inputx[N]。
2.3.2 C語言環境下用dat文件初始化數組
2.4 通過操作存儲空間進行模擬
在VisualDSP++菜單中選擇Memory\Two column,將彈出DM(數據存儲空間)界面,如圖4所示。在空白欄中輸入絕對地址或數組名(例如圖4中的InputData),則在存儲空間欄內將顯示相應地址的內容,此時可以直接查看數據或手動修改相關地址上的數值。在菜單中若選擇Memory\Three column,則將彈出與圖4類似的PM(程序存儲空間)界面。
也可以在菜單中選擇Memory\Fill,對某個地址直接填充數據,或通過dat文件對存儲空間的數據進行填充。同樣的,也可以在菜單中選擇Memory \Dump,將存儲空間中的數據導出為一個dat文件。
3 調試數據的MATLAB分析
為分析VisualDsp++軟件平臺中音頻算法的調試數據是否正確,選擇上述數據模擬方法將調試數據從DSP開發平臺導出,然后導入MATLAB中進行分析。這里以參量均衡算法為例進行說明。
3.1 參量均衡算法原理
參量均衡器是由一種峰值帶通濾波器,用來調整聲音信號的幅頻特性。參量均衡器的Q值、增益和中心頻率3個參數可調。當增益大小在0dB以上稱為峰值濾波器,反之稱作陷波器(對信號的某一頻段起到衰減的作用)。
3.2 MATLAB數據分析
參量均衡算法DSP軟件實現流程如圖5所示。實驗中所用的音頻數據來自于TIMIT數據庫中NeoSpeech_Ashley.wav(男聲)語音。通過CoolEdit軟件將.wav格式的語音轉換為后綴為.dat格式。
整個實現過程中參量均衡器的參數設置如下:Q值為14,中心頻率w0=1000Hz,濾波器增益G為-6dB。對程序經行編譯后,在VisualDSP++菜單中選擇“Settings\Streams\Add”進行數據的導入與導出。采用上述2.2中的方法進行聲音數據的導入與導出,采用上述2.4中的方法導出參量均衡器的濾波器系數。將DSP中參量均衡器的濾波器系數和DSP中經參量均衡器濾波后的聲音數據導入到MATLAB中,并將其與用MATLAB進行計算和處理的結果進行對比,從而來進行判斷DSP算法程序的準確性。
圖6,是MATLAB直接計算和通過DSP計算得到的參量均衡器的幅頻響應圖像,只有通過對MATLAB得到的圖形進行加粗才能看出有兩條曲線。圖7參量均衡器濾波后的聲音數據時域波形圖和幅頻圖,曲線重合,說明了DSP濾波處理得出的輸出結果和用MATLAB仿真得出結果是一致的。
4 結語
在VisualDSP++軟件平臺中用軟件仿真的方式來調試SHARC DSP音頻算法程序時,可以通過文件讀寫或數據流操作的方法模擬大量的數據輸入輸出。對于數據量較少的情況,則可以通過操作數組或存儲空間的方法對輸入輸出數據進行模擬。使用者可以根據自己需求選取適合的數據模擬的方法,從而減少軟件仿真所需要的時間。DSP音頻算法的調試數據可導入到MATLAB中進行分析對比,驗證算法程序是否正確。
參考文獻
[1]ADI.ADAU1701:SigmaDSP? 28/56-Bit Audio Processor with Two ADCs and FourDACs [G/OL].(2013-8-1)http://www.analog.com/en/processors-dsp/sigmadsp/ADAU1701/products/product.html.
[2]TI.TAS3108Digital Audio Processor[G/OL].(2013-8-1).http://www.ti.com/product/tas3108.
[3]張承云,高星輝.音頻專用DSP的軟件設計方法[J].電聲技術,2009,33(10):39-42.
[4]ADI.CrossCore? Embedded Studio for Analog Devices Processors[G/OL].(2013-8-1).http://www.anal-og.com/en/evaluation/adswt-cces/eb.html.
[5]馮小平,羅勇江,羅明.ADSP技術與應用[M].北京:機械工業出版社,2008.
[6]Regalia P,Mitra S.Tunable digital frequency response equalization filters[J].IEEE Transactio-ns on Acoustics Speech & Signal Processing,1987,35(01):118-120.
作者單位
廣州大學機械與電氣工程學院 廣東省廣州市 510006