实验6 MPEG音频编码

一、MPEG音频编码采用的技术:

  • 心理声学模型
  • 子带编码
  • 动态比特分配
  • 比例因子
  • 时域&频域分析
    ……

实验6 MPEG音频编码_第1张图片

传入编码器的PCM码流分为两路:一路做时域分析,一路做频域分析。时域分析将码流分解为32个子带分别进行滤波,每个子带有12个样本(MPEG-2有12*3个),提取比例因子传给做频域分析(1024点FFT)的一路。
动态比特分配的目的是使整帧和每个子带的总噪声—掩蔽比最小。具体算法如下:

实验6 MPEG音频编码_第2张图片


二、实验代码:

m2aenc.c

int main (int argc, char **argv)
{
    ……
    adb = available_bits (&header, &glopts);
    //print the available_bits of the 3th frame
    if (frameNum == 3)
        fprintf(stderr,"available_bits number of the 3th frame is %d\n",adb);
    ……
   scale_factor_calc (*sb_sample, scalar, nch, frame.sblimit);
    pick_scale (scalar, &frame, max_sc);

    {
        //print the available_bits of the 3th frame
        int sb,gr,ch;
        if(frameNum==3)
        {
            fprintf(stderr,"\nScale_Factor:\n");
            for(ch=0;chfprintf(stderr,"channel[%d]\n",ch+1);
                for(sb=0;sbfprintf(stderr,"subband[%d]:   ",sb+1);
                    for(gr=0;gr<3;gr++)
                    {
                        fprintf(stderr,"%d   ",scalar[ch][gr][sb]);
                    }
                    fprintf(stderr,"\n");
                }
            }
        }
    }
    ……
    transmission_pattern (scalar, scfsi, &frame);
    main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);

    {
        //print the bit_allocation of the 3th frame
        int sb,gr,ch;
        if(frameNum==3)
        {
            fprintf(stderr,"\nbit_allocation:\n");
            for(ch=0;chfprintf(stderr,"channel[%d]\n",ch+1);
                for(sb=0;sbfprintf(stderr,"subband[%d]:   %d\n",sb+1,bit_alloc[ch][sb]);
                }
            }
        }
    }

三、实验结果及分析:

实验6 MPEG音频编码_第3张图片
实验6 MPEG音频编码_第4张图片
实验6 MPEG音频编码_第5张图片
实验6 MPEG音频编码_第6张图片
图中显示了音频的采样率是44.1kHz,目标码率是192kbps,为第三帧分配的比特数为5016,并输出了第三帧的比例因子和比特分配结果。

你可能感兴趣的:(实验6 MPEG音频编码)