聲音的基礎知識1

一、前言

當前Visual C++相關的編程資料中,無論是大部頭的參考書,還是一些計算機雜誌,對聲音文件的處理都是泛泛的涉及一下,許多編程愛好者都感到對該部分的內容瞭解不是很透徹,本文希望能夠給剛剛涉及到聲音處理領域的朋友們起到一個引路的作用,幫助他們儘快進入聲音處理的更深奧空間。

當前計算機系統處理聲音文件有兩種辦法:一是使用現成的軟件,如微軟的錄音機、SoundForge、CoolEdit等軟件可以實現對聲音信號進行錄音、編輯、播放的處理,但它們的功能是有限的,爲了更靈活,更大限度地處理聲音數據,就不得不使用另外一種方法,既利用微軟提供的多媒體服務,在Windows環境下自己編寫程序來進行聲音處理來實現一些特定的功能。下面就開始介紹聲音文件的格式和在Windows環境下使用Visual C++開發工具進行聲音文件編程處理的方法,本文所有的程序代碼都在Windows2000、Visual C++6.0環境下編譯通過,運行正常。

二、RIFF文件結構和WAVE文件格式

Windows支持兩種RIFF(Resource Interchange File Format,"資源交互文件格式")格式的音頻文件:MIDI的RMID文件和波形音頻文件格式WAVE文件,其中在計算機領域最常用的數字化聲音文件格式是後者,它是微軟專門爲Windows系統定義的波形文件格式(Waveform Audio),由於其擴展名爲"*.wav",因而該類文件也被稱爲WAVE文件。爲了突出重點,有的放矢,本文涉及到的聲音文件所指的就是WAVE文件。常見的WAVE語音文件主要有兩種,分別對應於單聲道(11.025KHz採樣率、8Bit的採樣值)和雙聲道(44.1KHz採樣率、16Bit的採樣值)。這裏的採樣率是指聲音信號在進行"模→數"轉換過程中單位時間內採樣的次數。採樣值是指每一次採樣週期內聲音模擬信號的積分值。對於單聲道聲音文件,採樣數據爲八位的短整數(short int 00H-FFH);而對於雙聲道立體聲聲音文件,每次採樣數據爲一個16位的整數(int),高八位和低八位分別代表左右兩個聲道。WAVE文件數據塊包含以脈衝編碼調製(PCM)格式表示的樣本。在進行聲音編程處理以前,首先讓我們來了解一下RIFF文件和WAVE文件格式。

RIFF文件結構可以看作是樹狀結構,其基本構成是稱爲"塊"(Chunk)的單元,每個塊有"標誌符"、"數據大小"及"數據"所組成,塊的結構如圖1所示:

塊的標誌符(4BYTES)
數據大小 (4BYTES)
數據
圖一、 塊的結構示意圖

從上圖可以看出,其中"標誌符"爲4個字符所組成的代碼,如"RIFF","LIST"等,指定塊的標誌ID;數據大小用來指定塊的數據域大小,它的尺寸也爲4個字符;數據用來描述具體的聲音信號,它可以由若干個子塊構成,一般情況下塊與塊是平行的,不能相互嵌套,但是有兩種類型的塊可以嵌套子塊,他們是"RIFF"或"LIST"標誌的塊,其中RIFF塊的級別最高,它可以包括LIST塊。另外,RIFF塊和LIST塊與其他塊不同,RIFF塊的數據總是以一個指定文件中數據存儲格式的四個字符碼(稱爲格式類型)開始,如WAVE文件有一個"WAVE"的格式類型。LIST塊的數據總是以一個指定列表內容的4個字符碼(稱爲列表類型)開始,例如擴展名爲".AVI"的視頻文件就有一個"strl"的列表類型。RIFF和LIST的塊結構如下:

RIFF/LIST標誌符
數據1大小
數據1 格式/列表類型
數據
圖二、RIFF/LIST塊結構

WAVE文件是非常簡單的一種RIFF文件,它的格式類型爲"WAVE"。RIFF塊包含兩個子塊,這兩個子塊的ID分別是"fmt"和"data",其中"fmt"子塊由結構PCMWAVEFORMAT所組成,其子塊的大小就是sizeofof(PCMWAVEFORMAT),數據組成就是PCMWAVEFORMAT結構中的數據。WAVE文件的結構如下圖三所示:

標誌符(RIFF)
數據大小
格式類型("WAVE")
"fmt"
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT
"data"
聲音數據大小
聲音數據
 圖三、WAVE文件結構圖  
PCMWAVEFORMAT結構定義如下: Typedef struct
{
WAVEFORMAT wf;//波形格式;
WORD wBitsPerSample;//WAVE文件的採樣大小;
}PCMWAVEFORMAT;
WAVEFORMAT結構定義如下:
typedef struct
{
WORD wFormatag;//編碼格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
WORD nChannls;//聲道數,單聲道爲1,雙聲道爲2;
DWORD nSamplesPerSec;//採樣頻率;
DWORD nAvgBytesperSec;//每秒的數據量;
WORD nBlockAlign;//塊對齊;
}WAVEFORMAT;
"data"子塊包含WAVE文件的數字化波形聲音數據,其存放格式依賴於"fmt"子塊中wFormatTag成員指定的格式種類,在多聲道WAVE文件中,樣本是交替出現的。如16bit的單聲道WAVE文件和雙聲道WAVE文件的數據採樣格式分別如圖四所示:
16位單聲道:

 

16位單聲道:

採樣一 採樣二 ……
低字節 高字節 低字節 高字節 ……

  16位雙聲道:

採樣一 ……
左聲道 右聲道 ……
低字節 高字節 低字節 高字節

圖四、WAVE文件數據採樣格式 gigi_miao

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