Joint Stereo
是一种立体声编码技巧,主要分为Intensity Stereo(IS)和Mid/Side (M/S) stereo两种。
Intensity Stereo(IS)
IS的是在比较低流量时使用,利用了人耳对於低频讯号指向性分辨能力的不足,将音讯资料中的低频分解出来合成单声道资料,剩余的高频资料则合成另一个单声道资料,并另外纪录高频资料的位置资讯,来重建立体声的效果。例如钢琴独奏的录音就可以利用这种方法在有限的资料流量中减少音场资讯却大幅增加音色资讯。
记录 faac 中 IS 大致的编码算法
首先会计算一个 isthr
isthr = 0.18 / (quality * quality); // isthr 必须大于 0
- 一对且必须左右分窗情况相同
- 随后对每一个窗进行 IS 编码
阈值将修改,此外短窗从第 1 个频带开始,长窗从第 8 个频带开始 IS 编码
phthr = 1.0 / phthr;
- 针对每个频带,假设频带长度为 $n$,左右通道频谱数组分别为 $sl,sr$,有下列中间值运算:
- $enrgs=\sum_{i=1}^n(sl[i]+sr[i])^2$,幅值相加能量
- $enrgd=\sum_{i=1}^n(sl[i]-sr[i])^2$,幅值相减能量
- $enrgl=\sum_{i=1}^n(sl[i])^2$,左能量
- $enrgr=\sum_{i=1}^n(sr[i])^2$,右能量
- $ethr=(\sqrt{enrgl}+\sqrt{enrgr})^2\times phthr$,一个很重要的值
- $efix=enrgl+enrgr$,左右能量相加
计算出上述值之后进行判定,从逻辑上可以发现在考虑使用 $enrgs$ 还是 $enrgd$ 进行后续处理,这里也决定了扩展码书的使用。如果都不符合将不进行IS编码
if (enrgs >= ethr) { hcb = HCB_INTENSITY; vfix = sqrt(efix / enrgs); } else if (enrgd >= ethr) { hcb = HCB_INTENSITY2; vfix = sqrt(efix / enrgd); }
计算 $sf$ 和 $pan$
int sf = lrint(log10(enrgl / efix) * step); // enrgl 比例因子? int pan = lrint(log10(enrgr / efix) * step) - sf; // enrgr 比例因子差? // 如果 pan<-30右通道将使用0码, pan>30左通道将使用0码书,后续不进行处理了,那这样到底使用IS编码吗? cl->sf[*sfcnt] = sf; // 左边的比例因子 cr->sf[*sfcnt] = -pan; // 右边的比例因子 cr->book[*sfcnt] = hcb; // 右边的码书,也就是说这种情况下左右码书已确定
最后根据左码书情况选择 $sl$ 的值
if (hcb == HCB_INTENSITY) // 根据一下那个阈值的效果 sum = sl[l] + sr[l]; else sum = sl[l] - sr[l]; sl[l] = sum * vfix; // 修正一下左边的值
Mid/Side (M/S) stereo
Mid/Side (M/S) stereo在左右声道资料相似度大时常被用到,纪录方式是将左右声道音讯合并(L+R)得到新的一轨,再将左右声道音讯相减(L-R)得到另外一轨,然后再将这两轨资料用上面提到听觉心理学模型与滤波器处理。Mid/Side (M/S) stereo与IS一样的是利用部分相位(phase)资讯的损失来换得较高的音色纪录资讯。一般的MP3是Mid/Side stereo和Intensity Stereo交替使用的,视资料内容与流量而定。如果是更高流量如160kbps以上的MP3,则可以单独将立体声的两个声道独立编码,以保存相位资讯。
知觉噪声替换(PNS)
知觉噪声替换模块是一种以参数编码的方式模拟噪声的模块。在判别出音频值中的噪声后,将些噪声不进行量化编码,而是采用一些参数告诉解码器端这是某种噪声,然后解码器端将会对这些噪声用一些随机的编码来制造出这一类型的噪声。
瞬时噪声整形(TNS)
这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一些特殊的语音和剧烈变化信号的量化上,TNS技术对音质的提高贡献巨大!
TNS瞬态噪声整形用于控制一个转换窗口内的瞬时噪声形态。它是用一个对单个通道的滤波过程来实现的。传统的变换编码方案常常遇到信号在时域变化非常剧烈的问题,特别是语音信号,这个问题是因为量化后的噪声分布虽然在频率域上得到控制,但在时域上却以一个常数分布在一个转换块内。如果这种块中信号变化得很剧烈却又不转向一个短块去,那这个常数分布的噪声将会被听到。
TNS的原理利用了时域和频域的二元性和LPC(线性预测编码)的时频对称性,即在其中的任意一个域上做编码与在另一域上做预测编码等效,也就是说,在一个域内做预测编码可以在另一域内增加其解析度。量化噪声产生是在频域产生的,降低了时域的解析度,故在这里是在频域上做预测编码。在AACplus中,由于基于AAC profile LC,故TNS的滤波器阶数被限制在 12阶以内。
文档信息
- 本文作者:Jiamin Zeng
- 本文链接:https://jiaminzeng.github.io/2022/11/04/%E9%9F%B3%E9%A2%91%E8%A7%A3%E6%9E%90-%E5%86%85%E5%AE%B9%E6%9D%82%E9%A1%B9/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)