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