一、MPEG音频编码采用的技术:
- 心理声学模型
- 子带编码
- 动态比特分配
- 比例因子
- 时域&频域分析
……
传入编码器的PCM码流分为两路:一路做时域分析,一路做频域分析。时域分析将码流分解为32个子带分别进行滤波,每个子带有12个样本(MPEG-2有12*3个),提取比例因子传给做频域分析(1024点FFT)的一路。
动态比特分配的目的是使整帧和每个子带的总噪声—掩蔽比最小。具体算法如下:
二、实验代码:
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;ch<nch;ch++)
{
fprintf(stderr,"channel[%d]\n",ch+1);
for(sb=0;sb<frame.sblimit; sb++)
{
fprintf(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;ch<nch;ch++)
{
fprintf(stderr,"channel[%d]\n",ch+1);
for(sb=0;sb<frame.sblimit; sb++)
{
fprintf(stderr,"subband[%d]: %d\n",sb+1,bit_alloc[ch][sb]);
}
}
}
}
三、实验结果及分析:
图中显示了音频的采样率是44.1kHz,目标码率是192kbps,为第三帧分配的比特数为5016,并输出了第三帧的比例因子和比特分配结果。