羅海濤
(廣東外語外貿大學信息學院,廣東 廣州 510420)
語言是人類特有的能力,是人類信息交流最方便、最快捷的一種方式。[1]信息技術和計算機技術的發(fā)展,為人們用計算機處理語音信號提供了方便。通過聲音傳感器,人們把人類語音轉換為連續(xù)的語音信號,這是一種電信號。再通過采樣技術,對連續(xù)的語音信號采樣,得到時間和幅度都離散的采樣數(shù)據(jù)。采樣數(shù)據(jù)是離散的數(shù)據(jù),便于計算機保存、傳輸和加工處理。wav文件格式是一種重要的數(shù)字音頻文件格式,是目前應用很廣泛的一種音頻格式。相比于其他格式如MP3、MP4、RAM等壓縮效率更高的音頻文件格式,wav文件沒有采用壓縮技術,因而其文件要大很多,一般都在幾兆字節(jié),甚至更大。[2]本文處理的語音信號采樣文件都是wav格式。語音信號的處理包括語音信號的特征分析、語音信號的線性預測分析、語音信號的編碼、語音的合成、語音的識別。[3]
語音信號的特征可以應用于語音的基音周期估計、語音共振峰估計、語音識別、說話人識別等領域。語音信號分析包括時域特征分析、頻域特征分析。時域特征包括短時能量、短時過零率、短時自相關。時域特征應用于語音的端點檢測、語音的分割等。語音信號的頻域特征包括語音信號的頻譜、相位譜、復倒譜。這些頻域特征參數(shù)同樣可應用于語音的識別、處理、分割等領域。[4]
本文采用快速傅里葉(FFT)算法,計算語音采樣數(shù)據(jù)的頻譜和相位譜,為下一步的語音信號處理做準備。
語音信號的頻譜是語音信號在各頻率的幅度譜。如果是連續(xù)時間信號,則通過傅里葉變換可以得到該信號的頻譜,其頻譜也是連續(xù)的函數(shù)。為了用計算機處理語音信號的頻譜,只能對語音信號進行采樣。采樣就是離散化,在時間上離散,在幅度上也離散。離散化后再進行傅里葉變換得到信號的頻譜。離散傅里葉變換DFT正是這樣一種在時域和頻域都離散的變換,其結果是信號的離散的頻譜。
上式中,x(n)是離散化的語音信號,長度為稱為旋轉因子。該式是N個點的離散傅里葉變換,得到N點的離散頻譜[5]。
WN是復數(shù),因此由式(1)計算每個X(k)都需要做N次復數(shù)乘法和N- 1次復數(shù)加法運算,總共需要計算N個點,因此,完成一次DFT變換總共需要N2次復數(shù)乘法和N(N- 1)次復數(shù)加法運算,運算量非常巨大。特別是在語音信號處理時,其離散點數(shù)通常很多,例如,一個英文單詞“important”,按照正常語速朗讀,當采樣頻率為44100Hz時,如果沒有進行端點檢測,采樣數(shù)據(jù)可超過46700;即使通過端點檢測,把開始和結束端點以外的采樣數(shù)據(jù)去除,剩余的有效語音采樣數(shù)據(jù)也超過39000。這樣大的數(shù)據(jù)量和運算量,很難進行實時處理,所以通常采用快速傅里葉算法FFT來計算語音信號的頻譜。
FFT算法分為按時間抽取的基-2算法和按頻率抽取的基-2算法兩種,這兩種算法思路類似,運算量相同。本文采取按時間抽取的基-2算法,在Visual C++環(huán)境下編程實現(xiàn)。
按時間抽取的基-2FFT算法的基本原理是在時間域把采樣數(shù)據(jù)平均分為兩組,分別是偶數(shù)組和奇數(shù)組,每組分別進行DFT運算,再合并為最終的結果。而實際做的時候,這兩組進一步平均分為4組,4組再進一步平均分為8組,這樣一直分下去,直到每一組只有兩個采樣數(shù)據(jù)為止。這里有個前提條件是,原始采樣數(shù)據(jù)個數(shù)必須是2的冪,即N= 2M,否則需要通過補零的辦法,湊夠2的冪。
從分解過程可以看出,最后分解到每組只有2個采樣數(shù)據(jù),這兩個數(shù)據(jù)進行所謂的蝶形運算,生成下一步需要的蝶形運算數(shù)據(jù)。以8個采樣數(shù)據(jù)的FFT運算為例,其計算路徑如圖1所示。
圖1 八點采樣數(shù)據(jù)的FFT運算路徑
圖中,左邊輸入的是8個采樣數(shù)據(jù),經過FFT運算,右邊得到8個結果數(shù)據(jù)。其中的兩點DFT,以最上面的為例,它的輸入x(0)和x(4) ,其上面的輸出為:
下面的輸出為:
從圖中可以看出,輸出的運算結果按照十進制順序X(0)、X(1)、X(2)……X(7) ,但是輸入采樣數(shù)據(jù)的次序不是按照x(0)、x(1)、x(2)……x(7)的順序,而是看上去很“亂”的一個次序。其實把這個輸入數(shù)據(jù)的次序轉換為二進制,就可以發(fā)現(xiàn)它不僅不“亂”,而且是有規(guī)律的。這個規(guī)律就是所謂的“倒位序”。
十進制數(shù)0到7的二進制數(shù),及其相應的倒位序如表1所示。
表1 0—7的二進制數(shù)及其倒位序
實際的采樣數(shù)據(jù)個數(shù)往往很多,一般取2的冪,但獲得倒位序的方法是相同的。有了倒位序,進行FFT的另一個重要的參數(shù)是蝶形運算上下兩個節(jié)點的間距以及旋轉因子WN的變化規(guī)律。從圖1可以看出來,第1級蝶形運算(圖中的2點DFT框)旋轉因子只有一個,上下兩個節(jié)點之間的間距為1。第2級蝶形運算旋轉因子有和兩個,上下兩個節(jié)點之間的間距為2。第3級蝶形運算旋轉因子有、、和共4個,上下兩個節(jié)點之間的間距為4。從中可以總結出來規(guī)律,設參與運算的采樣數(shù)據(jù)個數(shù)總共有N= 2M,則蝶形運算的級數(shù)為M級。第M級(最后一級)的旋轉因子為、、……以及共M個,上下兩個節(jié)點之間的間距為N/2 。第M- 1級的旋轉因子為第M級的偶數(shù)序號的旋轉因子,上下兩個節(jié)點之間的間距為N/4 。依此類推,第1級的旋轉因子只有一個,上下兩個節(jié)點之間的間距為1。
考慮到語音信號的采樣數(shù)據(jù)量很大,一個單詞的數(shù)據(jù)量都接近4萬,因此,為了獲得語音的頻譜,先對語音信號分幀,把采樣數(shù)據(jù)等分為多幀,每幀數(shù)據(jù)個數(shù)相同,這樣便于處理。分幀相當于在時域給語音信號施加一個矩形窗。分幀后再計算每一幀數(shù)據(jù)的FFT變換,這樣得到每一幀的頻譜。
綜上所述,由FFT計算語音信號頻譜的運算過程如下:
(1)采樣數(shù)據(jù)分幀,每幀長度相同,幀長取2的整數(shù)次方;
(2)根據(jù)幀長確定倒位序;
(3)取得第一幀采樣數(shù)據(jù),加窗,補零使幀長為2的整數(shù)次方;
(4)按照倒位序調換該幀采樣數(shù)據(jù)的次序,注意第1個和最后一個采樣數(shù)據(jù)位置不變;
(5)計算幀數(shù)據(jù)的第1級蝶形,即圖(1)中的兩點DFT框,旋轉因子取為;
(6)由該級蝶形的輸入數(shù)據(jù),計算該級蝶形輸出數(shù)據(jù),分別計算實部和虛部;
(7)蝶形的級數(shù)加1;
(8)判斷級數(shù)是否等于M,若等于M,轉第(10)步;
(9)計算本級蝶形的旋轉因子,轉第(6)步;
(10)數(shù)據(jù)幀序號加1;
(11)判斷幀序號是否達到最大,若是,表明所有幀數(shù)據(jù)處理完畢,結束;
(12)轉第(3)步。
上述運算過程完成了一個語音文件的所有幀的FFT運算,得到了每一幀數(shù)據(jù)的頻譜。
本文在VC++環(huán)境下,編程對英文單詞進行分幀以及FFT變換,得到相應的幀頻譜和相位譜。
第一個對單詞“dictionary”的音頻文件進行處理,首先進行端點檢測,去除起始端點和結束端點之外的采樣數(shù)據(jù),以減少需要處理的數(shù)據(jù)量。再分幀并進行FFT變換,以獲得每幀的頻譜和相位譜,分幀結果如下:
Total # of samples: 33547
Bits per sample: 16
Sample Rate: 44100
Frame length: 20.58(ms).= 907(points)
Frame shift: 0.7529 = 682(points)
Total # of frames: 49
Last frame, # of speech data (iNLast=): 811(points)
data window style: Rectangle(default) iWinStyl= 1
Frame length for FFT : 1024 = 2 ^ 10
分幀后畫出語音波形、選中第一幀并畫出該幀語音波形,再進行FFT變換得到頻譜及相位譜如圖2所示。
圖2 “dictionary”語音及其第1幀波形及頻譜和相位譜
第2幀運算結果如圖3所示。
圖3 “dictionary”第2幀波形及頻譜和相位譜
第30幀運算結果如圖4所示。
圖4 “dictionary”第30幀波形及頻譜和相位譜
其他語音音頻文件的運算結果不再一一列舉。
計算機處理語音信號,必須采用時域和頻域都離散的形式。而語音信號離散化后,實際上就是一些采樣數(shù)據(jù),其處理方式需要采用數(shù)字信號處理技術。時域處理可以獲得信號的時域特征,例如幀能量、幀過零率等等。而頻域處理獲得頻域參數(shù),例如頻譜、相位譜,這些頻域參數(shù)可以用在語音信號數(shù)字濾波器的設計、語音語譜圖的形成等領域。