📄 acelp_ca.c
字号:
/* ITU-T G.729 Annex C - Reference C code for floating point implementation of G.729 Annex A Version 1.01 of 15.September.98*//*---------------------------------------------------------------------- COPYRIGHT NOTICE---------------------------------------------------------------------- ITU-T G.729 Annex C ANSI C source code Copyright (C) 1998, AT&T, France Telecom, NTT, University of Sherbrooke. All rights reserved.----------------------------------------------------------------------*//* File : ACELP_CA.C Used for the floating point version of G.729A only (not for G.729 main body)*//*---------------------------------------------------------------------------* * Function ACELP_code_A() * * ~~~~~~~~~~~~~~~~~~~~~~~~ * * Find Algebraic codebook for G.729A * *--------------------------------------------------------------------------*//* L_SUBFR -> Lenght of subframe. *//* NB_POS -> Number of positios for each pulse. *//* STEP -> Step betweem position of the same pulse. *//* MSIZE -> Size of vectors for cross-correlation between two pulses. */#include "typedef.h"#include "ld8a.h"/* local routines definition */static void cor_h( FLOAT *H, /* (i) :Impulse response of filters */ FLOAT *rr /* (o) :Correlations of H[] */);static int d4i40_17_fast(/*(o) : Index of pulses positions. */ FLOAT dn[], /* (i) : Correlations between h[] and Xn[]. */ FLOAT *rr, /* (i) : Correlations of impulse response h[]. */ FLOAT h[], /* (i) : Impulse response of filters. */ FLOAT cod[], /* (o) : Selected algebraic codeword. */ FLOAT y[], /* (o) : Filtered algebraic codeword. */ int *sign /* (o) : Signs of 4 pulses. */); /*-----------------------------------------------------------------* * Main ACELP function. * *-----------------------------------------------------------------*/int ACELP_code_A( /* (o) :index of pulses positions */ FLOAT x[], /* (i) :Target vector */ FLOAT h[], /* (i) :Inpulse response of filters */ int T0, /* (i) :Pitch lag */ FLOAT pitch_sharp, /* (i) :Last quantized pitch gain */ FLOAT code[], /* (o) :Innovative codebook */ FLOAT y[], /* (o) :Filtered innovative codebook */ int *sign /* (o) :Signs of 4 pulses */){ int i, index; FLOAT Dn[L_SUBFR]; FLOAT rr[DIM_RR]; /*-----------------------------------------------------------------* * Include fixed-gain pitch contribution into impulse resp. h[] * * Find correlations of h[] needed for the codebook search. * *-----------------------------------------------------------------*/ if (T0 < L_SUBFR) for (i = T0; i < L_SUBFR; i++) h[i] += pitch_sharp * h[i-T0]; cor_h(h, rr); /*-----------------------------------------------------------------* * Compute correlation of target vector with impulse response. * *-----------------------------------------------------------------*/ cor_h_x(h, x, Dn); /*-----------------------------------------------------------------* * Find innovative codebook. * *-----------------------------------------------------------------*/ index = d4i40_17_fast(Dn, rr, h, code, y, sign); /*-----------------------------------------------------------------* * Compute innovation vector gain. * * Include fixed-gain pitch contribution into code[]. * *-----------------------------------------------------------------*/ if(T0 < L_SUBFR) for (i = T0; i < L_SUBFR; i++) code[i] += pitch_sharp*code[i-T0]; return index;}/*--------------------------------------------------------------------------* * Function cor_h() * * ~~~~~~~~~~~~~~~~~ * * Compute correlations of h[] needed for the codebook search. * *--------------------------------------------------------------------------*/static void cor_h( FLOAT *h, /* (i) :Impulse response of filters */ FLOAT *rr /* (o) :Correlations of H[] */){ FLOAT *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4; FLOAT *rri0i1, *rri0i2, *rri0i3, *rri0i4; FLOAT *rri1i2, *rri1i3, *rri1i4; FLOAT *rri2i3, *rri2i4; FLOAT *p0, *p1, *p2, *p3, *p4; FLOAT *ptr_hd, *ptr_hf, *ptr_h1, *ptr_h2; FLOAT cor; int i, k, ldec, l_fin_sup, l_fin_inf; /*------------------------------------------------------------* * Compute rri0i0[], rri1i1[], rri2i2[], rri3i3 and rri4i4[] * *------------------------------------------------------------*/ /* Init pointers */ rri0i0 = rr; rri1i1 = rri0i0 + NB_POS; rri2i2 = rri1i1 + NB_POS; rri3i3 = rri2i2 + NB_POS; rri4i4 = rri3i3 + NB_POS; rri0i1 = rri4i4 + NB_POS; rri0i2 = rri0i1 + MSIZE; rri0i3 = rri0i2 + MSIZE; rri0i4 = rri0i3 + MSIZE; rri1i2 = rri0i4 + MSIZE; rri1i3 = rri1i2 + MSIZE; rri1i4 = rri1i3 + MSIZE; rri2i3 = rri1i4 + MSIZE; rri2i4 = rri2i3 + MSIZE; p0 = rri0i0 + NB_POS-1; /* Init pointers to last position of rrixix[] */ p1 = rri1i1 + NB_POS-1; p2 = rri2i2 + NB_POS-1; p3 = rri3i3 + NB_POS-1; p4 = rri4i4 + NB_POS-1; ptr_h1 = h; cor = (F)0.0; for(i=0; i<NB_POS; i++) { cor += *ptr_h1 * *ptr_h1; ptr_h1++; *p4-- = cor; cor += *ptr_h1 * *ptr_h1; ptr_h1++; *p3-- = cor; cor += *ptr_h1 * *ptr_h1; ptr_h1++; *p2-- = cor; cor += *ptr_h1 * *ptr_h1; ptr_h1++; *p1-- = cor; cor += *ptr_h1 * *ptr_h1; ptr_h1++; *p0-- = cor; } /*-----------------------------------------------------------------* * Compute elements of: rri2i3[], rri1i2[], rri0i1[] and rri0i4[] * *-----------------------------------------------------------------*/ l_fin_sup = MSIZE-1; l_fin_inf = l_fin_sup-1; ldec = NB_POS+1; ptr_hd = h; ptr_hf = ptr_hd + 1; for(k=0; k<NB_POS; k++) { p3 = rri2i3 + l_fin_sup; p2 = rri1i2 + l_fin_sup; p1 = rri0i1 + l_fin_sup; p0 = rri0i4 + l_fin_inf; cor = (F)0.0; ptr_h1 = ptr_hd; ptr_h2 = ptr_hf; for(i=k+1; i<NB_POS; i++ ) { cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p2 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p1 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p0 = cor; p3 -= ldec; p2 -= ldec; p1 -= ldec; p0 -= ldec; } cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p2 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p1 = cor; l_fin_sup -= NB_POS; l_fin_inf--; ptr_hf += STEP; } /*---------------------------------------------------------------------* * Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3 * *---------------------------------------------------------------------*/ ptr_hd = h; ptr_hf = ptr_hd + 2; l_fin_sup = MSIZE-1; l_fin_inf = l_fin_sup-1; for(k=0; k<NB_POS; k++) { p4 = rri2i4 + l_fin_sup; p3 = rri1i3 + l_fin_sup; p2 = rri0i2 + l_fin_sup; p1 = rri1i4 + l_fin_inf; p0 = rri0i3 + l_fin_inf; cor = (F)0.0; ptr_h1 = ptr_hd; ptr_h2 = ptr_hf; for(i=k+1; i<NB_POS; i++ ) { cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p4 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p2 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p1 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p0 = cor; p4 -= ldec; p3 -= ldec; p2 -= ldec; p1 -= ldec; p0 -= ldec; } cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p4 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p2 = cor; l_fin_sup -= NB_POS; l_fin_inf--; ptr_hf += STEP; } /*----------------------------------------------------------------------* * Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2 * *----------------------------------------------------------------------*/ ptr_hd = h; ptr_hf = ptr_hd + 3; l_fin_sup = MSIZE-1; l_fin_inf = l_fin_sup-1; for(k=0; k<NB_POS; k++) { p4 = rri1i4 + l_fin_sup; p3 = rri0i3 + l_fin_sup; p2 = rri2i4 + l_fin_inf; p1 = rri1i3 + l_fin_inf; p0 = rri0i2 + l_fin_inf; ptr_h1 = ptr_hd; ptr_h2 = ptr_hf; cor = (F)0.0; for(i=k+1; i<NB_POS; i++ ) { cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p4 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p2 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p1 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p0 = cor; p4 -= ldec; p3 -= ldec; p2 -= ldec; p1 -= ldec; p0 -= ldec; } cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p4 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; l_fin_sup -= NB_POS; l_fin_inf--; ptr_hf += STEP; } /*----------------------------------------------------------------------* * Compute elements of: rri0i4[], rri2i3[], rri1i2[], rri0i1[] * *----------------------------------------------------------------------*/ ptr_hd = h; ptr_hf = ptr_hd + 4; l_fin_sup = MSIZE-1; l_fin_inf = l_fin_sup-1; for(k=0; k<NB_POS; k++) { p3 = rri0i4 + l_fin_sup; p2 = rri2i3 + l_fin_inf; p1 = rri1i2 + l_fin_inf; p0 = rri0i1 + l_fin_inf; ptr_h1 = ptr_hd; ptr_h2 = ptr_hf; cor = 0; for(i=k+1; i<NB_POS; i++ ) { cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p2 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p1 = cor; cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p0 = cor; p3 -= ldec; p2 -= ldec; p1 -= ldec; p0 -= ldec; } cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++; *p3 = cor; l_fin_sup -= NB_POS; l_fin_inf--; ptr_hf += STEP; }}/*------------------------------------------------------------------------* * Function d4i40_17_fast * * ~~~~~~~~~ * * Algebraic codebook for G.729A. * * -> 17 bits; 4 pulses in a frame of 40 samples * * * *------------------------------------------------------------------------* * The code length is 40, containing 4 nonzero pulses i0, i1, i2, i3. * * Each pulses can have 8 possible positions (positive or negative) * * except i3 that have 16 possible positions. * * * * i0 (+-1) : 0, 5, 10, 15, 20, 25, 30, 35 * * i1 (+-1) : 1, 6, 11, 16, 21, 26, 31, 36 * * i2 (+-1) : 2, 7, 12, 17, 22, 27, 32, 37 * * i3 (+-1) : 3, 8, 13, 18, 23, 28, 33, 38 * * 4, 9, 14, 19, 24, 29, 34, 39 * *------------------------------------------------------------------------*/static int d4i40_17_fast(/*(o) : Index of pulses positions. */ FLOAT dn[], /* (i) : Correlations between h[] and Xn[]. */ FLOAT rr[], /* (i) : Correlations of impulse response h[]. */ FLOAT h[], /* (i) : Impulse response of filters. */ FLOAT cod[], /* (o) : Selected algebraic codeword. */ FLOAT y[], /* (o) : Filtered algebraic codeword. */ int *sign /* (o) : Signs of 4 pulses. */){ int i0, i1, i2, i3, ip0=0, ip1=0, ip2=0, ip3=0; int i, j, ix=0, iy=0, track, trk; int prev_i0, i1_offset; FLOAT psk, ps=0, ps0, ps1, ps2, sq, sq2; FLOAT alpk, alp, max; FLOAT s, alp0, alp1, alp2; FLOAT *p0, *p1, *p2, *p3, *p4; FLOAT sign_dn[L_SUBFR], sign_dn_inv[L_SUBFR], *psign; FLOAT tmp_vect[NB_POS]; FLOAT *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4; FLOAT *rri0i1, *rri0i2, *rri0i3, *rri0i4; FLOAT *rri1i2, *rri1i3, *rri1i4; FLOAT *rri2i3, *rri2i4; FLOAT *ptr_rri0i3_i4; FLOAT *ptr_rri1i3_i4; FLOAT *ptr_rri2i3_i4; FLOAT *ptr_rri3i3_i4; /* Init pointers */ rri0i0 = rr; rri1i1 = rri0i0 + NB_POS; rri2i2 = rri1i1 + NB_POS; rri3i3 = rri2i2 + NB_POS; rri4i4 = rri3i3 + NB_POS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -