WAV文件格式的應用舉例

多媒體技術近年來發展很快,較好品質的聲卡可以提供16位的立體聲及44KHZ的播放錄製能力,它不僅可以提供原音逼真的取樣,其合成的音質也十分理想,有的聲卡還加入了數字信號處理器,可編程控制的DSP具有強大的運算能力,它可以用來作聲音信息的壓縮和一些特殊效果的處理。具有此功能的聲卡提供的WAV文件提供的語音信息可以滿足語音特徵識別的要求。

  1.1 RIFF文件和WAV文件格式

  在Windows環境下,大部分的多媒體文件都依循着一種結構來存放信息,這種結構稱爲"資源互換文件格式"(Resources lnterchange File Format),簡稱RIFF。例如聲音的WAV文件、視頻的AV1文件等等均是由此結構衍生出來的。RIFF可以看做是一種樹狀結構,其基本構成單位爲chunk,猶如樹狀結構中的節點,每個chunk"辨別碼""數據大小""數據"所組成。

  辨別碼由4ASCII碼所構成,數據大小則標示出緊跟其後數據的長度(單位爲Byte),而數據大小本身也用掉4Byte,所以事實上一個chunk的長度爲數據大小加8。一般而言,chunk本身並不允許內部再包含chunk,但有兩種例外,分別爲以"RIFF""L1ST"爲辨別碼的chunk。而針對此兩種chunkRIFF又從原先的"數據"中切出4Byte 4Byte稱爲"格式辨別碼",然而RIFF又規定文件中僅能有一個以"RIFF"爲辨別碼的chunk

  只要依循此一結構的文件,我們均稱之爲RIFF檔。此種結構提供了一種系統化的分類。如果和MSDOS文件系統作比較,"RIFF"chunk就好比是一臺硬盤的根目錄,其格式辨別碼便是此硬盤的邏輯代碼(C:或D),而"L1ST"chunk即爲其下的子目錄,其他的chunk則爲一般的文件。至於在RIFF文件的處理方面,微軟提供了相關的函數。視窗下的各種多媒體文件格式就如同在磁盤機下規定僅能放怎樣的目錄,而在該目錄下僅能放何種數據。

  WAVWAVEFORM(波形)的縮寫。聲音文件的結構如圖1所示,"RIFF"的格式辨別碼爲"WAVE"。整個文件由兩個chunk所組成:辨別碼"fmt"(注意,最後一個是空白字符!)"data"

  在"fmt"chunk下包含了一個PCMWAVEFORMAT數據結構,其定義如下:

  typedef struct pcmwaveformat - tag {

  WAVEFORMAT wf

  WORD wBitsPerSample

  } PCMWAVEFORMAT

  typedef struct waveformat - tag {

  WORD wFormatTag ;

  WORD nChannels;

  DWORD nSamplesPerSec;

  DWORD nAvgBytesperSec;

  WORD nBlockAlign;

  } WAVEFORMAT

  其意義分別爲:

  wFormatTag:記錄着此聲音的格式代號,例如WAVE_FORMAT_PCMWAVE_F0RAM_ADPCM等等。

  nChannels:記錄聲音的頻道數。

  nSamp1esPerSec:記錄每秒取樣數。

  nAvgBytesPerSec:記錄每秒的數據量。

  nBlockA1ign:記錄區塊的對齊單位。

  wBitsPerSample:記錄每個取樣所需的位元數。

  "data"Chunk包含真正的聲音數據。Window目前僅提供WAVE_FORMAT_PCM一種數據格式,所代表的意義是脈派編碼調變(Pu1se Code Modulation)。針對此格式,Windows定義了在"data"chunk中數據的存放情形,圖2中列出了四種不同頻道數及取樣所需的位元數以及位元位置的安排。

  "RIFF" 頻道0 頻道0 頻道0 頻道0

  xxxx nChannels=1,wBitsPerSample=8

  "WAVE" 0() 頻道1() 頻道0() 頻道1 ()

  "fmt "

  nChannels=2,wBitsPerSample=8

  sizeof(PCMWAVEFORMAT)

  struct of PCMWAVEFORMAT 頻道0(低位) 頻道0(高位) 頻道0(低位)頻道0(高位)

  "data" nChannels=1,wBitsPerSample=16

  xxxx 頻道0(低位) 頻道0(高位) 頻道0(低位)頻道0(高位)

  (低位) (高位) (低位) (高位)

  wave form data

  nChannels=2,wBitsPerSample=16

  圖1 WAV文件結構 2 PCM文件中位元安排方式

  第一排表示單聲道8位元,第二排表示雙聲道8位元,第三排表示單聲道16位元,第四排表示雙聲道16位元。8位元代表音量大小由8個位元所表示,16位元則代表音量大小由16個位元所表示。理論上8位元可以表示025516位元可表示065536,不過windows卻定16位元其值的範圍從-3216832167。此外尚有一點要注意的是,0並不一定代表無聲,而是由中間的數值來決定,也就是在8位元時爲12816位元時爲0纔是無聲。所以,若程序設計時需放入無聲的數據,糯特別注意聲音格式是16或是8位元,以放入適當的值。

  1.2 WAV文件信息的具體應用

  WAV文件中包括了對原始聲音的高速率採樣,並且以WAVE_PCM_FORMAT脈派編碼調變格式,我們可以在VISUAL C++程序中實現,在讀出WAVEHDR文件頭之後,下面就是原始聲音的高速率採樣信息,我們可以對它作多方面的信息處理。

  1.2.1 波形顯示。

  我們可以以時域-幅度的方式顯示出原始聲音的波形,這是最簡單同時也是最直接的信息處理方式。在時域範圍內,我們可以觀察該信號波形是否連續,中間是否有跳變等。

  1.2.2頻譜顯示

  我們可以以頻域-幅度的方式顯示出原始聲音的頻譜,在對原始信號經過FFT變換之後,可以得到該信號的頻譜,進而得到該信號的能量集中帶,分佈特徵,譜對稱係數等等。

  1.2.3 用於語音信號識別

  講話者的個體識別是語音信號處理的一個重要內容,但它的一個前提條件是必須提供語音信號的數字波形,通常的方法是將原始的語音信號進行放大、抗混疊濾波、A/D採樣、數值編碼,最終得到語音信號的數字波形,通常多采用硬件處理,費時費力,如果我們藉助非常成熟的聲卡技術,將WAV文件打開,就非常方便地得到語音信號的數字波形,爲下一步進行語音信號識別提供良好的前端預處理。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章