实时音频编解码之十 CELT编码器
Posted shichaog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时音频编解码之十 CELT编码器相关的知识,希望对你有一定的参考价值。
本文谢绝任何形式转载,谢谢。
第三章 CELT编码器
CELT基于音频信号谱包络是声音感知的最重要部分,CELT通过显式编码一组近似于听觉系统临界频带的频带的能量来保持这一包络。Bark子带就是人耳对不同频率成份听觉灵敏度(基于心理声学)的一种子带划分方法。相对于LPC编码,CELT编码的延迟短,编码带宽宽,因而CELT编码器常用于音乐网络场景。CELT基于MDCT频域编码方法,其编码语音的时频信息,这种编码方法对于长时稳态类型信号(如各类乐器声)非常适用。
音频信号通常是短时平稳的,因而常采用分段加窗方法截取小段进行处理,小段内信号可以认为是静态的,这正是大多数谱分析方法对信号特征的要求之一,分段也提高了信号实时性,但是由于为了无失真重构原始音频信号,通常而采用分段重叠加窗方法做STFT运算,这一重叠使得连续小段之间存在重复信息,因而直接编码STFT信息存在冗余,实时语音应用场景期望用尽可能少的比特率编码信号,因而常采用无这里冗余问题的MDCT编码方法,MDCT在重叠处使用投影的方法使得连续窗口中信息彼此正交以达到无信息冗余。
MDCT方法提供了输入信号的时频表示,可以在其中分析和处理随时间变化的频率成份,在MDCT域处理的信号在时域中保持连续,并且可以使用基于FFT的快速算法来工程上高效实现。MDCT是将实数信号映射为实数表示,MP3、Advanced Audio Coding (AAC)、Windows Media Audio (WMA)、 Vorbis (Ogg)、CELT以及Opus都使用到了这种编码技术。
3.1 MDCT 变换
MDCT和其他基于傅里叶变换方法有点区别,其输出是输入的一半,其是一个线性映射函数,将2N个实数值
x
0
,
⋯
,
x
2
N
−
1
x_0,\\cdots,x_2N-1
x0,⋯,x2N−1映射为N个实数值
X
0
,
⋯
,
X
N
X_0,\\cdots,X_N
X0,⋯,XN,MDCT分析滤波器表达式如下:
X
(
k
)
=
∑
n
=
0
2
N
−
1
x
n
cos
(
[
π
N
(
n
+
1
2
+
N
2
)
(
k
+
1
2
)
]
)
X(k)=\\sum \\limits_n=0^2N-1x_n \\cos([\\frac\\piN(n+\\frac12+\\fracN2)(k+\\frac12)])
X(k)=n=0∑2N−1xncos([Nπ(n+21+2N)(k+21)])
由于MDCT的逆变换输入是N个点,输出是2N个点,可通过相加后续重叠块来实现完美的可逆性,从而消除误差获得原始信号,这种技术称为时域混叠消除(TDAC)。IMDCT将N个实数
X
0
,
⋯
,
X
N
−
1
X_0, \\cdots, X_N-1
X0,⋯,XN−1变换为2N个实数
y
0
,
⋯
,
y
2
N
−
1
y_0, \\cdots , y_2N-1
y0,⋯,y2N−1的表达式如下:
y
n
=
1
N
∑
k
=
0
N
−
1
X
k
cos
(
[
π
(
2
n
+
1
+
N
)
2
N
⋅
2
k
+
1
2
]
)
y_n = \\frac1N\\sum \\limits_k=0^N-1X_k \\cos ([\\frac\\pi(2n+1+N)2N\\cdot \\frac2k+12])
yn=N1k=0∑N−1Xkcos([2Nπ(2n+1+N)⋅22k+1])
3.2 加窗
在典型的数据压缩应用中,可以使用加窗
w
n
,
n
=
0
,
⋯
,
2
N
−
1
w_n,n=0,\\cdots,2N-1
wn,n=0,⋯,2N−1的方法进一步提示变换的性质,为了避免在
n
=
0
n=0
n=0和
n
=
2
N
n=2N
n=2N边界的不连续性,通常窗函数会使该处的值为零。只要
w
w
w满足普林森-布拉德利条件
w
n
2
+
w
n
+
N
2
=
1
w_n^2+w_n+N^2=1
wn2+wn+N2=1,使用对称的窗函数
w
n
=
w
2
N
−
1
w_n=w_2N-1
wn=w2N−1,则变换是可逆的。MP3、MPEG-2 AAC以及CELT常采用的窗函数是:
w
n
=
sin
(
[
π
2
sin
2
(
π
2
N
(
n
+
1
2
)
)
]
)
w_n=\\sin([\\frac\\pi2 \\sin^2(\\frac\\pi2N(n+\\frac12))])
wn=sin([2πsin2(2Nπ(n+21))])
MDCT在重叠处获取信号的对称和反对称部分,将对称和反对称两部分分到不同音频段,然后对对称和反对称部分分别加窗以便在边界处将其平滑到零,这样连续的窗在重叠处是正交的,这同样可以无失真重构原始音频,然后对加窗信号进行DCT变换(即正交变换),为了相位和对称性与对称和反对称部分匹配DCT变换需要修正,因而MDCT变换被提了出来。对称性的匹配只能通过对DCT的修正来实现且不能推广到DFT。重构时将对称和反对称两部分相加,相互抵消无失真重构原始音频,这种相消称为TDAC。
3.3 CELT编码
分段之间小的重叠带来了低算法延迟和发音瞬变处理简单的好处,但小的重叠也带来了谱泄露的缺点,这可通过两个方面加以缓解,其一是在编码端使用一阶预加重滤波器
A
p
(
z
)
=
1
−
0.85
z
−
1
A_p(z)=1-0.85z^-1
Ap(z)=1−0.85z−1过滤输入信号,在解码端使用相反的去加重滤波器过滤得到输出信号,这减少了低频信号能量,进而减少了其泄露到高频的能量,其二是编码器使用了感知预滤波器,解码端使用对应的逆滤波器。CELT编解码基本结构如下图所示。
编码比特率中最重要的信息是每个频带MDCT系数的能量,
Q
1
Q_1
Q1和
Q
2
Q_2
Q2频带能量使用粗-精量化器量化,粗量化对每个频带使用固定的6dB增益进行量化,且增益有频带间预测和可选的帧间预测两种关系,预测器的2D变换如下:
A
(
z
l
,
z
b
)
=
(
1
−
α
z
l
−
1
)
1
−
z
b
−
1
1
−
β
z
b
−
1
A(z_l,z_b)=(1-\\alpha z_l^-1) \\frac1-z_b^-11-\\beta z_b^-1
A(zl,zb)=(1−αzl−1)1−βzb−11−zb−1
其中
l
l
l是帧号索引,
b
b
b是频带索引,任何帧都可以启用和关闭帧间预测,当启用时,
α
\\alpha
α和
β
\\beta
β是依赖于帧长的非零值,当关闭时,
α
=
0
,
β
=
0.15
\\alpha=0,\\beta=0.15
α=0,β=0.15。帧间预测效率高但是丢包性能不好,编码器可以根据丢包统计情况决定帧间依赖的开启和关闭。细粒度的能量量化
Q
2
Q_2
Q2的输入是
Q
1
Q_1
Q1量化误差。
通过对每个频带能量归一化使其是单位范数,设频带b的MDCT系数向量是
X
b
\\mathbf X_b
Xb实时音频编解码之十五 Opus编码-CELT编码