⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ilbc_decoder.java

📁 java的ilbc语音编码器,实现了其全部功能
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	    }

	    /* get decoded residual from reversed vector */

	    for (i=0; i < ilbc_constants.SUBL*Nback; i++)
		decresidual[ilbc_constants.SUBL*Nback - i - 1] =
		    reverseDecresidual[i];
	}
    }


    /*----------------------------------------------------------------*
     *  main decoder function
     *---------------------------------------------------------------*/

    void iLBC_decode(
		     float decblock[],            /* (o) decoded signal block */
		     bitstream bytes,           /* (i) encoded signal bits */
		     int mode )                   /* (i) 0: bad packet, PLC,
						    1: normal */
    {
	float [] data = new float[ilbc_constants.BLOCKL_MAX];
	float [] lsfdeq = new float[ilbc_constants.LPC_FILTERORDER * ilbc_constants.LPC_N_MAX];
	float [] PLCresidual = new float[ilbc_constants.BLOCKL_MAX];
	float [] PLClpc = new float[ilbc_constants.LPC_FILTERORDER + 1];
	float [] zeros = new float[ilbc_constants.BLOCKL_MAX];
	float [] one = new float[ilbc_constants.LPC_FILTERORDER + 1];
	int k, i, start, idxForMax, pos, lastpart, ulp;
	int lag, ilag;
	float cc, maxcc;
	int [] idxVec = new int[ilbc_constants.STATE_LEN];
	int check;
	int [] gain_index = new int[ilbc_constants.NASUB_MAX * ilbc_constants.CB_NSTAGES];
	int [] extra_gain_index = new int[ilbc_constants.CB_NSTAGES];
	int [] cb_index = new int[ilbc_constants.CB_NSTAGES * ilbc_constants.NASUB_MAX];
	int [] extra_cb_index = new int[ilbc_constants.CB_NSTAGES];
	int [] lsf_i = new int[ilbc_constants.LSF_NSPLIT * ilbc_constants.LPC_N_MAX];
	int state_first;
	int last_bit;
	//	unsigned char *pbytes;
	float [] weightdenum = new float[(ilbc_constants.LPC_FILTERORDER + 1) *
					   ilbc_constants.NSUB_MAX];
	int order_plus_one;
	float [] syntdenum = new float[ilbc_constants.NSUB_MAX * (ilbc_constants.LPC_FILTERORDER + 1)];
	float [] decresidual = new float[ilbc_constants.BLOCKL_MAX];

	if (mode > 0) { /* the data are good */

	    /* decode data */

	    //	    pbytes=bytes;
	    pos=0;

	    /* Set everything to zero before decoding */

	    for (k=0; k<ilbc_constants.LSF_NSPLIT * ilbc_constants.LPC_N_MAX; k++) {
		lsf_i[k]=0;
	    }
	    start = 0;
	    state_first = 0;
	    idxForMax = 0;
	    for (k = 0; k < this.ULP_inst.state_short_len; k++) {
		idxVec[k]=0;
	    }
	    for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
		extra_cb_index[k]=0;
	    }
	    for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
		extra_gain_index[k]=0;
	    }
	    for (i=0; i<this.ULP_inst.nasub; i++) {
		for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
		    cb_index[i*ilbc_constants.CB_NSTAGES+k]=0;
		}
	    }
	    for (i=0; i<this.ULP_inst.nasub; i++) {
		for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
		    gain_index[i*ilbc_constants.CB_NSTAGES+k]=0;
		}
	    }

	    /* loop over ULP classes */

	    for (ulp=0; ulp<3; ulp++) {

		/* LSF */
		for (k=0; k<ilbc_constants.LSF_NSPLIT*this.ULP_inst.lpc_n; k++){
		    lastpart = bytes.unpack(this.ULP_inst.lsf_bits[k][ulp]);
// 		    unpack( &pbytes, &lastpart,
// 			    this.ULP_inst.lsf_bits[k][ulp], &pos);
		    lsf_i[k] = bytes.packcombine(lsf_i[k], lastpart,
						 this.ULP_inst.lsf_bits[k][ulp]);
		    //		    System.out.println("lsf_i["+k+"] = " + lsf_i[k]);
// 		    packcombine(&lsf_i[k], lastpart,
// 				this.ULP_inst.lsf_bits[k][ulp]);
		}

		/* Start block info */

		lastpart = bytes.unpack(this.ULP_inst.start_bits[ulp]);
// 		unpack( &pbytes, &lastpart,
// 			this.ULP_inst.start_bits[ulp], &pos);
		start = bytes.packcombine(start, lastpart,
				    this.ULP_inst.start_bits[ulp]);
		//		System.out.println("start = " + start);
// 		packcombine(&start, lastpart,
// 			    this.ULP_inst.start_bits[ulp]);

		lastpart = bytes.unpack(this.ULP_inst.startfirst_bits[ulp]);
// 		unpack( &pbytes, &lastpart,
// 			this.ULP_inst.startfirst_bits[ulp], &pos);
		state_first = bytes.packcombine(state_first, lastpart,
						this.ULP_inst.startfirst_bits[ulp]);
		//		System.out.println("state_first = " + state_first);
// 		packcombine(&state_first, lastpart,
// 			    this.ULP_inst.startfirst_bits[ulp]);

		lastpart = bytes.unpack(this.ULP_inst.scale_bits[ulp]);
// 		unpack( &pbytes, &lastpart,
// 			this.ULP_inst.scale_bits[ulp], &pos);
		idxForMax = bytes.packcombine(idxForMax, lastpart,
					      this.ULP_inst.scale_bits[ulp]);
		//		System.out.println("idxForMax = " + idxForMax);
// 		packcombine(&idxForMax, lastpart,
// 			    this.ULP_inst.scale_bits[ulp]);

		for (k=0; k<this.ULP_inst.state_short_len; k++) {
		    lastpart = bytes.unpack(this.ULP_inst.state_bits[ulp]);
// 		    unpack( &pbytes, &lastpart,
// 			    this.ULP_inst.state_bits[ulp], &pos);
		    idxVec[k] = bytes.packcombine(idxVec[k], lastpart,
						  this.ULP_inst.state_bits[ulp]);
		    //		    System.out.println("idxVec["+k+"] = " + idxVec[k]);
// 		    packcombine(idxVec+k, lastpart,
// 				this.ULP_inst.state_bits[ulp]);
		}

		/* 23/22 (20ms/30ms) sample block */

		for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
		    lastpart = bytes.unpack(this.ULP_inst.extra_cb_index[k][ulp]);
// 		    unpack( &pbytes, &lastpart,
// 			    this.ULP_inst.extra_cb_index[k][ulp],
// 			    &pos);
		    extra_cb_index[k] = bytes.packcombine(extra_cb_index[k], lastpart,
							  this.ULP_inst.extra_cb_index[k][ulp]);
		    //		    System.out.println("extra_cb_index["+k+"] = " + extra_cb_index[k]);
// 		    packcombine(extra_cb_index+k, lastpart,
// 				this.ULP_inst.extra_cb_index[k][ulp]);
		}
		for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
		    lastpart = bytes.unpack(this.ULP_inst.extra_cb_gain[k][ulp]);
// 		    unpack( &pbytes, &lastpart,
// 			    this.ULP_inst.extra_cb_gain[k][ulp],
// 			    &pos);
		    extra_gain_index[k] = bytes.packcombine(extra_gain_index[k], lastpart,
							    this.ULP_inst.extra_cb_gain[k][ulp]);
		    //		    System.out.println("extra_gain_index["+k+"] = " + extra_gain_index[k]);
// 		    packcombine(extra_gain_index+k, lastpart,
// 				this.ULP_inst.extra_cb_gain[k][ulp]);
		}

		/* The two/four (20ms/30ms) 40 sample sub-blocks */

		for (i=0; i<this.ULP_inst.nasub; i++) {
		    for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
			lastpart = bytes.unpack(this.ULP_inst.cb_index[i][k][ulp]);
// 			unpack( &pbytes, &lastpart,
// 				this.ULP_inst.cb_index[i][k][ulp],
// 				&pos);
			cb_index[i * ilbc_constants.CB_NSTAGES + k] =
			    bytes.packcombine(cb_index[i*ilbc_constants.CB_NSTAGES+k], lastpart,
					      this.ULP_inst.cb_index[i][k][ulp]);
			//			System.out.println("cb_index["+(i*ilbc_constants.CB_NSTAGES+k)+"] = " + cb_index[(i*ilbc_constants.CB_NSTAGES+k)]);
// 			packcombine(cb_index+i*CB_NSTAGES+k, lastpart,
// 				    this.ULP_inst.cb_index[i][k][ulp]);
		    }
		}

		for (i=0; i<this.ULP_inst.nasub; i++) {
		    for (k=0; k<ilbc_constants.CB_NSTAGES; k++) {
			lastpart = bytes.unpack(this.ULP_inst.cb_gain[i][k][ulp]);
			gain_index[i * ilbc_constants.CB_NSTAGES+k] =
			    bytes.packcombine(gain_index[i*ilbc_constants.CB_NSTAGES+k], lastpart,
					      this.ULP_inst.cb_gain[i][k][ulp]);
			//			System.out.println("gain_index["+(i*ilbc_constants.CB_NSTAGES+k)+"] = " + gain_index[(i*ilbc_constants.CB_NSTAGES+k)]);
		    }
		}
	    }
	    /* Extract last bit. If it is 1 this indicates an
	       empty/lost frame */
	    last_bit = bytes.unpack(1);
	    //	    System.out.println("last_bit = "  + last_bit);

	    /* Check for bit errors or empty/lost frames */
	    if (start < 1)
		mode = 0;
	    if (this.ULP_inst.mode==20 && start>3)
		mode = 0;
	    if (this.ULP_inst.mode==30 && start>5)
		mode = 0;
	    if (last_bit==1)
		mode = 0;

	    if (mode==1) { /* No bit errors was detected,
			      continue decoding */

		/* adjust index */
		index_conv_dec(cb_index);

// 		for (int li = 0; li < cb_index.length; li++)
// 		    System.out.println("cb_index["+li+"] = " + cb_index[li]);

		/* decode the lsf */

		SimplelsfDEQ(lsfdeq, lsf_i, this.ULP_inst.lpc_n);
// 		for (int li = 0; li < lsfdeq.length; li++)
// 		    System.out.println("lsfdeq["+li+"] = " + lsfdeq[li]);
		check=ilbc_common.LSF_check(lsfdeq, ilbc_constants.LPC_FILTERORDER,
				this.ULP_inst.lpc_n);
// 		System.out.println("check returns " + check);
		DecoderInterpolateLSF(syntdenum, weightdenum,
				      lsfdeq, ilbc_constants.LPC_FILTERORDER);
// 		for (int li = 0; li < syntdenum.length; li++)
// 		    System.out.println("syntdenum[" + li + "] = " + syntdenum[li]);
// 		for (int li = 0; li < weightdenum.length; li++)
// 		    System.out.println("weightdenum[" + li + "] = " + weightdenum[li]);

		Decode(decresidual, start, idxForMax,
		       idxVec, syntdenum, cb_index, gain_index,
		       extra_cb_index, extra_gain_index,
		       state_first);

// 		for (int li = 0; li < decresidual.length; li++)
// 		    System.out.println("decresidual[" + li + "] = " + decresidual[li]);

		/* preparing the plc for a future loss! */

		doThePLC(PLCresidual, PLClpc, 0, decresidual,
			 syntdenum,
			 (ilbc_constants.LPC_FILTERORDER + 1)*(this.ULP_inst.nsub - 1),
			 last_lag);

		System.arraycopy(PLCresidual, 0, decresidual, 0, this.ULP_inst.blockl);
// 		for (int li = 0; li < decresidual.length; li++)
// 		    System.out.println("decresidual[" + li + "] = " + decresidual[li]);
// 		memcpy(decresidual, PLCresidual,
// 		       this.ULP_inst.blockl*sizeof(float));
	    }

	}

	if (mode == 0) {
	    /* the data is bad (either a PLC call
	     * was made or a severe bit error was detected)
	     */

	    /* packet loss conceal */

	    for (int li = 0; li < ilbc_constants.BLOCKL_MAX; li++)
		zeros[li] = 0.0f;
	    //	    memset(zeros, 0, BLOCKL_MAX*sizeof(float));

	    one[0] = 1;
	    for (int li = 0; li < ilbc_constants.LPC_FILTERORDER; li++)
		one[li+1] = 0.0f;
	    //	    memset(one+1, 0, LPC_FILTERORDER*sizeof(float));

	    start=0;

	    doThePLC(PLCresidual, PLClpc, 1, zeros, one, 0,
		     last_lag);
	    System.arraycopy(PLCresidual, 0, decresidual, 0, this.ULP_inst.blockl);
// 	    memcpy(decresidual, PLCresidual,
// 		   this.ULP_inst.blockl*sizeof(float));

	    order_plus_one = ilbc_constants.LPC_FILTERORDER + 1;
	    for (i = 0; i < this.ULP_inst.nsub; i++) {
		System.arraycopy(PLClpc, 0, syntdenum, (i * order_plus_one), order_plus_one);
// 		memcpy(syntdenum+(i*order_plus_one), PLClpc,
// 		       order_plus_one*sizeof(float));
	    }
	}

	if (this.use_enhancer == 1) {

	    /* post filtering */

	    this.last_lag = enhancerInterface(data, decresidual);

// 	    System.out.println("last_lag : " + this.last_lag);

// 	   for (int li = 0; li < data.length; li++)
// 	     System.out.println("data["+li+"] = " + data[li]);

	    //	    for (li = 0; li <

	    /* synthesis filtering */

	    if (this.ULP_inst.mode == 20) {
		/* Enhancer has 40 samples delay */
		i = 0;
// 		System.out.println("run 1");
		syntFilter(data,i * ilbc_constants.SUBL,
			   this.old_syntdenum,
			   (i+this.ULP_inst.nsub-1)*(ilbc_constants.LPC_FILTERORDER+1),
			   ilbc_constants.SUBL, this.syntMem);
// 		System.out.println("runs 2");
		for (i=1; i < this.ULP_inst.nsub; i++) {
// 		    System.out.println("pass " + i);
		    syntFilter(data, i * ilbc_constants.SUBL,
			       syntdenum, (i-1)*(ilbc_constants.LPC_FILTERORDER+1),
			       ilbc_constants.SUBL, this.syntMem);
// 		    System.out.println("pass " + i + " ends");
		}
// 	   for (int li = 0; li < data.length; li++)
// 	     System.out.println("psdata["+li+"] = " + data[li]);

	    } else if (this.ULP_inst.mode == 30) {
		/* Enhancer has 80 samples delay */
// 		System.out.println("runs 3");
		for (i = 0; i < 2; i++) {
		    syntFilter(data, i * ilbc_constants.SUBL,
			       this.old_syntdenum,
			       (i+this.ULP_inst.nsub-2)*(ilbc_constants.LPC_FILTERORDER+1),
			       ilbc_constants.SUBL, this.syntMem);
		}
		for (i=2; i < this.ULP_inst.nsub; i++) {
// 		    System.out.println("runs 4");
		    syntFilter(data,  i * ilbc_constants.SUBL,
			       syntdenum, (i-2)*(ilbc_constants.LPC_FILTERORDER+1),
			       ilbc_constants.SUBL, this.syntMem);
		}
	    }

	} else {

	    /* Find last lag */
	    lag = 20;
	    maxcc = xCorrCoef(decresidual,
			      ilbc_constants.BLOCKL_MAX - ilbc_constants.ENH_BLOCKL,
			      decresidual,
			      ilbc_constants.BLOCKL_MAX - ilbc_constants.ENH_BLOCKL-lag,
			      ilbc_constants.ENH_BLOCKL);

	    for (ilag = 21; ilag < 120; ilag++) {
		cc = xCorrCoef(decresidual,
			       ilbc_constants.BLOCKL_MAX - ilbc_constants.ENH_BLOCKL,
			       decresidual,
			       ilbc_constants.BLOCKL_MAX - ilbc_constants.ENH_BLOCKL - ilag,
			       ilbc_constants.ENH_BLOCKL);

		if (cc > maxcc) {
		    maxcc = cc;
		    lag = ilag;
		}
	    }
	    this.last_lag = lag;

	    /* copy data and run synthesis filter */

	    System.arraycopy(decresidual, 0, data, 0, this.ULP_inst.blockl);
// 	    memcpy(data, decresidual,
// 		   this.ULP_inst.blockl*sizeof(float));
// 	    System.out.println("runs 5");
	    for (i=0; i < this.ULP_inst.nsub; i++) {
		syntFilter(data, i * ilbc_constants.SUBL,
			   syntdenum, i * (ilbc_constants.LPC_FILTERORDER + 1),
			   ilbc_constants.SUBL, this.syntMem);
	    }

	}

	/* high pass filtering on output if desired, otherwise
	   copy to out */

	hpOutput(data, this.ULP_inst.blockl, decblock, this.hpomem);

	/* memcpy(decblock,data,iLBCdec_inst->blockl*sizeof(float));*/

	System.arraycopy(syntdenum, 0, this.old_syntdenum, 0,
			 this.ULP_inst.nsub * (ilbc_constants.LPC_FILTERORDER+1));
// 	memcpy(this.old_syntdenum, syntdenum,
// 	       this.ULP_inst.nsub*(LPC_FILTERORDER+1)*sizeof(float));

	this.prev_enh_pl=0;

	if (mode==0) { /* PLC was used */
	    this.prev_enh_pl=1;
	}
    }


    public ilbc_decoder(int init_mode, int init_enhancer)
    {
	ULP_inst = new ilbc_ulp(init_mode);
	/* properties to initialize : */
	syntMem = new float[ilbc_constants.LPC_FILTERORDER];
	prevLpc = new float[ilbc_constants.LPC_FILTERORDER+1];
	prevResidual = new float[ilbc_constants.NSUB_MAX*ilbc_constants.SUBL];
	old_syntdenum = n

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -