解码一帧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============================================================