文章目录
MPEG音频编码实验
MPEG标准主要有以下五个,MPEG-1、MPEG-2、MPEG-4、MPEG-7及MPEG-21等。该专家组建于1988年,专门负责为CD建立视频和音频标准,而成员都是为视频、音频及系统领域的技术专家。及后,他们成功将声音和影像的记录脱离了传统的模拟方式,建立了ISO/IEC11172
压缩编码标准,并制定出MPEG-格式,令视听传播方面进入了数码化时代。因此,大家现时泛指的MPEG-X版本,就是由ISO (InternationalOrganization for Standardization)
所制定而发布的视频、音频、数据的压缩标准。
MPEG-1 Audio LayerII编码器原理
流程框图如下:
多相滤波器组
多相滤波器组(Polyphase Filter Bank
),可以将PCM样本变换到32个自子带的频域信号。
如果输入的采样频率为48kHz,子带的频带宽度就是 48 2 × 32 = 0.75 k H z \frac{48}{2 \times 32} = 0.75kHz 2×3248=0.75kHz
图示如下:
首先需要对窗口的512个样本
X
[
i
]
,
i
=
0
,
1
,
2...511
X[i],i = 0,1,2...511
X[i],i=0,1,2...511进行计算:
Z
[
i
]
=
C
[
i
]
×
Z
[
i
]
,
i
=
0
,
1
,
2
,
.
.
.
,
511
Z[i] = C[i] \times Z[i],i = 0,1,2,...,511
Z[i]=C[i]×Z[i],i=0,1,2,...,511
其中标准中为我们规定了512个系数
C
[
i
]
C[i]
C[i]。
样本点分成64个组,计算64个
Y
k
Y_k
Yk值:
Y
[
k
]
=
∑
j
=
0
7
Z
[
k
+
64
j
]
Y[k] = \sum^7_{j=0}Z[k+64j]
Y[k]=j=0∑7Z[k+64j]
计算32个子带样本:
S
[
i
]
=
∑
k
=
0
63
Y
[
k
]
×
M
[
i
]
[
k
]
S[i] = \sum^{63}_{k = 0}Y[k] \times M[i][k]
S[i]=k=0∑63Y[k]×M[i][k]
总计算公式:
S [ i ] = ∑ k = 0 63 ∑ j = 0 7 M [ i ] [ k ] ( C [ k + 64 j ] X [ k + 64 j ] ) S[i] = \sum^{63}_{k=0}\sum^7_{j=0} M[i][k](C[k+64j]X[k+64j]) S[i]=k=0∑63j=0∑7M[i][k](C[k+64j]X[k+64j])
- 其中分析矩阵 M [ i ] [ k ] = c o s ( ( 2 i + 1 ) ( k − 16 ) π 64 ) M[i][k] = cos(\frac{(2i+1)(k-16)\pi}{64}) M[i][k]=cos(64(2i+1)(k−16)π)
- 共需要 512 + 32 × 64 512+32\times{64} 512+32×64次乘法
- 每个子带的带宽为 π 32 T \frac{\pi}{32T} 32Tπ,中心为带宽奇数倍。
同时多相滤波器的公式还可以写成卷积公式:
S
t
[
i
]
=
∑
n
=
0
511
X
[
n
−
t
]
h
i
[
n
]
S_t[i] = \sum^{511}_{n=0}X[n - t]h_i[n]
St[i]=n=0∑511X[n−t]hi[n]
其中
h
i
[
n
]
=
h
[
n
]
×
c
o
s
(
(
2
i
+
1
)
(
k
−
16
)
π
64
)
h_i[n] = h[n] \times cos(\frac{(2i+1)(k-16)\pi}{64})
hi[n]=h[n]×cos(64(2i+1)(k−16)π)
当
n
64
\frac{n}{64}
64n的整数部分为奇数时,
h
(
n
)
=
−
C
(
n
)
h(n) = -C(n)
h(n)=−C(n),反之,
h
(
n
)
=
C
(
n
)
h(n) = C(n)
h(n)=C(n)。
多相滤波器同时存在一些缺点:
- 等带宽的滤波器组与人类听觉系统的临界频带不对应。在低频区域,单个子带会覆盖多个临界频带。
- 滤波器组与其逆过程不是无失真的。
- 子带间频率有混叠
心理声学模型(Psychoacoustic Model)
通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。又可以使信号通过FFT运算具有高的频率分辨率,因为掩蔽阈值是从功率谱密度推出来的。在低频子带中,为了保护音调和共振峰的结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而话音中的摩擦音和类似噪声的声音,通常出现在高频子带中,对它分配较少的位数。而如何实现这一分配方式,就需要参考心理声学模型和比特预算。
MPEG-1标准定义了两个模型:
- 心理声学模型1:
- 计算复杂度低
- 对于假设用户听不到的部分压缩太严重
- 心理声学模型2:
- 提供了适合Layer III编码的更多特征
但实际实现的模型复杂度取决所需要的压缩因子。如大的压缩因子不重要,则可以完全不用心理声学模型。此时位分配算法不使用SMR(Signal Mask Ratio
),而是使用SNR。
心理声学模型Ⅰ
-
将样本变换到频域
32个等分的子带信号不能精确地反映人耳的听觉特性,所以我们引入FFT补偿频率分辨率不足的问题。- 采用
Hann
加权和DFT
- Hann加权减少频率中的边界效应。
- 此变换不同于多相滤波器组,因为模型需要更精细的频率分辨率,而且计算掩蔽阈值也需要每个频率的幅值。
- 模型1:采用512(Layer Ⅰ)或者1024(Layer Ⅱ and Ⅲ)样本窗口:
- Layer Ⅰ:每帧384个样本点,512个样本点足够覆盖。
- Layer Ⅱ and Ⅲ:每帧1152个样本点,每帧两次计算,模型1选择两个信号掩蔽比(SMR)中较小的一个。
- 采用
-
确定声压级别
子带 n n n中的声压级别 L s b L_{sb} Lsb计算如下:
L s b ( n ) = M A X [ X ( k ) , 20 × l o g 10 ( s c f m a x ( n ) × 32768 ) − 10 ] d B L_{sb}(n) = MAX[X(k),20\times log_{10}(scf_{max}(n)\times32768)-10]dB Lsb(n)=MAX[X(k),20×log10(scfmax(n)×32768)−10]dB
其中 X ( k ) X(k) X(k)是在子带 n n n中的频谱线的声压级别, s c f m a x ( n ) scf_{max}(n) scfmax(n)是在一帧中子带 n n n的三个缩放因子最大的一个。 -
考虑安静时阈值,也即绝对阈值
也即绝对阈值。在标准中有根据输入PCM信号的采样率编制的“频率、临界频带率和绝对阈值”表。此表为多位科学家经多次心理声学实验所得。 -
将音频信号分解成“乐音(Polyphase Filter Bank)tones)” 和“非乐音/噪声”部分
模型1:根据音频频谱的局部功率最大值确定乐音成分。局部峰值为乐音,然后将本临界频带内的剩余频谱合在一起,组成一个代 表噪声频率(无调成份)。
要列出谱线 X ( k ) X(k) X(k)的有调和无调,需执行下面的三个步骤:- 标明局部最大;如果 X ( k ) X(k) X(k)比相邻的两个谱线都大,则 X ( k ) X(k) X(k)为局部最大值。
- 列出有调成分,计算声压值。如果 X ( k ) − X ( k + j ) ≥ 7 d B X(k)-X(k+j) \ge 7dB X(k)−X(k+j)≥7dB,则 X ( k ) X(k) X(k)为有调成分。j随谱线的位置不同而不同。
- 列出无调成分,计算功率。在每个临界频带内将所有余留谱线的功率加起来形成临界频带内无调成分的声压级。并列出以下参数:最接近临界频带几何平均值的谱线标记k,声压级以及无调指示。
-
音调和非音调掩蔽成分的消除
利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于0.5Bark的距离中只保留最高功率的成分。 -
单个掩蔽阈值的计算
音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。 -
全局掩蔽阈值的计算
还要考虑别的临界频带的影响。一个掩蔽信号会对其它频带上的信号产生掩蔽效应。这种掩蔽效应称为掩蔽扩散。 -
每个子带的掩蔽阈值
选择出本子带中最小的阈值作为子带阈值。 -
计算每个子带信号掩蔽比(signal-to-mask ratio, SMR),将SMR传递给编码单元
SMR = 信号能量 / 掩蔽阈值。
LayerⅠ编码
码率分配
在调整到固定的码率之前,先确定可以用于样值编码的有效比特数,这个数值取决于比例因子、比例因子选择信息、比特分配信息和辅助数据所需bit数。
-
比特分配过程
对每个子带计算掩蔽-噪声比MNR,是信噪比-信掩比,即 M N R = S N R − S M R MNR = SNR - SMR MNR=SNR−SMR。 -
算法:使整帧和每一个子带的总噪声-掩蔽比NMR最小。
- 计算NMR:
N
M
R
=
S
M
R
−
S
N
R
NMR = SMR - SNR
NMR=SMR−SNR。其中SNR由MPEG-1标准给定。
- 计算NMR:
N
M
R
=
S
M
R
−
S
N
R
NMR = SMR - SNR
NMR=SMR−SNR。其中SNR由MPEG-1标准给定。
-
算法:循环,直到没有比特可用:
- NMR = SMR - SNR(dB)
- 对最高NMR的子带分配比特,使获益最大的子带的量化级别增加一级
- 重新计算分配了更多比特子带的NMR
装帧
帧头格式:
Layer Ⅱ编码
和Ⅰ类似但是有所加强。
-
帧结构
- 3 组/帧 x 12个样本/子带 x 32个子带/帧 = 1152个样本/帧
- 每个样本的overhead更少
-
缩放因子(比例因子)一般从低频子带到高频子带出现连续下降,每个子带的3个组尽可能共用缩放因子
- Layer Ⅰ: 1个/12个样本
- 1个/(24/36)个样本
- 1/2/3个缩放因子和缩放因子选择信息
(scale factor selection information, SCFSI)
(每子带2比特)一起传送。- 如果缩放因子和下一个只有很小的差别,就只传送大的一个,这种情况对于稳态信号经常出现
- 如果要给瞬态信号编码,则要在瞬态的前、后沿传送两个或所有三个比例因子
-
量化
- Layer I:每个子带从相同的量化集合中选择,每个子带取共14个量化器中的一个
- Layer II:根据采样和码率量化,不同子带可以从不同的量化器集合中选择,某些(高频)子带的比特数可能为0。对量化级别在3、5、9级时,采用“颗粒” 优化。颗粒= 3 个样本,根据颗粒选择量化水平。
-
装帧
实验记录
重要参数解释
参数名 | 含义 |
---|---|
window_subband | 子带滑动窗口 |
filter_subband | 子带滤波器 |
combine_LR | 结合左右声道 |
_scale_factor_calc | 缩放因子计算 |
psycho_i | 心理声学模型1 |
psycho_ii | 心理声学模型2 |
_main_bit_allocation | 比特分配 |
_CRC_calc | CRC循环冗余校验 |
_encode_bit_alloc | 编码bit分配 |
_encode_scale | 编码比例因子 |
transmission_pattern | 传送图样 |
_subband_quantization | 子带量化 |
_sample_encoding | 采样编码 |
输出音频的采样率和目标码率
在m2aenc.c
中加入下面代码:
//add by qzl from CUC
FILE* output;
char temp[20] = "info.txt";
//end
并对main
进行修改:
//add by qzl from CUC
if (frameNum == 1) {
fprintf(output, "采样频率为 %d kHz.\n 目标码率为 %d kbps. \n", header.sampling_frequency, bitrate[header.version][header.bitrate_index]);
}
得到的结果如下:
输出某一帧分配的比特数、比例因子和比特分配结果
加入如下代码:
fprintf(output, "输出的为第 %d 帧\n", frameNum); //输出数据帧
fprintf(output, "分配的比特数为 %d\n", adb);
fprintf(output, "比例因子为:\n"); //输出比例因子
for (ch = 0; ch < nch; ch ++) {
fprintf(output, "通道%d\n", ch + 1);
for (int i = 0; i < frame.sblimit; i ++) {
fprintf(output, "子带%d:", i + 1);
for (int j = 0; j < 3; j++)
{
fprintf(output, "%d\t", scalar[ch][j][i]);
}
fprintf(output, "\n");
}
}
...
//add by qzl from CUC
if (frameNum == 10) {
fprintf(output, "\n分配的bit数:\n");
for (int i = 0; i < nch; i++) {
fprintf(output, "通道%d:\n", i + 1);
for (int j = 0; j < frame.sblimit; j++) {
fprintf(output, "子带%d:%d\n", j, bit_alloc[i][j]);
}
}
}
//end
噪声
有两个通道,这里只展示一个通道的信息。
音乐
只有一个通道
混合
此时有两个通道,这里也只展示一个: