摘要:從語音文件中正確地讀取實際的語音數據是進行語音技術研究的首要任務,WAVE文件是語音文件的一種,它被廣泛地使用于語音技術研究中。該文分析討論WAVE文件的存儲結構,用C語言實現PCM編碼的WAVE文件的讀取,濾波以及存儲。
關鍵詞: WAVE文件;存儲結構;讀取;濾波
中圖分類號:TP37 文獻標識碼:A文章編號:1009-3044(2010)11-2750-02
Reading of Voice File and Software Implementation
XIAO Min-lei, XIAO Min-lian
(Department of Computer Science and Technology, Hunan Institute of Humanities, Science and Technology, Loudi 417000, China)
Abstract: It's the first task to read the real data from a voice file correctly. WAVE file is one kind of voice files and has been applied in voice technology research widely. This paper analyzes and discusses the memory structure of WAVE file, using C language realization of PCM-coded WAVE files to read, filter and storage.
Key words: WAVE file; memory structure; read; filtering
伴隨著計算機技術、軟件技術和儲存技術突飛猛進的發展,語音技術對計算機發展和社會生活的重要性日益顯示出來,它正在直接與辦公、旅游、通信等行業的語音咨詢與管理、工業控制、電話、電信系統的自動撥號、輔助控制與查詢等各種實際應用領域相接軌。因此研究語音技術有著重要的社會意義和經濟意義。WAVE文件是語音文件的一種,它廣泛地使用于語音技術研究中,當用其進行語音技術研究時,首先必須正確地提取語音文件的實際數據。
WAVE文件是語音文件中的一種,它被廣泛地使用在語音技術研究中,當用其進行語音技術研究時,必須正確提取語音文件中的實際數據,在MATLAB中有一個自帶函數可以返回實際語音數據,如使用其它語言進行程序開發時,就必須清楚WAVE語音文件的格式及其在計算機中的存儲結構,才能正確地讀取實際數據,本文先分析討論了WAVE文件的存儲結構,然后說明如何使用Visual c++ 6.0實現WAVE文件讀取及濾波等操作。
1 WAV文件
1.1WAVE文件的存儲結構[1]
WAVE文件作為多媒體中使用的聲波文件格式之一,它是以RIFF格式為標準的。RIFF是英文Resource Interchange File Format的縮寫,WAVE文件由文件頭和數據體兩大部分組成。其中文件頭又分為RIFF/WAV文件標識段和聲音數據格式說明段兩部分。
常見的聲音文件主要有兩種,分別對應于單聲道(11.025KHz采樣率、8Bit的采樣值)和雙聲道(44.1KHz采樣率、16Bit的采樣值)。采樣率是指:聲音信號在“模→數”轉換過程中單位時間內采樣的次數。采樣值是指每一次采樣周期內聲音模擬信號的積分值。對于單聲道聲音文件,采樣數據為8位的短整數(short int 00H-FFH);而對于雙聲道立體聲聲音文件,每次采樣數據為一個16位的整數(int),高8位和低8位分別代表左右兩個聲道。WAVE文件數據塊包含以脈沖編碼調制(PCM)格式表示的樣本。WAVE文件是由樣本組織而成的。在單聲道WAVE文件中,聲道0代表左聲道,聲道1代表右聲道。在多聲道WAVE文件中,樣本是交替出現的。表1為其中一種WAVE文件格式。
1.2 WAVE文件讀取程序實現
typedef struct
{WORD wFormatag;//編碼格式
WORD nChannls; //聲道數,單聲道為1,雙聲道為2;
DWORD nSamplesPerSec;//采樣頻率;
DWORD nAvgBytesperSec;//每秒的數據量;
WORD nBlockAlign; //塊對齊;
}WAVEFORMAT;
BYTE * GetData(Cstring *pString) //獲取聲音文件數據的函數,pString參數指向要打開的聲音文件;
{if (pString==NULL)
return NULL;
HMMIO file1;//定義HMMIO文件句柄;
file1=mmioOpen((LPSTR)pString,NULL,MMIO_READWRITE);//以讀寫模式打開
if(file1==NULL)
{MessageBox(\"WAVE文件打開失敗!\");
return NULL;}
char style[4];巧//定義一個四字節的數據,用來存放文件的類型
mmioSeek(file1,8,SEEK_SET);//定位到WAVE文件的類型位置
mmioRead(file1,style,4);
if(style[0]!='W'||style[1]!='A'||style[2]!='V'||style[3]!='E')
//判斷該文件是否為\"WAVE\"文件格式
{MessageBox(\"該文件不是WAVE格式的文件!\");
return NULL;}
PCMWAVEFORMAT format; //定義PCMWAVEFORMAT結構對象,用來判斷WAVE文件格式;
mmioSeek(file1,20,SEEK_SET);
//對打開的文件進行定位,指向WAVE文件的PCMWAVEFORMAT結構的數據;
mmioRead(file1,(char*)format,sizeof(PCMWAVEFORMAT));//獲取該結構的數據;
if(format.wf.nChannels!=2)//判斷是否是立體聲聲音;
{MessageBox(\"該聲音文件不是雙通道立體聲文件\");
return NULL;}
mmioSeek(file1,24+sizeof(PCMWAVEFORMAT),SEEK_SET);
//獲取WAVE文件的聲音數據的大小;
long size;
mmioRead(file1,(char*)size,4);
BYTE *pData;
pData=(BYTE*)new char[size]; //根據數據的大小申請緩沖區;
mmioSeek(file1,28+sizeof(PCMWAVEFORMAT),SEEK_SET); //對文件重新定位;
mmioRead(file1,(char*)pData,size);//讀取聲音數據;
mmioClose(file1, MMIO_FHOPEN); //關閉WAVE文件;
return pData; }
2 WAVE文件濾波
2.1 濾波算法[2]
語音濾波的最終效果度量是人耳的主觀感覺,所以在語音濾波中可以利用人耳感覺特性來減少運算的代價,利用自適應濾波器可以獲得令人滿意的解。
自適應橫向濾波器具有以下功能:
1) 按照某種自適應算法自動調節濾波系數的橫向濾波器:分別以W1(n)…Wn(n)表示各個濾波器所在時刻的權系數。
2) 調節這些系數的過程:首先自動調節濾波器系數的自適應訓練步驟,然后利用濾波系數加權延遲線抽頭上的信號來產生輸出信號,將輸出信號與期望信號進行對比,所得誤差值通過一定的自適應控制算法再來調整權值,以保證濾波器處在最佳狀態,達到實現濾波目的。
令 W(n)=[W1(n), W2(n),…, Wm(n)], x(n)=[x(n),x(n-1),…,x(n-m+1)]T
則輸出信號:y(n)=WT(n)x(n) (1)
誤差序列:e(n)=d(n)-y(n) (2)
其中d(n)為期望信號。顯然,自適應濾波器控制機理是用誤差序列e(n)按照某種準則和自適應算法對其系數{Wi(n)},=1,2,3,…m進行調節,最終使自適應濾波器的目標函數最小化達到最佳濾波狀態。按照均方誤差(MSE)準則定義:
ζ(n)=E[e2(n)](3)
將e(n)=d(n)-y(n)帶入上式,均方誤差函數重寫為:
ξ(n)=E[d2(n)]-2E[d(n)wT(n)x(n)]+E[wT(n)x(n)xT(n)w(n)] (4)
當濾波器系數固定時,均方誤差函數又可寫成:
ξ(n)=E[d2(n)]-2WTP+WTRW(5)
其中:R=E[X(n)XT(n)]是輸入信號的自相關矩陣;P=E[d(n)X(n)]是期望信號與輸入信號的互相關矢量;將上式對W求導,并令其等于零,同時假設R是非奇異的,由此可得最佳濾波系數W0為:W0=R-1P (6)
由式可見,均方誤差ξ(n)是權矢量{Wj(n)},i =1,2,…,M的二次函數它代表以{w,(n)},i =1,2,…,M為自變量的一個“超拋物面”,均方誤差ξ(n)達到最小值ξmin。幾何上這相當于超拋物面的最小點。在一般情況下,濾波器在迭代過程中或當輸入過程統計特性發生變化時,權矢量W并不正好等于W。,而是處于某一最佳值W(n)上。為了減小誤差,一個顯然的方法是找出該工作點處使均方誤差ξ(n)減小速率最大的方向,亦即梯度的負方向,然后令權矢量w(n)沿著梯度的負方向修正。令▽(n)代表n時刻的M×I維梯度矢量,則權矢量W(n+1)可用下列簡單遞歸關系計算:
W(n+1)=W(n)+1/2*u[-▽(n)](7)
式中,u是一個正實數,通常稱它為自適應收斂系數或步長因子。
根據梯度矢量定義,▽(n)可寫成:
(8)
可計算出濾波系數更新值:
W(n+1)=W(n)+u[P-RW(n)] (9)
上式是最陡下降法的數學公式,由此公式信號流程圖圖2。
2.2 最陡下降算法計算步驟
算法計算步驟如下:
1) 根據所處理信號的特征,選取濾波器的階數M及收斂因子u。
2) 令W(0)=0,W(0)表示一維數為M,各分量為0的向量。
3) for(k = M ; k<= N; k++)
X=[x(k),…,x(k-M+1)]T
y(k)=W(k)*X
e(k)=x(k)-y(k)
W(k+1)=W(k)+2*u*e(k)*X
3 結束語
本文分析討論WAVE文件的存儲結構以及其樣本數據的存儲結構,用C語言實現PCM編碼的WAVE文件的讀取,濾波以及存儲,得到了正確的結果。
參考文獻:
[1] WAV波形文件的結構及其應用實踐[J].微計算機信息,2005,21(8):114-119.
[2] 張賢達,保錚.通信信號處理[M].北京:國防工業出版社,2002:258-270.