一、基本原理
- 音頻信號
通常將人耳可以聽到的頻率在20hz-20khz的聲波稱爲聲音信號,聲音振動被拾音器轉化爲的電信號稱爲音頻信號。人說話的信號頻率在300hz到3000hz,將該頻段的信號稱爲語音信號。 - 壓縮的可行性
聲音信號中存在大量的冗餘信息,在不同的分析域冗餘的表現不同,結合時域和頻率域可以較好的去除冗餘。在時域,信號的幅度分度非均勻,小幅度樣值出現概率比大幅度樣值出現概率高;語音信號變化比較緩慢,各信號樣值間的相關性較強,可以用差分編碼去除冗餘。在頻域,長時功率譜函數分佈非均勻,低頻能量高,高頻能量低。
聲音中存在一些人耳感覺不到的部分,根據人耳的心理聽覺模型可以找出這部分冗餘信息,並把它去除掉,而不影響人的聽覺效果。 - MPEG-1 層二編碼器原理
多相濾波器組:將pcm樣本變換到32個子帶的頻域信號,如果輸入的採樣頻率爲48khz,那麼子帶寬度爲48/(2*32)=0.75hz;其中48/2表示信號的最高頻率。
心理聲學模型:計算信號中不可感知的部分,利用人耳的掩蔽效應,找到聲音信號中冗餘的部分。
比特分配器:根據心理聲學模型的計算結果,爲每個子帶信號分配比特數。
裝幀:根據MPEG-1的編碼格式產生兼容的比特流。
二、實驗步驟
- 理解程序設計的整體框架
- 理解感知音頻編碼的設計思想
- 理解心理聲學模型的實現過程
- 理解碼率分配的實現思路
- 輸出音頻的採樣率和目標碼率
- 選擇其中一個數據幀輸出該幀所分配的比特因子和比特分配結果
三、關鍵代碼分析
實際實現中子帶的個數不一定爲32個,在測試音頻中子帶數爲30個。
//add by zhn
if(mask>0)
{
fprintf(temp,"音頻採樣率爲%f\n",s_freq[header.version][header.sampling_frequency]);
fprintf(temp,"目標碼率爲%d\n",bitrate[header.version][header.bitrate_index]);
fprintf(temp,"第%d幀\n",mask);
mask=mask-1;
fprintf(temp,"該幀所分配的比特數%d\n",avidadb);
fprintf(temp,"該幀比例因子\n");
for(m=0;m<nch;m++)
{
fprintf(temp,"channel[%d]\n",m+1);
for(p=0;p<frame.sblimit;p++)
{
fprintf(temp,"%d\t%d\t%d\t",scalar[m][0][p],scalar[m][1][p],scalar[m][2][p]);
fprintf(temp,"\n");
}
fprintf(temp,"\n");
}
fprintf(temp,"\n");
fprintf(temp,"該幀比特分配\n");
for(m=0;m<2;m++)
{
fprintf(temp,"channel[%d]\n",m+1);
for(n=0;n<frame.sblimit;n++)
{
fprintf(temp,"%d\t",bit_alloc[m][n]);
if((n+1)%8==0)
fprintf(temp,"\n");
}
fprintf(temp,"\n");
}
fprintf(temp,"\n");
}
//end add
四、實驗結果
五、實驗結論
在保證聽覺效果的前提下,mpeg音頻壓縮可以達到較好的壓縮效果。