天天看點

MPEG音頻編碼

實驗原理

音頻編碼的核心:心理聲學模型。 

子帶編碼:将原始信号分解為若幹個子頻帶,對其分别進行編碼處理後再合成為全頻帶信号。

人的感覺特性:掩蔽(強音會屏蔽旁音的聽域)。掩蔽可以分為四種情況:樂音對噪聲的掩蔽,樂音對樂音的掩蔽,噪聲對樂音的掩蔽,噪聲對噪聲的掩蔽。

MPEG音頻編碼

頻域掩蔽域随聲壓級變化曲線

音頻輸入源頻率多樣,每一個頻率的聲音都會有一個屏蔽曲線,上圖僅僅是1kHZ的樂音如何屏蔽。問題在于如何分割頻帶,如何合成各個新的屏蔽曲線。于是引入臨界頻帶,人耳頻帶被稱為臨界頻帶。由于人耳不能區分同一頻帶内同時發生的不同聲音,并且掩蔽效應在臨界頻帶内不會大起大伏,比較穩定。通常認為從20Hz到16kHz有25個臨界頻帶,機關為bark,1 Bark = 一個臨界頻帶的寬度 。心理聲學模型進行資料分析的基本處理機關就是臨界頻帶。掩蔽音和被掩蔽音的組合方式分四種:樂音對噪聲的掩蔽,樂音對樂音的掩蔽,噪聲對樂音的掩蔽,噪聲對噪聲的掩蔽。掩蔽效應有以下特點:樂音掩蓋其他音的能力較弱,噪音掩蓋其他音的能力較強;掩蔽時,對本身頻率略高的頻率掩蔽效果比對本身頻率略低的掩蔽效果更好。一段聲音由主頻率與次要頻率組成,最後的掩蔽曲線由所有頻率的掩蔽曲線整合。

音樂與語音信号由一系列複雜的頻譜分量構成 ,相應的這些多個掩蔽分量也會互相影響并最終獲得一個整體的掩蔽門檻值。對于多個掩蔽分量的綜合掩蔽效果,目前有多種模型給出了描述方案 。Lutfi對多個掩蔽音同時存在時的綜合掩蔽效果進行了研究:每個掩蔽音的掩蔽效果先獨立變換然後再線性相加。 

問題:綜合掩蔽效果與各掩蔽信号的聲音級以及掩蔽信号的個數都有關系。如何整合掩蔽音?

1. 當兩個信号重疊并落在一個臨界頻帶中時,二者的掩蔽分量可以線性相加。

2. 對于複雜音頻信号可将其頻譜分割成一系列離散段,每段就是一個掩蔽信号。各掩蔽音互不重疊,即以一個臨界帶為機關。各掩蔽音的聲壓級則通過将對應的臨界頻帶上的短時功率譜密度線性相加得到。 

MPEG音頻編碼

對聲音進行快速傅裡葉變換FFT,頻域的譜線越細越好。由于短時相關性,前後的相關的樣本不能過多,才能抓住前後樣本之間的瞬時關系。要提高時域的分解力,必須犧牲頻域分解力,這就是時域和頻域的沖突所在。最後量化都是用一個量化表(查表)。最後輸出幀包含資訊:1、比特配置設定資訊。2.比例因子資訊。3.子帶量化以後的量化樣本。時域的高可變性,對應頻域的高相關性,是以對頻域信号可以預測。若信号比較平緩,比例因子查表,比例因子大小差不多,找到比最大值大的最小值,用2bit表示比例因子公用資訊:00代表三個信号公用一個比例因子,01代表前兩個信号用一個比例因子,10代表後兩個信号公用一個比例因子,11代表三個信号用不同的比例因子。用32個帶通濾波器,把音頻分為32個子帶。其中,每一個帶通濾波器都由低通濾波器的調制得到。

MPEG音頻編碼

輸入聲音信号經過一個多相濾波器組,變換到多個子帶。同時經過“心理聲學模型”計算以頻率為自變量的噪聲掩蔽門檻值。量化和編碼部分用信掩比SMR決定配置設定給子帶信号的量化位數,使量化噪聲<掩蔽域值。最後通過資料幀包裝将量化的子帶樣本和其它資料按照規定的幀格式組裝成比特資料流。

1.多相濾波器組(Polyphase Filter Bank):将PCM樣本變換到32個子帶的頻域信号,如果輸入的采樣頻率為48kHz,那麼子帶的頻率寬度為48/(2*32)=0.75Hz

2.比例因子的取值和編碼 *對各個子帶每12個樣點進行一次比例因子計算。先定出12個樣點中絕對值的最大值。查比例因子表中比這個最大值大的最小值作為比例因子。用6比特表示。

*第2層的一幀對應36個子帶樣值,是第1層的三倍,原則上要傳三個比例因子。每幀中每個子帶的三個比例因子被一起考慮,劃分成特定的幾種模式。根據這些模式,1個、2個或3個比例因子和比例因子選擇資訊(每子帶2比特)一起被傳送。如果一個比例因子和下一個隻有很小的差别,就隻傳送大的一個,這種情況對于穩态信号經常出現。

3.1024點FFT 引入FFT補償頻率分辨率不足的問題。

4.心理聲學模型(Psychoacoustic Model):計算信号中不可聽覺感覺的部分,計算噪聲遮蔽效應 *聽覺系統中存在一個聽覺門檻值電平,低于這個電平的聲音信号就聽不到,聽覺門檻值的大小随聲音頻率的改變而改變。

一個人是否聽到聲音取決于聲音的頻率,以及聲音的幅度是否高于這種頻率下的聽覺門檻值。聽覺掩蔽特性即聽覺門檻值電平是自适應的,會随聽到的不同頻率聲音而發生變化。 *利用心理聲學模型可以消除更多的備援資料,人耳聽不見的部分和引入的低于聽覺門檻值量化噪聲不編碼,主要聲音成分用較多的比特數表示,進而獲得更大的壓縮效率。

5.比特配置設定器(Bit Allocator):根據心理聲學模型的計算結果,為每個子帶信号配置設定比特數 *在調整到固定的碼率之前

        先确定可用于樣值編碼的有效比特數,這個數值取決于比例因子、比例因子選擇資訊、比特配置設定資訊以及輔助資料所需比特數。

*比特配置設定的過程

 對每個子帶計算掩蔽-噪聲比MNR,即:MNR = SNR –SMR 其中SNR是信噪比 ,SMR是信掩比;對最低MNR的子帶配置設定比特,使獲益最大的子帶的量化級别增加一級;重新計算配置設定了更多比特子帶的MNR,循環,直到沒有比特可用。

MPEG音頻編碼

6.裝幀(Frame Creation):産生MPEG-I相容的比特流

代碼分析

m2aenc.c

int main (int argc, char **argv)  
{...//add  7.1  
  FILE *output;  
  char temp[50] = "frame_infomation.txt";  
  output = fopen(temp, "w");  
   if (output == NULL)  
   {  
     printf("Creating output txt file failed.\n");  
     exit(1);  
   }  
   //end  
......  
#else  
   
    //add 7.1  
    if(frameNum==50)    
{    
   
    fprintf(output,"sampling rate=%.1f khz\n",s_freq[header.version][header.sampling_frequency]);    
    fprintf(output,"bits rate=%d kbps\n", bitrate[header.version][header.bitrate_index]);    
    fprintf(output,"the %d frame\n",frameNum);    
    fprintf(output,"available bits num=%d\n",adb);    
    fprintf(output,"scale factors:\n");    
    for(k=0;k<nch;k++)    
    {    
        fprintf(output,"channel[%d]\n",k);    
        for(i=0;i<frame.sblimit;i++)    
        {    
            fprintf(output,"subband[%d]:",i);    
            for(t=0;t<3;t++)    
            {    
                fprintf(output,"%d\t",scalar[k][t][i]);    
            }    
            fprintf(output,"\n");    
        }    
    }    
    
}    
    //add end  
    transmission_pattern (scalar, scfsi, &frame);  
    main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);  
    //add 7.1  
    if(frameNum==50)    
{    
    int k,i;   
    fprintf(output,"bits allocation:\n");    
    for(k=0;k<nch;k++)    
    {    
        fprintf(output,"channel[%d]\n",k);    
        for(i=0;i<frame.sblimit;i++)          
            fprintf(output,"subband[%d]:%d\n",i,bit_alloc[k][i]);    
                     
    }    
}    
    //add end  
    if (error_protection)  
      CRC_calc (&frame, bit_alloc, scfsi, &crc);  
    encode_info (&frame, &bs);  
    if (error_protection)  
      encode_CRC (crc, &bs);  
    encode_bit_alloc (bit_alloc, &frame, &bs);  
    encode_scale (bit_alloc, scfsi, scalar, &frame, &bs);  
    subband_quantization (scalar, *sb_sample, j_scale, *j_sample, bit_alloc,  
              *subband, &frame);  
    sample_encoding (*subband, bit_alloc, &frame, &bs);  
      
#endif
           

實驗結果

MPEG音頻編碼
MPEG音頻編碼
MPEG音頻編碼

繼續閱讀