一 实验原理
1.1 人类听觉系统的感知特性
频域掩蔽特性
一个高强度纯音会使得该频率附近的最小可听阈曲线提升,掩蔽掉在其下的(原本能听到的)声音。这个纯音称为掩蔽声,掩蔽声存在时,音调音刚刚能被听到时的阈值称为掩蔽阈值。因此在编码时,可以去除掩蔽阈值以下的信号分量,并忽略可能会被掩蔽的量化噪声。
- 听觉阈值电平 听觉系统中存在一个听觉阈值电平,低于这个电平的声 音信号就听不到 。听觉阈值的大小随声音频率的改变而改变,一个人是否听到声音取决于声音的频率,以及声音 的幅度是否高于这种频率下的听觉阈值 。
- 听觉掩蔽特性 听觉阈值电平是自适应的,会随听到的不同频率声音而发生变化
临界频带
临界频带具有两种等价的定义:
定义一:当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度;
定义二:如果增大掩蔽信号覆盖的频率范围,超过到某个值后掩蔽效应不再随着带宽的增大而增强,这个临界的带宽就称为临界频带。
其单位为Bark,代表一个临界频带的宽度。
通常认为,在20 Hz—16 kHz的范围内有25个临界频带(500 Hz以下每个临界频带的带宽大约是100 Hz,500 Hz以上的临界频带带宽逐渐增加)。
人类听觉系统
人类听觉系统可以大致等效为在0 Hz—20 kHz范围内的25个重叠的带通滤波器组。
人耳在噪声中听某一纯音信号时,只启用中心频率与信号频率相同的那个听觉滤波器,且只有纯音信号和在通带范围内的部分信号可通过该滤波器。只有通过该滤波器的噪声才对掩蔽起作用;
聆听复音时启动多个听觉滤波器。听觉能够计算各滤波器输出端的信噪比。当信噪比达到或者超过听阈因子时,即可听到该频率成分。
1.2 MPEG音频编码流程
三个独立的压缩层次:
- Layer1采用每声道192kbit/s,每帧384个样本,32个等宽子带,固定分割数据块。子带编码用DCT(离散余弦变换)和(快速傅立叶变换)计算子带信号量化bit数。采用基于频域掩蔽效应的心理声学模型,使量化噪声低于掩蔽值。量化采用带死区的线性量化器,主要用于数字盒式磁带(DCC)。较为简单
- Layer2采用每声道128kbit/s,每帧1152个样本,32个子带,属不同分帧方式。采用共同频域和时域掩蔽效应的心理声学模型,并对高、中,低频段的比特分配进行限制,并对比特分配、比例因子,取样进行附加编码。Layer2 广泛用于数字电视,CD-ROM,CD-I和VCD等。比较复杂
- Layer3采用每声道64kbit/s,用混合滤波器组提高频率分辨率,按信号分辨率分成6X32或18X32个子带,克服平均32个子带的Layer1,Layer2在中低频段分辨率偏低的缺点。采用心理声学模型2,增设不均匀量化器,量化值进行熵编码。主要用于ISDN(综合业务数字网)音频编码。最为复杂
MPEG-1 Audio Layer II编码器框图:
多项滤波器
数字音频信号通过一个多相滤波器组,变换成32个等宽频带子带,使得信号具有较高的时间分辨率,确保在短暂冲击信号的情况下,编码的声音信号具有足够高的质量。
但需要说明的是,高时域分辨率和高频域分辨率是不可兼得的,我们需要做出权衡。
滤波器组的输出是临界频带经过量化的系数样值。若一个子带覆盖多个临界频带,则选择具有最小NMR的临界频带来计算分配给子带的比特数。
心理声学模型
心理声学模型决定了各个子带中允许的最大量化噪声,小于它的量化噪声都会被掩蔽。若子带内的信号功率小于掩蔽阈值,则不进行编码;否则,确定要编码的系数所需的比特数,使量化引起的噪声低于掩蔽效应
-
32 个等分的子带信号并不能精确地反映人耳的听觉特性。引入 FFT 补偿频率分辨率不足的问题。
-
确定声压级别
-
考虑安静时阈值。 也即绝对阈值。在标准中有根据输入 PCM 信号的采 样率编制的“频率、临界频带率和绝对阈值”表。
-
因为两种信号的掩蔽能力不同,将音频信号分解成“乐音(tones)” 和“非乐音/噪声” 。
-
音调和非音调掩蔽成分的消除。 利用标准中给出的绝对阈值消除被掩蔽成分; 考虑在每个临界频带内,小于 0.5Bark 的距离 中只保留最高功率的成分。
-
单个掩蔽阈值的计算。 音调成分和非音调成分单个掩蔽阈值根据标 准中给出的算法求得。
-
全局掩蔽阈值的计算。
- 计算每个子带信号掩蔽比(signal-to-mask ratio, SMR) SMR = 信号能量 / 掩蔽阈值,并将SMR传递给编码单元
量化编码
(1)码率分配
过程:
- 对每个子带计算掩蔽-噪声比MNR,是信噪比SNR –信掩比SMR,即:MNR = SNR –SMR
- 循环计算,使整个一帧和每个子带的总噪声-掩蔽比最小。每一次循环使获益最大的子带的量化级别增加一级,当然所用比特数不能超过一帧所能提供的最大数目。
(2)计算比例因子
- 对各个子带每36个样点(Layer I为12个样点)进行一次比例因子的计算,先确定12个连续样值中的最大值,查Layer II、Layer I比例因子表中比这它大的最小值作为量化比例因子;
- 每12个样值计算出一个比例因子,Layer II中将每个子带分为3组,每组各有12个取样值,因此36个样值具有3个比例因子;
- 比例因子以使得比较准确地计算出子带的声压级;
- 一般比例因子从低频子带到高频子带连续下降;
帧比特流形成
其中每个子带中前后相邻的连续36个样值(3组12个样值)共用在这个子带比特分配值,36个样值中的同一组样值共用该组的比例因子;同一时刻的32个子带样值放在一起;Layer II每帧包含1152个PCM样值(为Layer I的三倍);若取样频率为48 kHz,一帧相当于1152 / 48k = 24 ms的声音样值,因此Layer II的精确度为24 ms(为Layer I的三倍,因而更精确)。
二 实验代码
根据实验要求,补充代码
m2aenc.c中声明全局变量
#define InfoTrace 1
FILE* TraceInfoFp;
trace用法可见上期博客
main()函数中添加
pick_scale (scalar, &frame, max_sc);
-----
#if InfoTrace
TraceInfoFp=fopen("TraceInfo.txt", "w");
if (frameNum == 2)
{
/* 比例因子 */
fprintf(TraceInfoFp, "========== 比例因子 ==========\n");
for (ch = 0; ch < nch; ch++) // 每个声道单独输出, ch 为当前声道,nch 为总声道数
{
fprintf(TraceInfoFp, "------ 声道%d ------\n", ch + 1);
for (sb = 0; sb < frame.sblimit; sb++) // sb 为每个子带,sblimit 为总子带数
{
fprintf(TraceInfoFp, "子带[%d]:\t", sb + 1);
for (int gr = 0; gr < 3; gr++) //gr 为三个分组
{
fprintf(TraceInfoFp, "%d\t", scalar[ch][gr][sb]);
}
fprintf(TraceInfoFp, "\n");
}
}
fprintf(TraceInfoFp, "\n");
/* 比特分配表 */
fprintf(TraceInfoFp, "========== 比特分配表 ==========\n"); //输出比特分配结果
for (ch = 0; ch < nch; ch++)
{
fprintf(TraceInfoFp, "------ 声道%d ------\n", ch + 1); //按声道分配
for (sb = 0; sb < frame.sblimit; sb++)
{
fprintf(TraceInfoFp, "子带[%d]:\t%d\n", sb + 1, bit_alloc[ch][sb]);
}
fprintf(TraceInfoFp, "\n");
}
}
#endif
----
if (frame.actual_mode == MPG_MD_JOINT_STEREO) {
乐声输出TraceInfo.txt
========== 比例因子 ==========
------ 声道1 ------
子带[1]: 11 10 10
子带[2]: 14 15 13
子带[3]: 19 17 17
子带[4]: 16 16 18
子带[5]: 22 18 18
子带[6]: 21 20 20
子带[7]: 25 23 24
子带[8]: 22 26 24
子带[9]: 23 25 26
子带[10]: 26 25 27
子带[11]: 29 27 27
子带[12]: 26 27 26
子带[13]: 27 27 28
子带[14]: 29 29 27
子带[15]: 31 32 29
子带[16]: 31 33 31
子带[17]: 33 30 31
子带[18]: 33 32 33
子带[19]: 33 35 34
子带[20]: 35 35 36
子带[21]: 36 39 38
子带[22]: 37 38 37
子带[23]: 36 38 40
子带[24]: 36 36 36
子带[25]: 35 35 34
子带[26]: 36 36 35
子带[27]: 38 34 35
------ 声道2 ------
子带[1]: 11 10 10
子带[2]: 14 15 13
子带[3]: 19 17 18
子带[4]: 16 17 18
子带[5]: 22 18 18
子带[6]: 22 20 20
子带[7]: 24 23 22
子带[8]: 23 24 23
子带[9]: 24 25 25
子带[10]: 27 26 28
子带[11]: 30 27 27
子带[12]: 27 29 27
子带[13]: 28 26 28
子带[14]: 29 27 30
子带[15]: 31 31 28
子带[16]: 31 32 32
子带[17]: 35 30 32
子带[18]: 33 32 33
子带[19]: 34 33 33
子带[20]: 34 35 36
子带[21]: 36 39 36
子带[22]: 36 41 37
子带[23]: 37 37 39
子带[24]: 34 38 37
子带[25]: 36 34 34
子带[26]: 36 35 35
子带[27]: 38 36 35
========== 比特分配表 ==========
------ 声道1 ------
子带[1]: 5
子带[2]: 3
子带[3]: 3
子带[4]: 5
子带[5]: 4
子带[6]: 3
子带[7]: 3
子带[8]: 3
子带[9]: 3
子带[10]: 3
子带[11]: 2
子带[12]: 3
子带[13]: 3
子带[14]: 2
子带[15]: 1
子带[16]: 1
子带[17]: 2
子带[18]: 2
子带[19]: 0
子带[20]: 0
子带[21]: 0
子带[22]: 0
子带[23]: 0
子带[24]: 0
子带[25]: 0
子带[26]: 0
子带[27]: 0
------ 声道2 ------
子带[1]: 5
子带[2]: 3
子带[3]: 3
子带[4]: 5
子带[5]: 4
子带[6]: 3
子带[7]: 3
子带[8]: 3
子带[9]: 3
子带[10]: 3
子带[11]: 2
子带[12]: 3
子带[13]: 3
子带[14]: 2
子带[15]: 1
子带[16]: 2
子带[17]: 2
子带[18]: 1
子带[19]: 1
子带[20]: 0
子带[21]: 0
子带[22]: 0
子带[23]: 0
子带[24]: 0
子带[25]: 0
子带[26]: 0
子带[27]: 0
噪声:
========== 比例因子 ==========
------ 声道1 ------
子带[1]: 11 9 9
子带[2]: 9 10 7
子带[3]: 12 9 10
子带[4]: 9 11 9
子带[5]: 9 10 9
子带[6]: 11 9 8
子带[7]: 9 10 9
子带[8]: 8 10 14
子带[9]: 9 9 9
子带[10]: 10 11 9
子带[11]: 11 8 11
子带[12]: 8 9 8
子带[13]: 9 9 11
子带[14]: 9 10 9
子带[15]: 8 10 9
子带[16]: 8 8 10
子带[17]: 11 8 10
子带[18]: 10 10 11
子带[19]: 9 11 8
子带[20]: 8 9 8
子带[21]: 11 11 11
子带[22]: 9 11 10
子带[23]: 10 9 10
子带[24]: 8 8 8
子带[25]: 12 10 10
子带[26]: 11 11 8
子带[27]: 10 10 9
子带[28]: 9 10 11
子带[29]: 8 9 9
子带[30]: 7 11 9
------ 声道2 ------
子带[1]: 10 10 9
子带[2]: 10 8 9
子带[3]: 10 11 10
子带[4]: 9 10 10
子带[5]: 10 9 11
子带[6]: 10 8 10
子带[7]: 10 9 10
子带[8]: 8 9 10
子带[9]: 8 11 10
子带[10]: 10 8 10
子带[11]: 10 8 8
子带[12]: 10 7 9
子带[13]: 10 9 10
子带[14]: 10 9 8
子带[15]: 9 11 9
子带[16]: 8 8 10
子带[17]: 11 9 9
子带[18]: 9 10 11
子带[19]: 10 10 11
子带[20]: 11 11 7
子带[21]: 10 9 9
子带[22]: 8 11 10
子带[23]: 10 9 9
子带[24]: 10 10 10
子带[25]: 9 9 10
子带[26]: 13 11 11
子带[27]: 10 11 11
子带[28]: 10 9 6
子带[29]: 8 10 9
子带[30]: 10 11 9
========== 比特分配表 ==========
------ 声道1 ------
子带[1]: 4
子带[2]: 3
子带[3]: 3
子带[4]: 4
子带[5]: 4
子带[6]: 3
子带[7]: 3
子带[8]: 3
子带[9]: 3
子带[10]: 3
子带[11]: 2
子带[12]: 3
子带[13]: 2
子带[14]: 3
子带[15]: 3
子带[16]: 1
子带[17]: 3
子带[18]: 2
子带[19]: 2
子带[20]: 2
子带[21]: 1
子带[22]: 1
子带[23]: 2
子带[24]: 1
子带[25]: 1
子带[26]: 1
子带[27]: 1
子带[28]: 0
子带[29]: 1
子带[30]: 1
------ 声道2 ------
子带[1]: 4
子带[2]: 4
子带[3]: 3
子带[4]: 4
子带[5]: 4
子带[6]: 4
子带[7]: 3
子带[8]: 3
子带[9]: 3
子带[10]: 4
子带[11]: 3
子带[12]: 3
子带[13]: 2
子带[14]: 3
子带[15]: 3
子带[16]: 1
子带[17]: 3
子带[18]: 2
子带[19]: 2
子带[20]: 2
子带[21]: 1
子带[22]: 1
子带[23]: 2
子带[24]: 1
子带[25]: 1
子带[26]: 1
子带[27]: 1
子带[28]: 0
子带[29]: 1
子带[30]: 1
混音:
========== 比例因子 ==========
------ 声道1 ------
子带[1]: 9 10 10
子带[2]: 9 10 9
子带[3]: 8 7 12
子带[4]: 12 11 10
子带[5]: 10 10 10
子带[6]: 11 11 10
子带[7]: 10 9 9
子带[8]: 10 9 10
子带[9]: 9 10 10
子带[10]: 8 11 10
子带[11]: 10 8 9
子带[12]: 8 10 10
子带[13]: 10 11 10
子带[14]: 8 10 9
子带[15]: 9 8 9
子带[16]: 12 10 11
子带[17]: 12 10 11
子带[18]: 11 10 8
子带[19]: 9 9 10
子带[20]: 9 8 8
子带[21]: 8 10 9
子带[22]: 10 9 9
子带[23]: 11 10 8
子带[24]: 9 11 9
子带[25]: 10 10 8
子带[26]: 10 10 9
子带[27]: 9 12 10
子带[28]: 8 10 10
子带[29]: 10 11 9
子带[30]: 9 9 9
------ 声道2 ------
子带[1]: 11 9 10
子带[2]: 10 10 10
子带[3]: 9 9 9
子带[4]: 10 11 9
子带[5]: 10 10 9
子带[6]: 12 10 10
子带[7]: 9 10 10
子带[8]: 11 10 9
子带[9]: 9 9 11
子带[10]: 9 9 9
子带[11]: 9 11 10
子带[12]: 9 9 10
子带[13]: 10 12 9
子带[14]: 9 10 10
子带[15]: 8 8 9
子带[16]: 10 10 11
子带[17]: 11 10 7
子带[18]: 10 11 11
子带[19]: 9 9 10
子带[20]: 11 10 8
子带[21]: 11 11 10
子带[22]: 10 8 10
子带[23]: 10 10 8
子带[24]: 8 8 10
子带[25]: 8 9 10
子带[26]: 11 8 10
子带[27]: 9 9 10
子带[28]: 9 10 9
子带[29]: 12 10 10
子带[30]: 11 9 12
========== 比特分配表 ==========
------ 声道1 ------
子带[1]: 5
子带[2]: 3
子带[3]: 3
子带[4]: 5
子带[5]: 5
子带[6]: 3
子带[7]: 4
子带[8]: 4
子带[9]: 4
子带[10]: 3
子带[11]: 4
子带[12]: 4
子带[13]: 3
子带[14]: 4
子带[15]: 4
子带[16]: 3
子带[17]: 2
子带[18]: 3
子带[19]: 3
子带[20]: 1
子带[21]: 2
子带[22]: 1
子带[23]: 2
子带[24]: 1
子带[25]: 1
子带[26]: 1
子带[27]: 1
子带[28]: 1
子带[29]: 1
子带[30]: 1
------ 声道2 ------
子带[1]: 5
子带[2]: 4
子带[3]: 3
子带[4]: 5
子带[5]: 4
子带[6]: 4
子带[7]: 4
子带[8]: 3
子带[9]: 4
子带[10]: 3
子带[11]: 4
子带[12]: 4
子带[13]: 3
子带[14]: 4
子带[15]: 4
子带[16]: 3
子带[17]: 2
子带[18]: 3
子带[19]: 3
子带[20]: 1
子带[21]: 2
子带[22]: 1
子带[23]: 2
子带[24]: 1
子带[25]: 1
子带[26]: 1
子带[27]: 1
子带[28]: 1
子带[29]: 1
子带[30]: 1