1 引言 改變聲音信號的音調是許多商用設備的一種功能,最典型的應屬卡拉OK機了。由于發(fā)音音調高低因人而異,人們希望伴奏音樂的音調適合自己的嗓音,因此卡拉OK機中設計了專門的硬件來實現(xiàn)這一功能。例如雅馬哈公司的用于數(shù)字變調的大規(guī)摸集成電路 YSS222D和YSS216B,內部集成了A/D,D/A和數(shù)字信號處理器,利用采樣和重放數(shù)據(jù)時速度的不同來實現(xiàn)變調。功能,重放比采樣速度快則升調,反之則降調。另外,為了使播放時間不變,還需對數(shù)據(jù)段進行復制或刪除。由于商業(yè)保密的需要,具體算法未公開,據(jù)可詢資料實現(xiàn)的系統(tǒng),不能有效解決因復制或刪除數(shù)據(jù)帶來的相位不連續(xù)問題。 當前,聲卡已成為計算機的基本配置,但無變調功能,為彌補這一缺憾,可以采用件的方法對聲音文件重新編碼,使聲卡回放時音調改變。另外,數(shù)字音頻工作站也需要軟件實現(xiàn)變調功能。因此筆者討論了3種軟件實現(xiàn)算法,圍繞著如何變調而不變時間,以及如何解決相位不連接問題,從變調原理著手,討論了時域實現(xiàn)的理論依據(jù),最后找到了一種有效的變調方法-- 頻域處理法,實驗證實效果良好。 2 變調的樂理基礎 聲音是由物體振動產(chǎn)生的,聲音的基本要素有:音調、音強和音色。樂音體系根據(jù)振動頻率即音調的不同,將樂音分成音級,基本音級廣泛采用CDEFGAB這8個字母命名,某音級與往上數(shù)8個音級之間的距離稱為"純八度",世界上普遍采用的12平均律將一個純八度分成12個均等的半音,相鄰兩個半音間的物理振動頻率相差21/12倍,也就是說各半音間的振動頻率成等比關系,一個純八度頻率相差2倍。 如果將信號中的所有頻率成分升高或降低21/12倍,就能使音調升高或降低一個半音。假設原信號頻率為f,變調后頻率為f,二者的關系應該滿足 f=fx2d/12, d=±1 ,±2,±3 (1) 當d>0時,升調,反之,降調;d每變化1,音調升高或降低一個半音。 3 時域實現(xiàn)的依據(jù)及存在的問題 一種實現(xiàn)變調的作法,是采用硬件實現(xiàn)相似的辦法,即改變WAV文件頭中有關采樣率的信息。如果采樣率提高,則聲卡回放速度加快,產(chǎn)生升調的效果,同時回放時間變短;反之,產(chǎn)生降調的效果,回放時間變長。為保持時間不變,以幀為單位,利用信號的短時周期性,升調時將幀內后部數(shù)據(jù)段復制,降調時將幀內后部數(shù)據(jù)段刪除,圖1畫出了一幀的數(shù)據(jù)處理情況。可以看到,若是升調,幀間數(shù)據(jù)是連續(xù)的,但由于數(shù)據(jù)段的復制,幀內數(shù)據(jù)段間相位不連續(xù);若是降調,幀內數(shù)據(jù)連續(xù),但幀間數(shù)據(jù)相位不連續(xù),因此聲音質量必然受到影響,產(chǎn)生喀嚓聲。 另一種方法是,采用時域抽選和內插[4]。下面分析抽選和內插的頻譜,看如何實現(xiàn)變調。抽選表示成下式 Xd[n]=[nM] (2) 表示每M個采樣值選1個,其余M-1個舍棄,則信號長度縮短為1/M。抽選后信號頻譜和原信號頻譜間的關系為 1 M-1 Xd(ejω)=-Σ X[ej(ω/M-2πi/M (3) M i=0 圖2所示粗線為M=2的抽選信號頻譜,粗實線為M=2的抽選信號頻譜,可以看出,抽選后信號的頻率成分均為原來的2倍,所以能實現(xiàn)升調。為防止抽選后頻譜混疊,抽選前必須作抗混疊數(shù)字低通濾波,截止頻率為π/M。 再看看內插的頻譜變化。內插時域表示成 Xi[n]={x[n/L,n=O,±L,+2L,+3L, ... (4) 0, 其它 表示每兩個采樣值中插入L-1個零,整個信號長度增加為L倍。內插后信號頻譜和原信號頻譜間的關系為 Xi(ejω)=X(ejLω) (5) 圖2虛線所示為L=2的內插信號頻譜,可以看出,所有頻率成分均為原信號的1/2,所以能實現(xiàn)降調。為不產(chǎn)生鏡像頻率成分,內插后必須作反鏡像數(shù)字低通濾波,截止頻率π/L,也可用線性內插取代插零,而無須反鏡像濾波。 抽選和內插后的數(shù)據(jù)量同樣會變短或變長,下面來推導保持數(shù)據(jù)量不變的具體實現(xiàn)方法。根據(jù)上述抽選和內插的頻譜變化情況,反推時域變化過程:若將信號作快速離散傅里葉變換(FFT),將譜線沿頻率軸擴張或收縮,再作反變換(IFFT),得到的信號應該是被升調或降調,并且數(shù)據(jù)量保持不變。 非整數(shù)倍的變調可由抽選和內插結合實現(xiàn),同樣可以采用數(shù)據(jù)段的復制或刪除的辦法保持數(shù)據(jù)量即回放時間不變,其系統(tǒng)結構如圖3所示。但對于復制或刪除數(shù)據(jù)后段間相位的不連續(xù)性問題,有些資料[3]提出找出信號的基音周期,以基音周期為復制或刪除單位,并幀間重疊處理,也不能從根本上解決相位問題。 4 頻域實現(xiàn)的算法研究 現(xiàn)在考慮采用頻域實現(xiàn)來解決相位問題。 首先采用頻譜伸展的辦法得到升調的信號,如圖4所示,(a)為原始信號波形及FFT的幅度和相位圖,(b)為將原始信號的FFT譜線向高頻伸展一倍,中間內插零,再IFFT得到信號波形及FFT幅度和相位圖,情況和時域抽選一樣。然后考慮將頻譜伸展過程中的譜線內插零改成線性內插,如(c)所示,可見信號波形段間能很好地吻合,但波形失真較大。最終發(fā)現(xiàn)結合插零和線性內插,低頻插零,高頻線性內插,既能保證波形失真較小又能在兩段相連處較好地過濾,如(d)所示。 對于降調,圖5(a)是2幀原始信號波形及后一幀的FFT幅度圖,圖5(b)采用FFT譜線向低頻收縮,再IFFI,得到的波形和時域內插法一樣,改進措施見圖5(c),被處理的連續(xù)兩幀信號間有一部分重疊,得到的兩幀信號波形便能很好地過渡。 因此,要實現(xiàn)式(1)任意倍頻率的變調,令α=2d/A2,采用以下公式。為簡單起見,低頻高頻均線性內插: X[K]=FFT[x(n)], k=0,1,...N-1 (6) y[n]=IFFT[Y(K)],n=0,1,...N-1 (8) 其中N是幀長,int()表示取整,min()表示取較小值。注意,僅僅對于降調a 另外幀長,即被處理的數(shù)據(jù)長度也必須適當,如果太短,會造成數(shù)據(jù)的復制和刪除太過頻繁;過長,又不符合短時周期性,明顯地感到聲音的多次重復或被打斷。經(jīng)過實驗表明,幀長取4000點左右比較合適,對于采樣率44.1 kHz的音頻信號是0.1 s的數(shù)據(jù)量,4 000點的FFT使頻譜取樣間隔為10Hz左右。 5 結束語 實現(xiàn)變調的基本原理是改變信號的頻率成分,可以通過時域抽選或內插實現(xiàn),但為保持時間不變,每幀要復制或刪除部分數(shù)據(jù)段,由此帶來相位不連續(xù)從而影響聲音質量。文中提出的頻域法,根據(jù)變調的原理,將FFT譜線向高頻或低頻搬移,再作IFFT得到時域信號,若升調譜線搬移過程中采用線性內插,降調采用時域幀間重疊,能消除數(shù)據(jù)段的不連續(xù)問題,改善變調后的聲音質量。頻域實現(xiàn)無須低通抗混疊濾波或低通反鏡像濾波,且FFT是快速算法,假設采用如ADSP2181或TMS320C54X,乘法運算占用單指令周期的DSP芯片,運算量小于1 MIps,實時運算不成問題。可見,頻域法是一種有效可行的辦法。 |