📄 g722.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int encode(int,int);
void decode(int);
int filtez(int *bpl,int *dlt);
void upzero(int dlt,int *dlti,int *bli);
int filtep(int rlt1,int al1,int rlt2,int al2);
int quantl(int el,int detl);
int invqxl(int il,int detl,int *code_table,int mode);
int logscl(int il,int nbl);
int scalel(int nbl,int shift_constant);
int uppol2(int al1,int al2,int plt,int plt1,int plt2);
int uppol1(int al1,int apl2,int plt,int plt1);
int invqah(int ih,int deth);
int logsch(int ih,int nbh);
void reset();
/* G722 C code */
/* variables for transimit quadrature mirror filter here */
int tqmf[24];
/* QMF filter coefficients:
scaled by a factor of 4 compared to G722 CCITT recomendation */
int h[24] = {
12, -44, -44, 212, 48, -624, 128, 1448,
-840, -3220, 3804, 15504, 15504, 3804, -3220, -840,
1448, 128, -624, 48, 212, -44, -44, 12
};
int xl,xh;
/* variables for receive quadrature mirror filter here */
int accumc[11],accumd[11];
/* outputs of decode() */
int xout1,xout2;
int xs,xd;
/* variables for encoder (hi and lo) here */
int il,szl,spl,sl,el;
int qq4_code4_table[16] = {
0, -20456, -12896, -8968, -6288, -4240, -2584, -1200,
20456, 12896, 8968, 6288, 4240, 2584, 1200, 0
};
int qq5_code5_table[32] = {
-280, -280, -23352, -17560, -14120, -11664, -9752, -8184,
-6864, -5712, -4696, -3784, -2960, -2208, -1520, -880,
23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712,
4696, 3784, 2960, 2208, 1520, 880, 280, -280
};
int qq6_code6_table[64] = {
-136, -136, -136, -136, -24808, -21904, -19008, -16704,
-14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856,
-7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576,
-3168, -2776, -2400, -2032, -1688, -1360, -1040, -728,
24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192,
10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456,
4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032,
1688, 1360, 1040, 728, 432, 136, -432, -136
};
int delay_bpl[6];
int delay_dltx[6];
int wl_code_table[16] = {
-60, 3042, 1198, 538, 334, 172, 58, -30,
3042, 1198, 538, 334, 172, 58, -30, -60
};
int wl_table[8] = {
-60, -30, 58, 172, 334, 538, 1198, 3042
};
int ilb_table[32] = {
2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383,
2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834,
2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371,
3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008
};
int nbl; /* delay line */
int al1,al2;
int plt,plt1,plt2;
int rs;
int dlt;
int rlt,rlt1,rlt2;
/* decision levels - pre-multiplied by 8, 0 to indicate end */
int decis_levl[30] = {
280, 576, 880, 1200, 1520, 1864, 2208, 2584,
2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288,
6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896,
14120, 15840, 17560, 20456, 23352, 32767
};
int detl;
/* quantization table 31 long to make quantl look-up easier,
last entry is for mil=30 case when wd is max */
int quant26bt_pos[31] = {
61, 60, 59, 58, 57, 56, 55, 54,
53, 52, 51, 50, 49, 48, 47, 46,
45, 44, 43, 42, 41, 40, 39, 38,
37, 36, 35, 34, 33, 32, 32
};
/* quantization table 31 long to make quantl look-up easier,
last entry is for mil=30 case when wd is max */
int quant26bt_neg[31] = {
63, 62, 31, 30, 29, 28, 27, 26,
25, 24, 23, 22, 21, 20, 19, 18,
17, 16, 15, 14, 13, 12, 11, 10,
9, 8, 7, 6, 5, 4, 4
};
int deth;
int sh; /* this comes from adaptive predictor */
int eh;
int qq2_code2_table[4] = {
-7408, -1616, 7408, 1616
};
int wh_code_table[4] = {
798, -214, 798, -214
};
int dh,ih;
int nbh,szh;
int sph,ph,yh,rh;
int delay_dhx[6];
int delay_bph[6];
int ah1,ah2;
int ph1,ph2;
int rh1,rh2;
/* variables for decoder here */
int ilr,yl,rl;
int dec_deth,dec_detl,dec_dlt;
int dec_del_bpl[6];
int dec_del_dltx[6];
int dec_plt,dec_plt1,dec_plt2;
int dec_szl,dec_spl,dec_sl;
int dec_rlt1,dec_rlt2,dec_rlt;
int dec_al1,dec_al2;
int dl;
int dec_nbl,dec_yh,dec_dh,dec_nbh;
/* variables used in filtez */
int dec_del_bph[6];
int dec_del_dhx[6];
int dec_szh;
/* variables used in filtep */
int dec_rh1,dec_rh2;
int dec_ah1,dec_ah2;
int dec_ph,dec_sph;
int dec_sh,dec_rh;
int dec_ph1,dec_ph2;
/* G722 encode function two ints in, one 8 bit output */
/* put input samples in xin1 = first value, xin2 = second value */
/* returns il and ih stored together */
int encode(int xin1,int xin2)
{
int i;
int *h_ptr,*tqmf_ptr,*tqmf_ptr1;
long int xa,xb;
int decis;
/* transmit quadrature mirror filters implemented here */
h_ptr = h;
tqmf_ptr = tqmf;
xa = (long)(*tqmf_ptr++) * (*h_ptr++);
xb = (long)(*tqmf_ptr++) * (*h_ptr++);
/* main multiply accumulate loop for samples and coefficients */
for(i = 0 ; i < 10 ; i++) {
xa += (long)(*tqmf_ptr++) * (*h_ptr++);
xb += (long)(*tqmf_ptr++) * (*h_ptr++);
}
/* final mult/accumulate */
xa += (long)(*tqmf_ptr++) * (*h_ptr++);
xb += (long)(*tqmf_ptr) * (*h_ptr++);
/* update delay line tqmf */
tqmf_ptr1 = tqmf_ptr - 2;
for(i = 0 ; i < 22 ; i++) *tqmf_ptr-- = *tqmf_ptr1--;
*tqmf_ptr-- = xin1;
*tqmf_ptr = xin2;
/* scale outputs */
xl = (xa + xb) >> 15;
xh = (xa - xb) >> 15;
/* end of quadrature mirror filter code */
/* starting with lower sub band encoder */
/* filtez - compute predictor output section - zero section */
szl = filtez(delay_bpl,delay_dltx);
/* filtep - compute predictor output signal (pole section) */
spl = filtep(rlt1,al1,rlt2,al2);
/* compute the predictor output value in the lower sub_band encoder */
sl = szl + spl;
el = xl - sl;
/* quantl: quantize the difference signal */
il = quantl(el,detl);
/* invqxl: computes quantized difference signal */
/* for invqbl, truncate by 2 lsbs, so mode = 3 */
dlt = ((long)detl*qq4_code4_table[il >> 2]) >> 15;
/* logscl: updates logarithmic quant. scale factor in low sub band */
nbl = logscl(il,nbl);
/* scalel: compute the quantizer scale factor in the lower sub band */
/* calling parameters nbl and 8 (constant such that scalel can be scaleh) */
detl = scalel(nbl,8);
/* parrec - simple addition to compute recontructed signal for adaptive pred */
plt = dlt + szl;
/* upzero: update zero section predictor coefficients (sixth order)*/
/* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */
/* bpli (linear_buffer in which all six values are delayed */
/* return params: updated bpli, delayed dltx */
upzero(dlt,delay_dltx,delay_bpl);
/* uppol2- update second predictor coefficient apl2 and delay it as al2 */
/* calling parameters: al1, al2, plt, plt1, plt2 */
al2 = uppol2(al1,al2,plt,plt1,plt2);
/* uppol1 :update first predictor coefficient apl1 and delay it as al1 */
/* calling parameters: al1, apl2, plt, plt1 */
al1 = uppol1(al1,al2,plt,plt1);
/* recons : compute recontructed signal for adaptive predictor */
rlt = sl + dlt;
/* done with lower sub_band encoder; now implement delays for next time*/
rlt2 = rlt1;
rlt1 = rlt;
plt2 = plt1;
plt1 = plt;
/* high band encode */
szh = filtez(delay_bph,delay_dhx);
sph = filtep(rh1,ah1,rh2,ah2);
/* predic: sh = sph + szh */
sh = sph + szh;
/* subtra: eh = xh - sh */
eh = xh - sh;
/* quanth - quantization of difference signal for higher sub-band */
/* quanth: in-place for speed params: eh, deth (has init. value) */
if(eh >= 0) {
ih = 3; /* 2,3 are pos codes */
}
else {
ih = 1; /* 0,1 are neg codes */
}
decis = (564L*(long)deth) >> 12L;
if(abs(eh) > decis) ih--; /* mih = 2 case */
/* invqah: compute the quantized difference signal, higher sub-band*/
dh = ((long)deth*qq2_code2_table[ih]) >> 15L ;
/* logsch: update logarithmic quantizer scale factor in hi sub-band*/
nbh = logsch(ih,nbh);
/* note : scalel and scaleh use same code, different parameters */
deth = scalel(nbh,10);
/* parrec - add pole predictor output to quantized diff. signal */
ph = dh + szh;
/* upzero: update zero section predictor coefficients (sixth order) */
/* calling parameters: dh, dhi, bphi */
/* return params: updated bphi, delayed dhx */
upzero(dh,delay_dhx,delay_bph);
/* uppol2: update second predictor coef aph2 and delay as ah2 */
/* calling params: ah1, ah2, ph, ph1, ph2 */
ah2 = uppol2(ah1,ah2,ph,ph1,ph2);
/* uppol1: update first predictor coef. aph2 and delay it as ah1 */
ah1 = uppol1(ah1,ah2,ph,ph1);
/* recons for higher sub-band */
yh = sh + dh;
/* 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));
}
/* decode function, result in xout1 and xout2 */
void decode(int input)
{
int i;
long int xa1,xa2; /* qmf accumulators */
int *h_ptr,*ac_ptr,*ac_ptr1,*ad_ptr,*ad_ptr1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -