徐長(zhǎng)輝,李 宏,常 帥
(西北工業(yè)大學(xué) 電子信息學(xué)院,陜西 西安710129)
盲信號(hào)分離是指在信號(hào)混迭參數(shù)未知的情況下,從多個(gè)混合在一起的觀測(cè)信號(hào)中恢復(fù)出源信號(hào)。通常,觀測(cè)信號(hào)來自一組傳感器,每個(gè)傳感器的接收信號(hào)是源信號(hào)的不同組合。獨(dú)立分量分析是在盲源分離研究中發(fā)展起來的一種多通道信號(hào)處理技術(shù),近年來,該技術(shù)在語音降噪、通信、生物醫(yī)學(xué)信號(hào)處理、圖像處理中的巨大優(yōu)勢(shì)引起了廣泛的關(guān)注。
隨著FPGA技術(shù)的快速發(fā)展,有關(guān)獨(dú)立分量分析算法硬件實(shí)現(xiàn)的方案也不斷涌現(xiàn)。2006年Shyu和Li首先通過硬件描述語言(HDL)實(shí)現(xiàn)了FastICA算法,之后對(duì)該方案進(jìn)行改進(jìn),實(shí)現(xiàn)了算法的流水線操作[1-2]。獨(dú)立分量分析的信息極大化算法和 EASI(equivariant adaptive separation via independence)等其他算法硬件方案的研究也已完成[3-6]。隨著相關(guān)算法和技術(shù)的不斷完善,獨(dú)立分量分析在工程實(shí)際中的應(yīng)用研究也已展開,Huang等人實(shí)現(xiàn)了四通道腦電信號(hào)的實(shí)時(shí)分離[7],而Thuong在FPGA中將獨(dú)立分量分析算法應(yīng)用于音頻水印技術(shù)[8]。在ICA眾多算法中,NLPCA-RLS算法是一種隨機(jī)在線算法,更適用于對(duì)實(shí)時(shí)性處理要求較高的場(chǎng)合。本文研究了非線性主分量分析算法的原理、主要功能和分離過程,依照算法的流程進(jìn)行了功能模塊的劃分,利用Simulink/DSP builder與QuartusII組合開發(fā)工具及Altera CycloneIII硬件仿真平臺(tái),首次完成了NLPCA-RLS算法硬件IP的實(shí)現(xiàn)方案,并將其應(yīng)用于語音信號(hào)的分離與降噪中。
獨(dú)立分量分析是一種基于統(tǒng)計(jì)量的信號(hào)處理方法,它將多通道觀測(cè)信號(hào)按照統(tǒng)計(jì)獨(dú)立的原則進(jìn)行優(yōu)化運(yùn)算,分解成若干相互獨(dú)立的成分。其模型可描述為[9]
式中:x(t)——觀測(cè)信號(hào)矢量,s(t)——統(tǒng)計(jì)獨(dú)立的源信號(hào)矢量,A——混合矩陣。獨(dú)立分量分析的目的是在s(t)和A均未知的條件下,尋求解混矩陣W,使得
如圖1所示。
圖1 獨(dú)立分量分析模型
根據(jù)Darmois定理[10],在如下兩個(gè)假設(shè)成立的條件下:
(1)源信號(hào)各分量之間統(tǒng)計(jì)獨(dú)立;
(2)源信號(hào)分量中最多只有一個(gè)高斯分量;
如果我們能找到矩陣W,使得(2)中的y(t)各分量統(tǒng)計(jì)獨(dú)立,那么y(t)即為s(t)的一個(gè)拷貝,即
式中:∧——一個(gè)對(duì)角矩陣,P——一個(gè)置換矩陣。即通過獨(dú)立分量分析得到的分離信號(hào)y(t),與源信號(hào)s(t)之間存在幅值和排列的不確定性。
NLPCA算法是獨(dú)立分量分析的一種典型算法,它是在主分量分析(principal component analysis,PCA)中引入非線性函數(shù)而得。PCA的一個(gè)基本概念是最小均方誤差壓縮,即對(duì)于隨機(jī)輸入向量x,尋找標(biāo)準(zhǔn)正交基向量W,使得x和它在該標(biāo)準(zhǔn)正交基向量張成的子空間上的投影之間的均方誤差最小,其目標(biāo)函數(shù)為
當(dāng)我們對(duì)于白化后的x用非線性函數(shù)g(Wx)代替(Wx),即用x在子空間上的非線性投影代替線性投影,上述方程的解在一定程度上能夠使y=W*x的各分量獨(dú)立[11],這種方法叫做NLPCA算法。
NLPCA-RLS算法是在NLPCA算法中采用近似遞歸最小二乘。使用下標(biāo)t代表迭代步數(shù),對(duì)輸入數(shù)據(jù)x(t),迭代算法如下
式中:向量變量q(t),h(t),m(t),r(t)及矩陣變量P(t)——算法內(nèi)部的輔助變量,g——NLPCA指標(biāo)中的非線性函數(shù),此處取反正切函數(shù)。參數(shù)β是一值接近1的“遺忘常量”。符號(hào)Tri的數(shù)學(xué)意義是只計(jì)算矩陣的上三角部分,然后將上三角部分求轉(zhuǎn)置并復(fù)制到下三角部分。經(jīng)過迭代之后的矩陣W 即為式(2)中的解混矩陣。
上述NLPCA-RLS算法的完整實(shí)現(xiàn)步驟如圖2所示。
圖2 NLPCA-RLS算法流程
由于使用近似遞歸最小二乘方法,算法可以根據(jù)輸入數(shù)據(jù)決定學(xué)習(xí)速率參數(shù)。相比于其他算法,NLPCA-RLS具有更快的收斂速度[12]。
目前出現(xiàn)的基于FPGA的DSP開發(fā)工具,使得設(shè)計(jì)者能夠遵循類似于軟件設(shè)計(jì)流程的開發(fā)方法進(jìn)行FPGA的設(shè)計(jì)。尤其當(dāng)設(shè)計(jì)包含諸多數(shù)學(xué)算法時(shí),可使效率大為提高。
本文利用 Matlab、DSP Builder、Modelsim、QuartusII等組合工具完成整個(gè)設(shè)計(jì)。①在Matlab/Simulink中進(jìn)行設(shè)計(jì)輸入,即在Matlab的Simulink環(huán)境中建立模型文件,用圖形方式調(diào)用DSP Builder和其他Simulink庫中的圖形模塊,構(gòu)成系統(tǒng)級(jí)和算法級(jí)設(shè)計(jì)框圖,或稱Simulink設(shè)計(jì)模型。②利用Simulink的圖形化仿真、分析功能,分析此設(shè)計(jì)模型的正確性,完成模型仿真。③由于EDA工具軟件不能直接處理Matlab的模型文件,需要通過DSP builder中的SignalCompiler模塊將模型文件自動(dòng)轉(zhuǎn)換成通用的硬件描述語言文件,即VHDL文件。第四步,對(duì)以上頂層設(shè)計(jì)產(chǎn)生的VHDL文件在Modelsim中進(jìn)行RTL級(jí)仿真。④對(duì)功能仿真正確的硬件代碼在Quartus中進(jìn)行綜合、編譯、時(shí)序仿真并下載到FPGA中進(jìn)行驗(yàn)證。
本方案基于2x2的數(shù)據(jù)模型搭建,即源信號(hào)向量s(t)維數(shù)為2,混合后的信號(hào)向量x(t)維數(shù)為2。為減少?gòu)?fù)雜度,所處理數(shù)據(jù)采用24位固定點(diǎn)類型,其中整數(shù)部分占12比特,小數(shù)部分占12比特。數(shù)據(jù)處理采用批處理模式。根據(jù)MATLAB計(jì)算機(jī)仿真可知,算法在200次迭代之內(nèi)即可收斂,每個(gè)數(shù)據(jù)RAM的大小由算法的總迭代步數(shù)決定, 即為200x24bit。設(shè)計(jì)框圖及關(guān)鍵信號(hào)連接如圖3所示。
圖3 NLPCA-RLS算法硬件實(shí)現(xiàn)框架
其中,SCU(System Contrl Unit)模塊控制系統(tǒng)的復(fù)位、啟動(dòng)、運(yùn)行及算法迭代流程的狀態(tài)機(jī)。程序運(yùn)行時(shí),待分離的兩路混合信號(hào)x(t)數(shù)據(jù)首先分別載入輸入端兩個(gè)雙端口RAM(RAM_IN_1和RAM_IN_2)中,接著NLPCA_RLS算法模塊計(jì)算出分離矩陣W。混合信號(hào)與分離矩陣W 相乘后得到分離后的信號(hào)y(t),該數(shù)據(jù)存入輸出端雙端口RAM(RAM_OUT_1和RAM_OUT_2)中。在down_o=1,即運(yùn)算完成后,外部控制器可讀取輸出端RAM中的數(shù)據(jù)。
由于系統(tǒng)級(jí)開發(fā)工具DSP Builder有專用模塊供調(diào)用,可大大提高開發(fā)速度,因此算法模塊采用該工具進(jìn)行建模。圖3給出的迭代算法主要涉及三個(gè)方面:迭代流程的控制,矩陣乘法運(yùn)算和反正切函數(shù)運(yùn)算。其中矩陣乘法采用FPGA中的專用乘法模塊和加法模塊實(shí)現(xiàn)。各模塊的在DSP builder中的具體建模方法如下:
(1)算法流程控制
本文中采用有限狀態(tài)機(jī)的方式來控制算法頂層的迭代與循環(huán),如圖4所示。
圖4 算法流程控制狀態(tài)機(jī)
程序啟動(dòng)后首先進(jìn)入Idel狀態(tài);在外部輸入信號(hào)start_i置1時(shí)跳轉(zhuǎn)到Clear狀態(tài),此時(shí)模塊中的乘法器和加法器進(jìn)行一次復(fù)位,完成后進(jìn)入Load狀態(tài);在Load狀態(tài)下,迭代式(5)中的W 和P矩陣將上一次迭代后的值載入,作為本次迭代的起始值(若為第一次迭代,則載入初值);Calc狀態(tài)下程序進(jìn)行一次迭代運(yùn)算,當(dāng)運(yùn)算結(jié)束后狀態(tài)機(jī)進(jìn)入Save狀態(tài);Save狀態(tài)將本次計(jì)算得到的W 和P保存起來,之后程序判斷迭代次數(shù)是否達(dá)到,如果沒有達(dá)到,狀態(tài)機(jī)跳轉(zhuǎn)至Clear狀態(tài)繼續(xù)進(jìn)行下一次迭代運(yùn)算;否則跳轉(zhuǎn)到Down狀態(tài),并將down_o信號(hào)置1,告知外部模塊運(yùn)算已完成。外部模塊將運(yùn)算結(jié)果讀取之后復(fù)位start_i信號(hào),狀態(tài)機(jī)返回Idel狀態(tài)。
(2)矩陣乘法的實(shí)現(xiàn)
式(5)中涉及多個(gè)2位矩陣乘法運(yùn)算,其一般格式為
圖5即為式(6)在DSP builder中的具體實(shí)現(xiàn)方案,圖中的乘法器單元可選用Altera FPGA的專用乘法器單元LPM-MULT,它是一個(gè)參數(shù)化的宏函數(shù)[13]。圖中各運(yùn)算單元均使用統(tǒng)一的使能信號(hào)(ena)與異步清零信號(hào)(aclr),便于頂層狀態(tài)機(jī)控制整個(gè)流程。使用該矩陣乘法單元實(shí)現(xiàn)的整個(gè)算法流程,每次獨(dú)立迭代運(yùn)算共需22個(gè)系統(tǒng)時(shí)鐘周期。
圖5 Simulink中二維矩陣乘法的實(shí)現(xiàn)
(3)反正切函數(shù)的實(shí)現(xiàn)
反正切函數(shù)q=atan(y)相對(duì)比較復(fù)雜,如果通過計(jì)算的方式實(shí)現(xiàn)必然會(huì)占用較多的資源,同時(shí)延緩算法的速度。本方案采用查表法實(shí)現(xiàn),查找表地址位寬為8,輸出數(shù)據(jù)位寬為14,故可存放128個(gè)14位固定點(diǎn)類型數(shù)據(jù)。變量y在之前的運(yùn)算中已將范圍限制在 [-4,4],因此我們?cè)?位地址線的查找表中線性存放 [-4,4]的反正切函數(shù)值。根據(jù)計(jì)算可得,查找表的地址add與輸入變量y的關(guān)系為
在實(shí)際設(shè)計(jì)中,我們依然采用LPM參數(shù)化宏模塊例化LUT(lookup-table),即將生成的反正切函數(shù)數(shù)據(jù)存放在由嵌入式RAM構(gòu)成的ROM中,這樣可以節(jié)省大量邏輯單元。圖6給出了反正切函數(shù)模塊的實(shí)現(xiàn)框圖。
圖6 Simulink中反正切函數(shù)的實(shí)現(xiàn)
按照DSP Builder的設(shè)計(jì)流程,首先在Simulink中對(duì)設(shè)計(jì)模塊進(jìn)行仿真。然后進(jìn)行編譯綜合,選用Altera CycloneIII EP3C25芯片開發(fā)板進(jìn)行硬件仿真。該IP核在QuartusII中綜合后的結(jié)果見表1。系統(tǒng)采用批處理模式,每次處理200個(gè)數(shù)據(jù),輸入輸出數(shù)據(jù)寬度為24位。由于每次迭代運(yùn)算需22個(gè)時(shí)鐘周期,因此在系統(tǒng)輸入時(shí)鐘頻率為50MHz時(shí),對(duì)外部數(shù)據(jù)的處理速率約為1MHz,完全可以實(shí)現(xiàn)常規(guī)采樣率下語音信號(hào)的實(shí)時(shí)處理。
表1 FPGA硬件資源占用
實(shí)驗(yàn)中分別采用周期信號(hào)與語音信號(hào)驗(yàn)證IP核的有效性。在周期信號(hào)的驗(yàn)證中,我們將一段正弦信號(hào)與方波信號(hào)進(jìn)行混合,混合矩陣為混合后的信號(hào)如圖7(a)所示。為了便于仿真,我們將上述待處理的混合信號(hào)數(shù)據(jù)寫入hex文件,作為輸入端RAM的初始化數(shù)據(jù)。圖7(b)顯示了該IP核對(duì)混合信號(hào)的處理結(jié)果,可以看出,程序能夠正確的提取出原始正弦信號(hào)與方波信號(hào)。
圖7 周期信號(hào)分離試驗(yàn)
接下來,我們采用一路真實(shí)的語音信號(hào)與一路白噪聲信號(hào)的混合進(jìn)行驗(yàn)證。語音信號(hào)來源于SPIB(Signal Processing Information Base)數(shù)據(jù)庫[14],采樣率為44kHz,采樣點(diǎn)數(shù)為200個(gè)。混合矩陣仍為分離結(jié)果如圖8所示。其中,圖8(a)所示為語音信號(hào)與周期信號(hào)的混合信號(hào),圖8(b)所示為混合信號(hào)經(jīng)IP核處理后復(fù)原出的原語音信號(hào)和白噪聲信號(hào)。
從以上仿真結(jié)果中我們可以看出,無論對(duì)于人工合成的周期信號(hào)還是真實(shí)語音信號(hào),該IP核都能很好的完成NLPCA-RLS算法,對(duì)滿足盲信號(hào)模型數(shù)據(jù)進(jìn)行處理,達(dá)到分離的目的。
為了評(píng)價(jià)算法的性能,通常需要相應(yīng)的性能指標(biāo)。在獨(dú)立分量分析算法中,誤差指數(shù)E[15]是衡量算法收斂精度的常用指標(biāo),它用來表征算法對(duì)信道矩陣的估計(jì)值與真實(shí)值之間的相似性,相似性越大,E越小,信號(hào)分離性能越好
式中:cij——矩陣C=WA 的第i行、第j列的元素,A——信道混合矩陣,W——信道解混矩陣。
圖8 語音信號(hào)分離試驗(yàn)
在語音信號(hào)分離實(shí)驗(yàn)中,我們記錄了誤差指數(shù)E隨算法收斂次數(shù)的變化,并將其與算法的matlab仿真結(jié)果進(jìn)行了對(duì)比。為避免數(shù)據(jù)隨機(jī)性帶來的誤差,結(jié)果取1000次非重復(fù)實(shí)驗(yàn)平均值,如圖9所示。
圖9 IP核與matlab結(jié)果比較
從圖9中可以看出,隨著收斂次數(shù)的增加,E逐漸收斂,并與matlab結(jié)果趨近。但由于在硬件設(shè)計(jì)中為提高運(yùn)算速度,所有數(shù)據(jù)均采用24bit固定點(diǎn)類型,存在舍入誤差,因此最終結(jié)果與matlab理論值之間亦存在一定誤差。
本文提出了一種獨(dú)立分量分析中NLPCA-RLS算法的硬件方案,以IP核的形式在FPGA中實(shí)現(xiàn)。相比于傳統(tǒng)基于FastICA算法的模型,該方案不需要在每次迭代過程中使用全部樣本數(shù)據(jù),大大減少了對(duì)硬件資源中存儲(chǔ)空間的占用。系統(tǒng)建模時(shí)采用了Altera優(yōu)化的IP核和庫函數(shù),可以更好的發(fā)揮FPGA的數(shù)據(jù)處理能力。所有數(shù)據(jù)均采用24位固定點(diǎn)類型,既滿足常規(guī)數(shù)據(jù)處理精度要求,又提高了運(yùn)算速度。使用VHDL語言編寫的頂層系統(tǒng)狀態(tài)機(jī),使各運(yùn)算模塊更加簡(jiǎn)潔高效,數(shù)據(jù)處理速率能達(dá)到1MHz。系統(tǒng)能夠準(zhǔn)確完成盲信號(hào)分離功能,滿足工程設(shè)計(jì)中對(duì)實(shí)時(shí)性的要求,具有較高的實(shí)用價(jià)值。
[1]Shyu K K,LI M H.FPGA implementation of FastICA based on floating point arithmetic design for real-time blind source separation [C].International Joint Conference on the Neural Networks,2006:2785-2792.
[2]Shyu K K,LI M H,WU Y T,et al.Implementation of Pipelined FastICA on FPGA for Real-Time Blind Source Separation[J].IEEE Transactions on Neural Networks,2008,19(6):958-970.
[3]DU H,QI H,WANG X.Comparative study of VLSI solutions to independent component analysis [J].IEEE Trans Ind Electron,2007,54(1):548-558.
[4]Charoensak C,Sattar F.Design of low-cost FPGA hardware for real-time ICA-based blind source separation algorithm [J].EURASIP Journal on Applied Signal Processing,2005,doi>10.1155/ASP.2005.3076.
[5]Kim S J,Ken Umeno,Ryo Takahashi.FPGA implementation of EASI algorithm [J].IEICE Electron.Express,2007,22:707-711.
[6]Moreno L N O,Arce M A A,Lamont J G.Implementation of infomax ICA algorithm for blind source separation [C].Electronics,Robotics and Automotive Mechanics Conference,2008:447-451.
[7]HUANG W H,HUNG S H,CHUNG J F,et al.FPGA implementation of 4-channel ICA for on-line EEG signal separation [C].Biomedical Circuits and Systems Conference,2008:65-68.
[8]Thuong L T,Dien V N,LAN N H,et al.Independent component analysis applied to watermark extraction and its implemented model on FPGAs [C].Fifth IEEE International Symposium on Electronic Design,Test&Applications,2010:71-76.
[9]Hyvarinen A,Karhunen J,Erkki O.Independent component analysis[D].周宗譚,董國(guó)華,徐昕,等譯.北京:電子工業(yè)出版社,2007.
[10]Pierre Comon,Christian Jutten.Handbook of blind source separation:Independent component analysis and applications[D].Academic Press,2010.
[11]Aleksandr Nikolaevich Gorban,Donald C Wunsch.Principal manifolds for data visualization and dimension reduction [D].Berlin Heidelberg:Springer-Verlag,2007.
[12]ZHANG Zhilin,PI Yiming,SUN Zhijian.Independent component analysis based denoising technology [J].Journal of UEST of China,2005,34(3):296-299(in Chinese). [張智林,皮亦鳴,孫志堅(jiān).基于獨(dú)立分量分析的降噪技術(shù) [J].電子科技大學(xué)學(xué)報(bào),2005,34(3):296-299.]
[13]PAN Song,HUANG Jiye.EDA technology and VHDL [D].Beijing:Tsinghua University Press,2007(in Chinese).[潘松,黃繼業(yè).EDA技術(shù)與VHDL[D].北京:清華大學(xué)出版社,2007.]
[14]Signal processing society and the national science foundation.signal processing information base(SPIB)[EB/OL].http://www.spib.rice.edu/spib/select_noise.html,1995.
[15]MA Jiancang,NIU Yilong,CHEN Haiyang.Blind singal processing.beijing:National defence industial press,2006:88-89(in Chinese). [馬建倉(cāng),牛奕龍,陳海洋.盲信號(hào)處理[D].北京:國(guó)防工業(yè)出版社,2006:88-89.]