MPEG-1 Audio 编码器

一、实验原理

MPEG-1 Audio 编码器_第1张图片

MPEG-1音频编码器框架图

1、多相滤波器组(Polyphase Filter Bank):将PCM样本变换到32个子带的频域信号。如果输入的采样频率为48k Hz,那么子带的频率宽度为48/(2*32)=0.75Hz。
2、心理声学模型(Psychoacoustic Model):计算信号中不可听觉感知的部分。计算噪声遮蔽效应。
3、比特分配器(Bit Allocator):根据心理声学模型的计算结果,为每个子带信号分配比特数。
4、装帧(Frame Creation):产生MPEG-I兼容的比特流。

MPEG-1 Audio 编码器_第2张图片

MPEG-I 心理声学模型

通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。
又可以使信号通过FFT运算具有高的频率分辨率,因为掩蔽阈值是从功率谱密度推出来的。
在低频子带中,为了保护音调和共振峰的结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而话音中的摩擦音和类似噪声的声音,通常出现
在高频子带中,对它分配较少的位数。

临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。

Layer I 编码:码率分配

 在调整到固定的码率之前,先确定可用于样值编码的有效比特数。
这个数值取决于比例因子、比例因子选择信息、比特分配信息以及辅助数据所需比特数。

比特分配的过程

对每个子带计算掩蔽-噪声比MNR,是信噪比SNR – 信掩比SMR,即:MNR = SNR – SMR。

算法:使整帧和每个子带的总噪声—掩蔽比最小。计算掩蔽-噪声比(mask-to-noise ratio, MNR):MNR = SNR – SMR  (d B)其中SNR MPEG-I标准给定 (为量化水平的函数)。循环,直到没有比特可用:对最低MNR的子带分配比特,使获益最大的子带的量化级别增加一级。重新计算分配了更多比特子带的MNR。

MPEG-1 Audio 编码器_第3张图片

MPEG-1 Audio 编码器_第4张图片

Layer II编码:概述

与Layer I类似,但对Layer I有增强。
缩放因子(比例因子):一般从低频子带到高频子带出现连续下降。
帧:3 组/帧x  12个样本/子带 x 3个子带/帧 = 1152个样本/帧,每个样本的overhead更少。
缩放因子:每个子带的3个组尽可能共用缩放因子。 Layer I: 1个/12个样本, Layer II:1个/(24/36)个样本。
1/2/3个缩放因子和缩放因子选择信息(scale factor selection information, SCFSI) ,(每子带2比特)一起传送。
如果缩放因子和下一个只有很小的差别,就只传送大的一个,这种情况对于稳态信号经常出现。
如果要给瞬态信号编码,则要在瞬态的前、后沿传送两个或所有三个比例因子。

Layer II编码:量化

Layer I:每个子带从相同的量化集合中选择。 每个子带取共14个量化器中的一个。每个频带12个连续的样值都除以比例因子进行归一化,得到的值用X表示,进行量化计算:

A x X+B,A和B均为量化系数。查量化表,根据Bit分配信息得量化级数,根据级数查量化表得A和B。

Layer II:根据采样和码率量化,不同子带可以从不同的量化器集合中选择。某些(高频)子带的比特数可能为0。
对量化级别在3、5、9级时,采用“颗粒” 优化。
颗粒=3 个样本,根据颗粒选择量化水平。例:3个样本 @ 3个量化水平 = 27种可能的值—>5 比特。
不采用颗粒量化:1个样本 @ 3个量化水平 = 2比特x 3 个样本 —>6 比特
可将压缩比从4:1增加到6:1至8:1。MPEG-1 Audio 编码器_第5张图片
二、添加的主要代码:

//定义并打开输出文件
FILE *output_txt;
char temp[50] = "frame_info.txt";
output_txt = fopen(temp, "w");
if(output_txt == NULL)
printf("Creating output txt file failed.\n");

int sb,gr,ch;
if (frameNum == 200)
{
    fprintf(output_txt, "sampling rate=%d kHz. \nbit rate=%d kbps.\n ",
    header.sampling_frequency,bitrate[header.version][header.bitrate_index]);//输出采样频率和目标码率
    fprintf(output_txt, "\nthe %d frame.\n", frameNum);  
    printf(output_txt, "available bits number=%d\n", adb);//输出该帧的可用比特数
    fprintf(output_txt, "\nscale factors\n");//输出该帧的比例因子
    for (ch = 0; ch < nch; ch++)
      {
        fprintf(output_txt, "channel[%d] \n", ch + 1);
        for (sb = 0; sb < frame.sblimit; sb++)
            {
                fprintf(output_txt, "subband[%d]:    ", sb + 1);
                for (gr = 0; gr < 3; gr++)
                {
                    fprintf(output_txt, "%d\t", scalar[ch][gr][sb]);
                }
                fprintf(output_txt, "\n");
            }
        }
    }

 if (frameNum == 200)
    {
        fprintf(output_txt, "\nbits allocation:\n");//输出该帧的比特分配结果
        int ch, sb;
        for (ch = 0; ch < nch; ch++)
        {
            fprintf(output_txt, "channel[%d] \n", ch + 1);
            for (sb = 0; sb < frame.sblimit; sb++)
            {
                fprintf(output_txt, "subband[%d]:%d\n", sb, bit_alloc[ch][sb]);
            }
        }
    }
三、实验结果:

MPEG-1 Audio 编码器_第6张图片

四、实验结果分析:

从输出的结果可以看到,采样频率为8.0 khz、目标码率为192 kbps、该帧可用比特数为4608,并且是一个单声道的音频文件,每个自带的三个比例因子相差不大,可以通过比例因子选择来压缩更多数据的冗余;从比特分配的结果看,低频子带分配的比特数多,高频子带分配的比特数少。


初出茅庐,还请大神指教!

你可能感兴趣的:(数据压缩实验报告)