李倩然,周 南
(電子科技大學 電子工程學院,四川 成都 610054)
在音頻處理中,均衡器可以改變音頻信號的頻響特性,從而彌補信號在傳輸過程中的缺陷或是達到特定的聲音處理效果。通常情況下,均衡器將音頻處理信號(20~20 K)按一定的規(guī)律分為10段,15段,25段或31段來進行調(diào)節(jié)。
常采用的均衡器算法是使用IIR或者FIR濾波器濾波的設(shè)計方法。這種方法有幾個不足之處:IIR濾波器具有反饋回路,會出現(xiàn)相位偏差;FIR濾波器會造成很大的時間延遲,這對于實時濾波是非常不利的。另外,如果使用IIR或者FIR濾波器,所調(diào)節(jié)的頻段越多,增加的濾波器的個數(shù)也越多,運算量也明顯增大。而通過傅里葉變換[1]設(shè)計均衡器,不但在濾波的過程中具有很大的優(yōu)越性,不存在相位誤差、時間延遲這些問題,對調(diào)節(jié)多段均衡程序運算量上也有明顯的減少。另外,這段程序是在TMS320DM642上進行的,該芯片的特點就是可以進行快速的乘法運算,因此,卷積等運算可以在芯片上高速的運行[2-3]。
均衡器的基本功能就是調(diào)節(jié)信號各段頻率的強弱,從而彌補信號在傳輸過程中的缺陷或是達到特定的聲音處理效果。因此為了達到這個目的,調(diào)節(jié)信號的各段頻率可以將輸入的信號進行以下處理:
1)對輸入的信號進行快速傅里葉變換,使得各個頻段的信號分開;
2)對需要變化的頻點及其周圍的頻點進行相應(yīng)的處理;
3)將處理后的信號進行傅里葉反變換,得到最后需要的信號。
快速傅里葉變換[4-5]的時域抽取方法是將輸入的信號按奇偶分開,打亂原來的順序,之后進行蝶形運算,以保證輸出的序列是按著時間順序排列的。分解過程遵循兩條規(guī)則:1)對時間進行偶奇分解,即碼位倒置;2)對頻率進行前后分解,即蝶形運算。
將長度為N的時域序列x(n)按n的奇偶分為兩組,變成兩個N/2序列
碼位倒置可以將輸入數(shù)據(jù)依照奇偶分開,如表1所示。
表1 碼位倒置Tab.1 Code bit inversion
2.2.1 蝶形運算的原理
蝶形變換是將處理的信號進行分級處理,逐次進行DFT變換,以減少復數(shù)的乘法減少運算次數(shù)。對于輸入x(n)序列奇偶按分開的兩個序列的DFT運算分別是
一個序列的DFT為
另一個序列的DFT為
蝶形運算的輸入和輸出:
2.2.2 蝶形運算的算法
蝶形運算是逐級運算累加實現(xiàn)的,在傳統(tǒng)的蝶形運算中,旋轉(zhuǎn)因子的N是保持一個固定的值而k是不斷變化的,第一級到第級中,k的變化是以2為底的冪指數(shù)的變化,而到第級時,k 的變化則是 0,1,…,(N/2)-1。如果依照k的這種變化規(guī)律,在第級時,就很難繼續(xù)依照前級進行變化。因此,根據(jù)以上分析,采用另外一種思路來對蝶形運算進行重新的整理。在旋轉(zhuǎn)因子中,N是每個蝶形單元輸入數(shù)據(jù)的個數(shù),k的變化規(guī)律是0,1,…,(N/2)-1,采用這種方法就可以有效的縮短代碼的長度,提高運行速度。圖1為蝶形運算流程圖。
圖1 蝶形運算流程圖Fig.1 Flow chart of butterfly operation
Block=1;
for (BlockSize=2; BlockSize <=NumSamples; BlockSize<<=1) {
double delta_angle=angle_numerator/BlockSize;
s2=sin(-2*delta_angle);
s1=sin(-delta_angle);
c2=cos(-2*delta_angle);
c1=cos(-delta_angle);
w=2*cm1;
for(I=0; I< NumSamples; I+=BlockSize) {
r2=c2;
r1=c1;
i2=s2;
i1=s1;
for(j=I,n=0;n< BlockEnd;j++,n++){
r0=w*r1– r2;
r2=r1;
r1=r0;
i0=w*i1– i2;
i2=i1;
i1=i0;
k=j+Block;
re=r0*RealOutData[k]– i0*ImagOutData[k];
im=r0*ImagOutData[k]+i0*RealOutData[k];
RealOutData[k]=RealOutData[j]– re;
ImagOutData[k]=ImagOutData[j]– im;
RealOutData[j]+=re;
ImagOutData[j]+=im;
}
}
BlockEnd=BlockSize;
}其中,Block是每一個蝶形單元輸入個數(shù)的一半即N/2,r0和i0分別是旋轉(zhuǎn)因子的實部和虛部。
對于頻點的調(diào)節(jié)是調(diào)節(jié)頻點周圍這一段的頻率幅度的大小,以最終達到調(diào)節(jié)頻率的目的[6]。為了防止在抽取頻點時,因某一點的調(diào)節(jié)范圍過大而使這一段的聲音聽起來不和諧,在對頻點進行調(diào)節(jié)時,采用的方法是調(diào)節(jié)該頻點及其附近的頻點以達到最終的調(diào)節(jié)效果。
算法的實現(xiàn):取頻率點周圍的點,將所取的點調(diào)節(jié)的范圍是該點與對應(yīng)頻率點的距離的反比,這樣就避免該點頻率的影響太強烈。算法流程如圖2所示。針對某一個頻點的處理的程序如下:
圖2 算法流程圖Fig.2 Flow chart of algorithm
a1=Mid-(i-1);
a2=i-Mid;
RealOutData[i-1]=d*a2*RealOutData[i-1];
ImagOutData[i-1]=d*a2*ImagOutData[i-1];
RealOutData[i]=d*a1*RealOutData[i-1];
ImagOutData[i]=d*a1*ImagOutData[i-1];
Mid為調(diào)節(jié)頻點對應(yīng)的頻率軸的位置,i為Mid相鄰近的后面的點。
本文提出的采用頻率濾波器對均衡器進行設(shè)計的方法,區(qū)別于其他的均衡器的實時濾波器的設(shè)計,既避免了IIR濾波器相位偏移的現(xiàn)象,又避免了FIR濾波器的延遲,因此對頻率濾波具有很好的效果。另外,由于處理采用頻域濾波,在處理音頻信號時可以只經(jīng)過一次傅里葉變換,就能處理各個頻段的信號,大大減少了數(shù)據(jù)的運算量,因此使用頻域濾波器可以更快捷、更高效地對數(shù)據(jù)進行處理。在使用該種方法進行濾波處理時,應(yīng)注意采樣點個數(shù)的選取,可以根據(jù)處理器緩存的大小決定采樣點的個數(shù),從而可達到更好的處理效果。
[1] 胡廣書.數(shù)字信號處理[M].北京:清華大學出版社,2003:171-180.
[2] Texas Instruments.TMS320C6000 DSP Cache User’s Guide[EB/OL].2003.http://focus.ti.com/lit/ug/spru656a/spru656a.pdf.
[3] 王興國,蔣偉峰,劉濟林.使用TI專用音頻DSP設(shè)計實時聲效處理系統(tǒng)[J].電子技術(shù)應(yīng)用, 1999,25(10)39-41.WANG Xing-guo, JIANG Wei-feng, LIU Ji-lin.Audio DSP design using the TI-specific real-time sound processing system [J].Application of Electronic Technique, 1999,25(10):39-41.
[4] 稱佩青.數(shù)字信號處理教程[M].2版.北京:清華大學出版社,2001:185-199.
[5] 董志,張羿猛,黃芝平,等.基于FFT流水線的快速實現(xiàn)方法與技術(shù)[J].測試技術(shù)學報,2009,23(5):9-13.DONG Zhi, ZHANG Yi-meng, HUANG Zhi-ping, et al.Theory and application of FFT based on pipelined stream[J].Journal of Test and Measurement Technology,2009, 23(5):9-13.
[6] 肖正安.基于Matlab的數(shù)字均衡器的設(shè)計[J].湖北第二師范學院學報,2008,25(8):15-19.XIAO Zheng-an.The design of Matlab-based equalizer[J].Journal ofHubeiUniversity ofEducation,2008,25 (8):15-19.