解码一帧Layer3第6步:消混叠处理 -- class Layer3的antialias方法
消混叠(antialias)处理就是消除伪信号。相邻两个子带间互相干扰造成失真,为了减小这种影响,在信号送入IMDCT之前作消混叠处理。消混叠通过对子带作8点的蝶形变换实现。原理如下图:
图1
图2
经过逆量化后得到频域信号,一个粒度组内一个声道内共576个频谱值,将576个频谱值被分为18个子带,每个子带32条频率线。8点的的蝶形变换在相邻的两个子带之间进行。图中cai、csi就是源码中的cs[i]和cs[i]。cs[i]和ca[i]我们在构造函数中已经初始化过了。
【提示】以下代码是Layer3.java的一部分,应遵守《(一)用JAVA编写MP3解码器——前言》中的许可协议。
class Layer3的antialias方法源码:
//6.
//>>>>ANTIALIAS============================================================
private static float[] ca, cs;
private void antialias(final int ch, final int gr) {
GRInfo gr_info = (objSI.ch[ch].gr[gr]);
int sb, ss, sblim = 0;
float bu, bd;
if (gr_info.block_type == 2) {
if (gr_info.mixed_block_flag == 0)
return;
sblim = 1;
} else
sblim = (rzero_index[ch] - 1) / 18; //sblim=(17+nozero_index[ch])/18-1
for (sb = 0; sb < sblim; sb++)
for (ss = 0; ss < 8; ss++) {
bu = xr[ch][sb][17 - ss];
bd = xr[ch][sb + 1][ss];
xr[ch][sb][17 - ss] = bu * cs[ss] - bd * ca[ss];
xr[ch][sb + 1][ss] = bd * cs[ss] + bu * ca[ss];
}
}
//<<<<ANTIALIAS============================================================