您的位置:首页 > 其它

数据压缩原理与应用 MPEG音频编码

2017-06-08 21:16 162 查看

一.实验原理



mpeg的音频编码主要采用了心理声学模型

1. MPEG-I 心理声学模型

通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。

又可以使信号通过FFT运算具有高的频率分辨率,因为掩蔽阈值是从功率谱密度推出来的。

在低频子带中,为了保护音调和共振峰的结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而话音中的摩擦音和类似噪声的声音,通常出现在高频子带中,对它分配较少的位数

2. MPEG-1音频编码器框架图

多相滤波器组(Polyphase Filter Bank):用来分割子带,将PCM样本变换到32个子带的频域信号



如果输入的采样频率为48kHz ,那么子带的频率宽度为48/ (2*32 )=0.75Hz

心理声学模型(Psychoacoustic Model):计算信号中不可听觉感知的部分

计算噪声遮蔽效应

比特分配器(Bit Allocator):根据心理声学模型的计算结果,为每个子带信号分配比特数

装帧(Frame Creation):产生MPEG-I兼容的比特流

3. 临界频带(Critical Band)

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

掩蔽效应在一定频率范围内不随带宽增大而改变,直至超过某个频率值。通常认为从20Hz到16kHz有25个临界频带,单位为bark。

1 Bark = 一个临界频带的宽度

4. 比例因子的取值和编码

对各个子带每12个样点进行一次比例因子计算。先定出12个样点中绝对值的最大值。查比例因子表中比这个最大值的最小值作为比例因子。用6 比特表示。

第2 层的一帧对应36个子带样值,是第1层的三倍,原则上要传三个比例因子。为了降低比例因子的传输码率,采用了利用人耳时域掩蔽特性的编码策略。

每帧中每个子带的三个比例因子被一起考虑,划分成特定的几种模式。根据这些模式,1 个、2 个或3 个比例因子和比例因子选择信息(每子带2 比特)一起被传送。如果一个比例因子和下一个只有很小的差别,就只传送大的一个,这种情况对于稳态信号经常出现。

使用这一算法后,和第1层相比,第2层传输的比例因子平均减少了2 个,即传输码率由22.5Kb/s 降低到了7.5Kb/s。

5. 比特分配及编码

在调整到固定的码率之前

- 先确定可用于样值编码的有效比特数

- 这个数值取决于比例因子、比例因子选择信息、比特分配信息以及辅助数据所需比特数

比特分配的过程:对每个子带计算掩蔽-噪声比MNR,是信噪比SNR – 信掩比

SMR,即:MNR = SNR – SMR

使整个一帧和每个子带的总噪声-掩蔽比最小。这是一个循环过程,每一次循环使获益最大的子带的量化级别增加一级,当然所用比特数不能超过一帧所能提供的最大数目。

第1层一帧用4比特给每个子带的比特分配信息编码;而第2层只在低频段用4比特,高频段则用2比特。

二.实验流程

理解过程

- 理解程序设计的整体框架

- 理解感知音频编码的设计思想

- 理解心理声学模型的实现过程

临界频带的概念

掩蔽值计算的思路

理解码率分配的实现思路

输出要求

- 输出音频的采样率和目标码率

- 选择某个数据帧,输出

该帧所分配的比特数

该帧的比例因子

该帧的比特分配结果

三.代码分析

主要修改在main函数内

输出每帧分配的比特数

available_bits ()这个函数即为得到可用的比特数

adb = available_bits (&header, &glopts);
if (frameNum == 20)
{
printf("每帧分配比特数 = %d\n", adb);
}//add by lee 2017/6/7
lg_frame = adb / 8;


输出比例因子

scale_factor_calc ()是设置比例因子的函数

scale_factor_calc (*sb_sample, scalar, nch, frame.sblimit);
if (frameNum == 20)//add by lee 2017/6/7
{
int a, b, c;
for (a=0;a<nch;a++)
{
printf("channel[%d] = \n", a + 1);
for (b=0;b<frame.sblimit;b++)
{
for (c=0;c<3;c++)
{
printf("scalar[%d][%d]= %d %d %d\n",b,c,scalar[a][0], scalar[a][1][b], scalar[a][2][b]);
}
}
}

}


[b]输出比特分配结果


main_bit_allocation ()是比特分配函数

main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);
......
sample_encoding (*subband, bit_alloc, &frame, &bs);

if (frameNum == 20)//add by lee 2017/6/7
{
printf("sample rate=%.1f kHz\n", s_freq[header.version][header.sampling_frequency]);
printf("target rate=%d\n",bitrate[header.version][header.bitrate_index]);
int a, b;
for (a = 0; a<2; a++)
{
for (b = 0; b<frame.sblimit; b++)
{
printf("bit_alloc[%d][%d] =%d\n", a, b, bit_alloc[a]);
}
}

}


四.实验结果

输出结果

[b]输出该帧分配的比特数和比例因子








输出采样率和目标码率



输出比特分配结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据压缩 应用 编码