實驗六—mpeg音頻編碼實驗

一、基本原理

  • 音頻信號
    通常將人耳可以聽到的頻率在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音頻壓縮可以達到較好的壓縮效果。

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