论坛首页 Java企业应用论坛

(十二)用JAVA编写MP3解码器——消混叠处理

浏览 3881 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-08-26   最后修改:2010-09-04

解码一帧Layer3第6步:消混叠处理 -- class Layer3的antialias方法

 

      消混叠(antialias)处理就是消除伪信号。相邻两个子带间互相干扰造成失真,为了减小这种影响,在信号送入IMDCT之前作消混叠处理。消混叠通过对子带作8点的蝶形变换实现。原理如下图:

Layer3 aliasing reduction

 图1

Layer3 aliasing-butterfly

 图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============================================================

 

 

上一篇:(十一)用JAVA编写MP3解码器——立体声处理

下一篇:(十三)用JAVA编写MP3解码器——IMDCT快速算法

 

【下载地址】http://jmp123.sourceforge.net/

  • 大小: 29.9 KB
  • 大小: 8.1 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics