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

📄 g722.~c

📁 G722语音压缩算法
💻 ~C
📖 第 1 页 / 共 2 页
字号:
/* done with higher sub-band encoder, now Delay for next time */
    rh2 = rh1;
    rh1 = yh;
    ph2 = ph1;
    ph1 = ph;

/* multiplex ih and il to get signals together */
    //return(il | (ih << 6));
    data1 = il;
    data2 = ih;
    return 1;
}

/* decode function, result in xout1 and xout2 */

//void decode(INT32 input)
void decode(INT32 input1,INT32 input2)
{
    INT32 i;
    //long int xa1,xa2;    /* qmf accumulators */
    INT32 xa1,xa2;
    INT32 *h_ptr,*ac_ptr,*ac_ptr1,*ad_ptr,*ad_ptr1;

/* split transmitted word from input into ilr and ih */
    //ilr = input & 0x3f;
    //ih = input >> 6;
    ilr = input1;
    ih = input2;

/* LOWER SUB_BAND DECODER */

/* filtez: compute predictor output for zero section */
    dec_szl = filtez(dec_del_bpl,dec_del_dltx);

/* filtep: compute predictor output signal for pole section */
    dec_spl = filtep(dec_rlt1,dec_al1,dec_rlt2,dec_al2);

    dec_sl = dec_spl + dec_szl;

/* invqxl: compute quantized difference signal for adaptive predic */
    //dec_dlt = ((INT32)dec_detl*qq4_code4_table[ilr >> 2]) >> 15;//06.6.9
    dec_dlt = ((INT32)dec_detl*qq4_code4_table[ilr >> 2]) + (16384) >> 15;

/* invqxl: compute quantized difference signal for decoder output */
    //dl = ((INT32)dec_detl*qq6_code6_table[il]) >> 15; //06.6.9
    dl = ((INT32)dec_detl*qq6_code6_table[il]) + (16384) >> 15;

    rl = dl + dec_sl;

/* logscl: quantizer scale factor adaptation in the lower sub-band */
    dec_nbl = logscl(ilr,dec_nbl);

/* scalel: computes quantizer scale factor in the lower sub band */
    dec_detl = scalel(dec_nbl,8);

/* parrec - add pole predictor output to quantized diff. signal */
/* for partially reconstructed signal */
    dec_plt = dec_dlt + dec_szl;

/* upzero: update zero section predictor coefficients */
    upzero(dec_dlt,dec_del_dltx,dec_del_bpl);

/* uppol2: update second predictor coefficient apl2 and delay it as al2 */
    dec_al2 = uppol2(dec_al1,dec_al2,dec_plt,dec_plt1,dec_plt2);

/* uppol1: update first predictor coef. (pole setion) */
    dec_al1 = uppol1(dec_al1,dec_al2,dec_plt,dec_plt1);

/* recons : compute recontructed signal for adaptive predictor */
    dec_rlt = dec_sl + dec_dlt;

/* done with lower sub band decoder, implement delays for next time */
    dec_rlt2 = dec_rlt1;
    dec_rlt1 = dec_rlt;
    dec_plt2 = dec_plt1;
    dec_plt1 = dec_plt;

/* HIGH SUB-BAND DECODER */

/* filtez: compute predictor output for zero section */
    dec_szh = filtez(dec_del_bph,dec_del_dhx);

/* filtep: compute predictor output signal for pole section */
    dec_sph = filtep(dec_rh1,dec_ah1,dec_rh2,dec_ah2);

/* predic:compute the predictor output value in the higher sub_band decoder */
    dec_sh = dec_sph + dec_szh;

/* invqah: in-place compute the quantized difference signal */
    //dec_dh = ((INT32)dec_deth*qq2_code2_table[ih]) >> 15L ; //06.6.9
    dec_dh = ((INT32)dec_deth*qq2_code2_table[ih]) + (16384) >> 15; 

/* logsch: update logarithmic quantizer scale factor in hi sub band */
    dec_nbh = logsch(ih,dec_nbh);

/* scalel: compute the quantizer scale factor in the higher sub band */
    dec_deth = scalel(dec_nbh,10);

/* parrec: compute partially recontructed signal */
    dec_ph = dec_dh + dec_szh;

/* upzero: update zero section predictor coefficients */
    upzero(dec_dh,dec_del_dhx,dec_del_bph);

/* uppol2: update second predictor coefficient aph2 and delay it as ah2 */
    dec_ah2 = uppol2(dec_ah1,dec_ah2,dec_ph,dec_ph1,dec_ph2);

/* uppol1: update first predictor coef. (pole setion) */
    dec_ah1 = uppol1(dec_ah1,dec_ah2,dec_ph,dec_ph1);

/* recons : compute recontructed signal for adaptive predictor */
    rh = dec_sh + dec_dh;

/* done with high band decode, implementing delays for next time here */
    dec_rh2 = dec_rh1;
    dec_rh1 = rh;
    dec_ph2 = dec_ph1;
    dec_ph1 = dec_ph;

/* end of higher sub_band decoder */

/* end with receive quadrature mirror filters */
    xd = rl - rh;
    xs = rl + rh;

/* receive quadrature mirror filters implemented here */
    h_ptr = h;
    ac_ptr = accumc;
    ad_ptr = accumd;
    xa1 = (INT32)xd * (*h_ptr++);
    xa2 = (INT32)xs * (*h_ptr++);
/* main multiply accumulate loop for samples and coefficients */
    for(i = 0 ; i < 10 ; i++)
    {
        xa1 += (INT32)(*ac_ptr++) * (*h_ptr++);
        xa2 += (INT32)(*ad_ptr++) * (*h_ptr++);
    }
/* final mult/accumulate */
    xa1 += (INT32)(*ac_ptr) * (*h_ptr++);
    xa2 += (INT32)(*ad_ptr) * (*h_ptr++);

/* scale by 2^14 */
    xout1 = xa1 >> 14;
    xout2 = xa2 >> 14;
    //define the data 06.6.9
    if(xout1>32767)  xout1 = 32767;
    else if(xout1<-32768)  xout1 = -32768;

    if(xout2>32767)  xout2 = 32767;
    else if(xout2<-32768)  xout2 = -32768;

/* update delay lines */
    ac_ptr1 = ac_ptr - 1;
    ad_ptr1 = ad_ptr - 1;
    for(i = 0 ; i < 10 ; i++)
    {
        *ac_ptr-- = *ac_ptr1--;
        *ad_ptr-- = *ad_ptr1--;
    }
    *ac_ptr = xd;
    *ad_ptr = xs;

    return;
}

/* clear all storage locations */

void reset()
{
    INT32 i;

    detl = dec_detl = 32;   /* reset to min scale factor */
    deth = dec_deth = 8;
    nbl = al1 = al2 = plt1 = plt2 = rlt1 = rlt2 = 0;
    nbh = ah1 = ah2 = ph1 = ph2 = rh1 = rh2 = 0;
    dec_nbl = dec_al1 = dec_al2 = dec_plt1 = dec_plt2 = dec_rlt1 = dec_rlt2 = 0;
    dec_nbh = dec_ah1 = dec_ah2 = dec_ph1 = dec_ph2 = dec_rh1 = dec_rh2 = 0;

    for(i = 0 ; i < 6 ; i++)
    {
        delay_dltx[i] = 0;
        delay_dhx[i] = 0;
        dec_del_dltx[i] = 0;
        dec_del_dhx[i] = 0;
    }

    for(i = 0 ; i < 6 ; i++)
    {
        delay_bpl[i] = 0;
        delay_bph[i] = 0;
        dec_del_bpl[i] = 0;
        dec_del_bph[i] = 0;
    }

    for(i = 0 ; i < 23 ; i++) tqmf[i] = 0;

    for(i = 0 ; i < 11 ; i++)
    {
        accumc[i] = 0;
        accumd[i] = 0;
    }
    return;
}

/* filtez - compute predictor output signal (zero section) */
/* input: bpl1-6 and dlt1-6, output: szl */

INT32 filtez(INT32 *bpl,INT32 *dlt)
{
    INT32 i;
    //long int zl;
    INT32 zl;
    zl = (*bpl++) * (*dlt++);
    /* MAX: 6 */
    for(i = 1 ; i < 6 ; i++)
        zl += (*bpl++) * (*dlt++);

    return((zl >> 14));   /* x2 here */
}

/* filtep - compute predictor output signal (pole section) */
/* input rlt1-2 and al1-2, output spl */

INT32 filtep(INT32 rlt1,INT32 al1,INT32 rlt2,INT32 al2)
{
    //long int pl,pl2;
    INT32 pl,pl2;
    pl = 2*rlt1;
    pl = (INT32)al1*pl;
    pl2 = 2*rlt2;
    pl += (INT32)al2*pl2;
    return((pl >> 15));
}

/* quantl - quantize the difference signal in the lower sub-band */
INT32 quantl(INT32 el,INT32 detl)
{
    INT32 ril,mil;
    //long int wd,decis;
    INT32 wd,decis;

/* abs of difference signal */
    wd = my_abs(el);
/* determine mil based on decision levels and detl gain */
    /* MAX: 30 */
    for(mil = 0 ; mil < 30 ; mil++)
    {
        //decis = (decis_levl[mil]*(INT32)detl) >> 15L;  //06.6.9
        decis = (decis_levl[mil]*(INT32)detl) + 16384 >> 15;
        if(wd <= decis) break;
    }
/* if mil=30 then wd is less than all decision levels */
    if(el >= 0) ril = quant26bt_pos[mil];
    else ril = quant26bt_neg[mil];
    return(ril);
}

/* invqxl is either invqbl or invqal depending on parameters passed */
/* returns dlt, code table is pre-multiplied by 8 */

/*    INT32 invqxl(INT32 il,INT32 detl,INT32 *code_table,INT32 mode) */
/*    { */
/*        INT32 INT32 dlt; */
/*       dlt = (INT32)detl*code_table[il >> (mode-1)]; */
/*        return((INT32)(dlt >> 15)); */
/*    } */

/* logscl - update log quantizer scale factor in lower sub-band */
/* note that nbl is passed and returned */

INT32 logscl(INT32 il,INT32 nbl)
{
    //long int wd;
    INT32 wd;
    //wd = ((INT32)nbl * 127L) >> 7L;   /* leak factor 127/128 */  //06.6.9
    wd = ((INT32)nbl * 127L) + 64 >> 7;
    nbl = wd + wl_code_table[il >> 2];
    if(nbl < 0) nbl = 0;
    if(nbl > 18432) nbl = 18432;
    return(nbl);
}

/* scalel: compute quantizer scale factor in lower or upper sub-band*/

INT32 scalel(INT32 nbl,INT32 shift_constant)
{
    INT32 wd1,wd2,wd3;
    wd1 = (nbl >> 6) & 31;
    wd2 = nbl >> 11;
    wd3 = ilb_table[wd1] >> (shift_constant + 1 - wd2);
    return(wd3 << 3);
}

/* upzero - inputs: dlt, dlti[0-5], bli[0-5], outputs: updated bli[0-5] */
/* also implements delay of bli and update of dlti from dlt */

void upzero(INT32 dlt,INT32 *dlti,INT32 *bli)
{
    INT32 i,wd2,wd3;
/*if dlt is zero, then no sum INT32o bli */
    if(dlt == 0)
    {
      for(i = 0 ; i < 6 ; i++)
      {
        //bli[i] = ((255L*bli[i]) >> 8L); /* leak factor of 255/256 */   //06.6.9
        bli[i] = ((255L*bli[i]) + 128 >> 8);
      }
    }
    else
    {
      for(i = 0 ; i < 6 ; i++)
      {
        if((INT32)dlt*dlti[i] >= 0) wd2 = 128;
        else wd2 = -128;
        //wd3 = (INT32)((255L*bli[i]) >> 8L);    /* leak factor of 255/256 */ //06.6.9
        wd3 = (INT32)((255L*bli[i]) + 128 >> 8);
        bli[i] = wd2 + wd3;
      }
    }
/* implement delay line for dlt */
    dlti[5] = dlti[4];
    dlti[4] = dlti[3];
    dlti[3] = dlti[2];
    dlti[1] = dlti[0];
    dlti[0] = dlt;
    return;
}

/* uppol2 - update second predictor coefficient (pole section) */
/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */

INT32 uppol2(INT32 al1,INT32 al2,INT32 plt,INT32 plt1,INT32 plt2)
{
    //long int wd2,wd4;
    INT32 wd2,wd4;
    INT32 apl2;
    wd2 = 4L*(INT32)al1;
    if((INT32)plt*plt1 >= 0L) wd2 = -wd2;    /* check same sign */
    wd2 = wd2 >> 7;                  /* gain of 1/128 */
    if((INT32)plt*plt2 >= 0L)
    {
        wd4 = wd2 + 128;             /* same sign case */
    }
    else
    {
        wd4 = wd2 - 128;
    }
    //apl2 = wd4 + (127L*al2 >> 7L);  /* leak factor of 127/128 */ //06.6.9
    apl2 = wd4 + (127*al2 + 64 >> 7);

/* apl2 is limited to +-.75 */
    if(apl2 > 12288) apl2 = 12288;
    if(apl2 < -12288) apl2 = -12288;
    return(apl2);
}

/* uppol1 - update first predictor coefficient (pole section) */
/* inputs: al1, apl2, plt, plt1. outputs: apl1 */

INT32 uppol1(INT32 al1,INT32 apl2,INT32 plt,INT32 plt1)
{
    //long int wd2;
    INT32 wd2;
    INT32 wd3,apl1;
    //wd2 = ((INT32)al1*255L) >> 8L;   /* leak factor of 255/256 */  //06.6.9
    wd2 = ((INT32)al1*255) + 128 >> 8;
    if((INT32)plt*plt1 >= 0L)
    {
        apl1 = wd2 + 192;      /* same sign case */
    }
    else
    {
        apl1 = wd2 - 192;
    }
/* note: wd3= .9375-.75 is always positive */
    wd3 = 15360 - apl2;             /* limit value */
    if(apl1 > wd3) apl1 = wd3;
    if(apl1 < -wd3) apl1 = -wd3;
    return(apl1);
}

/* INVQAH: inverse adaptive quantizer for the higher sub-band */
/* returns dh, code table is pre-multiplied by 8 */

/*  INT32 invqah(INT32 ih,INT32 deth) */
/*  { */
/*        INT32 INT32 rdh; */
/*        rdh = ((INT32)deth*qq2_code2_table[ih]) >> 15L ; */
/*        return((INT32)(rdh )); */
/*  } */

/* logsch - update log quantizer scale factor in higher sub-band */
/* note that nbh is passed and returned */

INT32 logsch(INT32 ih,INT32 nbh)
{
    INT32 wd;
    //wd = ((INT32)nbh * 127L) >> 7L;       /* leak factor 127/128 */ //06.6.9
    wd = ((INT32)nbh * 127) + 64 >> 7;
    nbh = wd + wh_code_table[ih];
    if(nbh < 0) nbh = 0;
    if(nbh > 22528) nbh = 22528;
    return(nbh);
}


//#ifndef Seoul_Mate
//INT32 main()
INT16 inPut(INT16 *test_data, INT16 *compressed, INT16 *result, INT16 n)
{
    INT32 i,j,f/*,answer*/;
    //static INT32 test_data[SIZE*2],compressed[SIZE],result[SIZE*2];

/* reset, initialize required memory */
     //reset();

/* read in amplitude and frequency for test data */
    /*  scanf("%d",&j);
  scanf("%d",&f); */
     //j = 10; f = 2000;  /* k鰎s men, anv鋘ds INT32e */

/* 16 KHz sample rate */
    /* XXmain_0, MAX: 2 */
    /* Since the number of times we loop in my_sin depends on the argument we
       add the fact: xxmain_0:[]: */
    //for(i = 0 ; i < SIZE ; i++) {
    //          test_data[i] = (INT32)j*my_cos(f*PI*i);
    //}



    /* MAX: 2 */

/*******Antar att test_data[0] = 10 och test_data[1]=-6 fr錸 ovan,          *******
        och att anropet i forloopen blir encode(test_data[0],test_data[0]);
		och encode(test_data[1],test_data[1]), eftersom att den annars g錼
 *******鰒er array gr鋘sen                                                  *******/


   //for(i = 0 ; i < IN_END ; i += 2)
   for(i = 0 ; i < n ; i += 2)
   {
      //compressed[i/2] = encode(test_data[i],test_data[i+1]);
      encode(test_data[i],test_data[i+1]);
      compressed[i] = data1;
      compressed[i+1] = data2;
   }

    /* MAX: 2 */
   //for(i = 0 ; i < IN_END ; i += 2)
   for(i = 0 ; i < n ; i += 2)
   {
      //decode(compressed[i/2]);
      decode(compressed[i],compressed[i+1]);
      result[i] = xout1;
      result[i+1] = xout2;
   }
/*
for( ; j < 32767 ; j++) {
i=IN_END-1;
prINT32f("\n%4d %4d %4d %4d %4d",j,compressed[i/2] >> 6,compressed[i/2] & 63,result[i],result[i-1]);
}
*/
/* prINT32 ih, il */
/*
    for(i = 0 ; i < IN_END/2 ; i++) prINT32f("\n%4d %2d %2d",
        i,compressed[i] >> 6,compressed[i] & 63);
*/

    return result[i]+result[i+1];
}
//#endif




⌨️ 快捷键说明

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