一、实验原理
MPEG-1音频编码器框架图
- 多相滤波器组(Polyphase Filter Bank):将PCM样本变换到32个子带的频域信号
如果输入的采样频率为48kHz,那么子带的频率宽度为48/(2*32)=0.75kHz
-
for i=0…511,计算窗口内的样本:Z [ i ] = C [ i ] · X [ i ]
标准中规定了分析窗口的512个系数 C[i] -
样本点分组,计算64个Yk的值: Y [ k ] = ∑ m = 0 7 Z [ k + 64 j ] Y[k] = \sum_{m=0} ^{7}\ {Z[k+64j]} Y[k]=m=0∑7 Z[k+64j]
-
计算32个子带样本: S [ i ] = ∑ k = 0 63 M [ i ] [ k ] ⋅ Y [ k ] S[i] = \sum_{k=0} ^{63}\ {M[i][k] · Y[k]} S[i]=k=0∑63 M[i][k]⋅Y[k]
-
总计算公式: S [ i ] = ∑ k = 0 63 ∑ j = 0 7 M [ i ] [ k ] ( C [ k + 64 j ] X [ k + 64 j ] ) S[i] = \sum_{k=0} ^{63}\sum_{j=0} ^{7}\ {M[i][k](C[k+64j]X[k+64j])} S[i]=k=0∑63j=0∑7 M[i][k](C[k+64j]X[k+64j])
其中分析矩阵:
M [ i ] [ k ] = ( ( 2 i + 1 ) ( k − 16 ) π 64 ) M[i][k]=\left( \frac{(2i+1)(k-16)π}{64}\right) M[i][k]=(64(2i+1)(k−16)π)
共需: 512 + 32x64 = 2560 次乘法
每个子带的带宽为π/32T ,中心为π/64T的奇数倍 -
多相滤波器组的公式 S [ i ] = ∑ k = 0 63 ∑ j = 0 7 M [ i ] [ k ] ( C [ k + 64 j ] X [ k + 64 j ] ) S[i] = \sum_{k=0} ^{63}\sum_{j=0} ^{7}\ {M[i][k](C[k+64j]X[k+64j])} S[i]=k=0∑63j=0∑7 M[i][k](C[k+64j]X[k+64j])
-
可用卷积公式代替: S t [ i ] = ∑ n = 0 511 X [ n − t ] h i [ k ] St[i] = \sum_{n=0} ^{511}\ {X[n-t]hi[k]} St[i]=n=0∑511 X[n−t]hi[k]
-
其中 h i [ n ] = ( h [ n ] × c o s ( 2 i + 1 ) ( n − 16 ) π 64 ) hi[n]=\left( {h[n]×cos} \frac{(2i+1)(n-16)π}{64}\right) hi[n]=(h[n]×cos64(2i+1)(n−16)π)
- 当n/64 的整数部分为奇数时,令h[n]=-C[n]
- 反之,h[n]=C[n]
- 每个子带有自己的带通滤波器脉冲响应
直观但效率不高:16384次乘法和16352次加法 -
缺点:
- 等带宽的滤波器组与人类听觉系统的临界频带不对应
在低频区域,单个子带会覆盖多个临界频带。在这种情况下,量化比特数不能兼每个临界频带
- 滤波器组与其逆过程不是无失真的
但滤波器组引入的误差差很小,且听不到
- 子带间频率有混叠
滤波后的相邻子带有频率混叠现象,一个子带中的信号可以影响相邻子带的输出
-
混叠:一个单频正弦信号输入可能在两个子带中产生非零信号
- 心理声学模型(Psychoacoustic Model):计算信号中不可听觉感知的部分
计算噪声遮蔽效应
1、将样本变换到频域
32个等分的子带信号并不能精确地反映人耳的听觉特性。引入FFT补偿频率分辨率不足的问题
2、确定声压级别
3、考虑安静时阈值
也即绝对阈值。在标准中有根据输入PCM信号的采样率编制的“频率、临界频带率和绝对阈值”表。此表为多位科学家经多次心理声学实验所得。
4、将音频信号分解成“乐音(tones)” 和“非乐音/噪声”部分:因为两种信号的掩蔽能力不同
5、音调和非音调掩蔽成分的消除
利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于0.5Bark的距离中只保留最高功率的成分
6、单个掩蔽阈值的计算
音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
7、全局掩蔽阈值的计算
还要考虑别的临界频带的影响。一个掩蔽信号会对其它频带上的信号产生掩蔽效应。这种掩蔽效应称为掩蔽扩散。
8、每个子带的掩蔽阈值
- 选择出本子带中最小的阈值作为子带阈值
- 对高频不正确——高频区的临界频带很宽,可能跨越多个子带,从而导致模型1将临界带宽内所有的非音调部分集中为一个代表频率,当一个子带在很宽的频带内却远离代表频率时,无法得到准确的非音调掩蔽值。但计算
量低。
9、计算每个子带信号掩蔽比SMR,并将SMR传递给编码单元
SMR = 信号能量 / 掩蔽阈值
- 比特分配器(Bit Allocator):根据心理声学模型的计算结果,为每个子带信号分配比特数
- 装帧(Frame Creation):产生MPEG-I兼容的比特流
帧头
- Sync:同步码,取值为111111111111
- ID=1:MPEG
- Layer:
00 | reserved |
---|---|
01 | layerⅢ |
10 | layerⅡ |
11 | layerⅠ |
- Prot. bit:置位表示有CRC校验
- Bitrate:码率索引,表示15种固定的码率
- Frequency:取样频率
- Pad bit:填充指示位
- Priv. bit:应用特定
- Mode:通道模式
- Mode extesion:通道模式扩展,当通道模式为联合立体声时有效
二、实验要求
-
理解程序设计的整体框架:如上图所示
-
理解感知音频编码的设计思想
(1)两条线
①通过滤波器组后进行线性量化
②进行FFT,通过心理声学模型实现动态比特分配
(2)时-频分析的矛盾:频域的频谱分辨率与时域的变化率之间的矛盾,当时域信号取得越短,频域谱线间隔越大 -
理解心理声学模型的实现过程
临界频带的概念:临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。
掩蔽值计算的思路:
①单个掩蔽阈值的计算:音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
②全局掩蔽阈值的计算:
③:选择出本子带中最小的阈值作为子带阈值 -
理解码率分配的实现思路
算法:使整帧和每个子带的总噪声—掩蔽比最小,循环,直到没有比特可用
计算噪声-掩蔽比: NMR = SMR – SNR (dB)
- 对最高NMR的子带分配比特,使获益最大的子带的量化级别增加一级
- 重新计算分配了更多比特子带的NMR
其中SNR 由MPEG-I标准给定 (为量化水平的函数)
NMR:表示波形误差与感知测量之间的误差
三、代码实现
* main
*
* PURPOSE: MPEG II Encoder with
* psychoacoustic models 1 (MUSICAM) and 2 (AT&T)
*
* SEMANTICS: One overlapping frame of audio of up to 2 channels are
* processed at a time in the following order:
* (associated routines are in parentheses)
*
* 1. Filter sliding window of data to get 32 subband
* samples per channel.
* (window_subband,filter_subband)
*
* 2. If joint stereo mode, combine left and right channels
* for subbands above #jsbound#.
* (combine_LR)
*
* 3. Calculate scalefactors for the frame, and
* also calculate scalefactor select information.
* (*_scale_factor_calc)
*
* 4. Calculate psychoacoustic masking levels using selected
* psychoacoustic model.
* (psycho_i, psycho_ii)
*
* 5. Perform iterative bit allocation for subbands with low
* mask_to_noise ratios using masking levels from step 4.
* (*_main_bit_allocation)
*
* 6. If error protection flag is active, add redundancy for
* error protection.
* (*_CRC_calc)
*
* 7. Pack bit allocation, scalefactors, and scalefactor select
*headerrmation onto bitstream.
* (*_encode_bit_alloc,*_encode_scale,transmission_pattern)
*
* 8. Quantize subbands and pack them into bitstream
* (*_subband_quantization, *_sample_encoding)
*
本程序分为了八个功能模块:
(1)首先对滑动窗口内的音频信号进行32子带滤波;
(2)如果有立体声,则加入左右声道
(3)对这一帧音频信号进行幅度上的归一化,计算这一帧的比例因子以及比例因子选择信息
(4)使用心理声学模型对进行FFT后的音频信号进行处理,计算掩蔽电平
(5)采用第四步获得的掩蔽电平计算掩噪比,并迭代的为这一帧中的子带分配比特
(6)如果需要,计算循环冗余检测CRC并加入比特流
(7)将上述比特分配信息,比例因子与比例因子选择信息打包并加入比特流
(8)对子带根据比特分配信息进行量化并将他们打包加入比特流
-
输出音频的采样率和目标码率
-
选择三个不同特性的音频文件
噪声(持续噪声、突发噪声)
音乐
混合 -
某个数据帧,输出
该帧所分配的比特数
该帧的比例因子
该帧的比特分配结果
添加代码如下:
FILE *output;
fopen_s(&output,"音乐.txt","wb");
...
if (frameNum == 61) //选择数据帧
{
fprintf(output, "采样率:%.1f khz\n", s_freq[header.version][header.sampling_frequency]);//输出采样率
fprintf(output,"目标码率:%d kbps\n", bitrate[header.version][header.bitrate_index]);//输出目标码率
fprintf(output,"第%d帧\n",frameNum);
fprintf(output,"可用比特数:%d\n",adb);//输出该帧的可用比特数
fprintf(output,"比例因子:\n");//输出该帧的比例因子
for (int i = 0; i < nch; i++)//声道
{
fprintf(output, "通道[%d] \n", i + 1);
for (int j = 0; j < frame.sblimit; j++) //子带
{
fprintf(output, "subband[%2d]: ", j + 1);
for (int k = 0; k < 3; k++)
{
fprintf(output, "%2d\t", scalar[i][k][j]);
}
fprintf(output, "\n");
}
}
}
...
if (frameNum == 61) //选择数据帧
{
fprintf(output, "\n分配的比特数为:\n"); //输出比特分配结果
for (int i = 0; i < nch; i++)
{
fprintf(output, "channel[%2d] \n", i + 1); //按声道分配
for (int j = 0; j < frame.sblimit; j++)
{
fprintf(output, "subband[%2d]:%2d\n", j, bit_alloc[i][j]);
}
}
}
四、输出结果
音乐:
采样率:44.1 khz
目标码率:192 kbps
第61帧
可用比特数:5016
比例因子:
通道[1]
subband[ 1]: 9 11 10
subband[ 2]: 15 15 21
subband[ 3]: 18 18 24
subband[ 4]: 23 26 28
subband[ 5]: 25 25 31
subband[ 6]: 21 22 25
subband[ 7]: 21 23 28
subband[ 8]: 23 25 30
subband[ 9]: 28 29 35
subband[10]: 31 29 37
subband[11]: 24 26 26
subband[12]: 24 28 31
subband[13]: 21 22 27
subband[14]: 19 19 25
subband[15]: 20 18 28
subband[16]: 20 25 27
subband[17]: 30 31 37
subband[18]: 26 25 30
subband[19]: 26 28 37
subband[20]: 29 32 37
subband[21]: 31 31 36
subband[22]: 29 31 34
subband[23]: 38 42 44
subband[24]: 54 52 50
subband[25]: 55 55 53
subband[26]: 55 54 52
subband[27]: 55 52 54
subband[28]: 53 52 55
subband[29]: 54 54 54
subband[30]: 53 51 53
分配的比特数为:
channel[ 1]
subband[ 0]: 9
subband[ 1]: 8
subband[ 2]: 7
subband[ 3]: 8
subband[ 4]: 7
subband[ 5]: 7
subband[ 6]: 7
subband[ 7]: 6
subband[ 8]: 6
subband[ 9]: 6
subband[10]: 7
subband[11]: 7
subband[12]: 6
subband[13]: 6
subband[14]: 6
subband[15]: 6
subband[16]: 2
subband[17]: 5
subband[18]: 4
subband[19]: 4
subband[20]: 3
subband[21]: 4
subband[22]: 0
subband[23]: 0
subband[24]: 0
subband[25]: 0
subband[26]: 0
subband[27]: 0
subband[28]: 0
subband[29]: 0
噪声:
采样率:22.1 khz
目标码率:96 kbps
第61帧
可用比特数:5016
比例因子:
通道[1]
subband[ 1]: 23 24 21
subband[ 2]: 21 22 20
subband[ 3]: 18 18 20
subband[ 4]: 22 15 16
subband[ 5]: 18 18 18
subband[ 6]: 21 20 18
subband[ 7]: 25 24 24
subband[ 8]: 22 22 22
subband[ 9]: 19 20 22
subband[10]: 24 23 23
subband[11]: 21 22 21
subband[12]: 18 20 19
subband[13]: 25 22 23
subband[14]: 23 22 25
subband[15]: 23 25 22
subband[16]: 27 28 29
subband[17]: 27 25 26
subband[18]: 31 31 30
subband[19]: 31 31 32
subband[20]: 31 29 29
subband[21]: 27 27 27
subband[22]: 29 27 28
subband[23]: 34 32 29
subband[24]: 35 31 32
subband[25]: 36 36 34
subband[26]: 38 35 35
subband[27]: 38 36 36
subband[28]: 35 34 34
subband[29]: 36 37 36
subband[30]: 34 34 36
通道[2]
subband[ 1]: 24 25 21
subband[ 2]: 21 23 20
subband[ 3]: 18 18 20
subband[ 4]: 22 15 16
subband[ 5]: 18 17 18
subband[ 6]: 20 20 18
subband[ 7]: 25 23 23
subband[ 8]: 22 22 22
subband[ 9]: 19 20 22
subband[10]: 24 23 24
subband[11]: 21 22 21
subband[12]: 18 20 19
subband[13]: 25 22 23
subband[14]: 23 22 25
subband[15]: 23 25 22
subband[16]: 27 28 29
subband[17]: 27 26 25
subband[18]: 30 31 30
subband[19]: 31 31 32
subband[20]: 31 29 29
subband[21]: 27 27 27
subband[22]: 29 27 28
subband[23]: 34 32 29
subband[24]: 35 31 32
subband[25]: 36 36 34
subband[26]: 38 35 35
subband[27]: 38 36 36
subband[28]: 35 34 34
subband[29]: 36 37 36
subband[30]: 34 34 36
分配的比特数为:
channel[ 1]
subband[ 0]: 4
subband[ 1]: 4
subband[ 2]: 4
subband[ 3]: 5
subband[ 4]: 3
subband[ 5]: 3
subband[ 6]: 1
subband[ 7]: 3
subband[ 8]: 3
subband[ 9]: 2
subband[10]: 2
subband[11]: 3
subband[12]: 1
subband[13]: 1
subband[14]: 1
subband[15]: 1
subband[16]: 2
subband[17]: 0
subband[18]: 0
subband[19]: 1
subband[20]: 1
subband[21]: 1
subband[22]: 1
subband[23]: 1
subband[24]: 0
subband[25]: 0
subband[26]: 0
subband[27]: 1
subband[28]: 0
subband[29]: 1
channel[ 2]
subband[ 0]: 4
subband[ 1]: 4
subband[ 2]: 5
subband[ 3]: 5
subband[ 4]: 3
subband[ 5]: 3
subband[ 6]: 2
subband[ 7]: 3
subband[ 8]: 3
subband[ 9]: 2
subband[10]: 2
subband[11]: 3
subband[12]: 1
subband[13]: 2
subband[14]: 2
subband[15]: 1
subband[16]: 2
subband[17]: 0
subband[18]: 1
subband[19]: 1
subband[20]: 2
subband[21]: 1
subband[22]: 1
subband[23]: 1
subband[24]: 0
subband[25]: 0
subband[26]: 0
subband[27]: 1
subband[28]: 0
subband[29]: 1
混合:
采样率:48.0 khz
目标码率:192 kbps
第61帧
可用比特数:4608
比例因子:
通道[1]
subband[ 1]: 8 11 10
subband[ 2]: 12 12 11
subband[ 3]: 13 15 13
subband[ 4]: 15 18 17
subband[ 5]: 15 17 15
subband[ 6]: 16 16 15
subband[ 7]: 21 20 18
subband[ 8]: 20 20 21
subband[ 9]: 22 25 26
subband[10]: 24 22 24
subband[11]: 22 21 22
subband[12]: 22 23 22
subband[13]: 20 22 22
subband[14]: 19 22 23
subband[15]: 21 21 22
subband[16]: 28 28 28
subband[17]: 26 25 26
subband[18]: 31 30 31
subband[19]: 33 31 34
subband[20]: 31 33 33
subband[21]: 37 36 35
subband[22]: 56 60 56
subband[23]: 58 58 56
subband[24]: 58 57 58
subband[25]: 59 58 57
subband[26]: 59 56 58
subband[27]: 59 55 58
通道[2]
subband[ 1]: 8 11 9
subband[ 2]: 12 12 11
subband[ 3]: 13 14 13
subband[ 4]: 16 18 16
subband[ 5]: 15 16 14
subband[ 6]: 15 15 16
subband[ 7]: 20 21 17
subband[ 8]: 19 21 21
subband[ 9]: 24 26 23
subband[10]: 22 21 23
subband[11]: 24 23 22
subband[12]: 21 21 23
subband[13]: 19 22 22
subband[14]: 22 20 24
subband[15]: 21 21 21
subband[16]: 29 30 27
subband[17]: 25 26 26
subband[18]: 32 30 31
subband[19]: 33 34 34
subband[20]: 32 32 32
subband[21]: 38 37 36
subband[22]: 57 57 56
subband[23]: 59 59 57
subband[24]: 59 58 57
subband[25]: 58 58 57
subband[26]: 58 59 59
subband[27]: 56 59 56
分配的比特数为:
channel[ 1]
subband[ 0]: 6
subband[ 1]: 4
subband[ 2]: 3
subband[ 3]: 5
subband[ 4]: 4
subband[ 5]: 4
subband[ 6]: 3
subband[ 7]: 3
subband[ 8]: 4
subband[ 9]: 3
subband[10]: 4
subband[11]: 3
subband[12]: 3
subband[13]: 4
subband[14]: 2
subband[15]: 0
subband[16]: 1
subband[17]: 0
subband[18]: 0
subband[19]: 0
subband[20]: 0
subband[21]: 0
subband[22]: 0
subband[23]: 0
subband[24]: 0
subband[25]: 0
subband[26]: 0
channel[ 2]
subband[ 0]: 6
subband[ 1]: 4
subband[ 2]: 4
subband[ 3]: 5
subband[ 4]: 5
subband[ 5]: 4
subband[ 6]: 4
subband[ 7]: 4
subband[ 8]: 3
subband[ 9]: 4
subband[10]: 4
subband[11]: 3
subband[12]: 4
subband[13]: 3
subband[14]: 2
subband[15]: 0
subband[16]: 1
subband[17]: 0
subband[18]: 0
subband[19]: 0
subband[20]: 0
subband[21]: 0
subband[22]: 0
subband[23]: 0
subband[24]: 0
subband[25]: 0
subband[26]: 0