FreeCalypso > hg > gsm-codec-lib
diff libtwamr/spreproc.c @ 403:7e0aeab69b10
libtwamr: integrate spreproc.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 06 May 2024 23:11:34 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/spreproc.c Mon May 06 23:11:34 2024 +0000 @@ -0,0 +1,114 @@ +/* +******************************************************************************** +* +* GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 +* R99 Version 3.3.0 +* REL-4 Version 4.1.0 +* +******************************************************************************** +* +* File : spreproc.c +* Purpose : Subframe preprocessing +* +******************************************************************************** +*/ + +/* +******************************************************************************** +* MODULE INCLUDE FILE AND VERSION ID +******************************************************************************** +*/ +#include "namespace.h" +#include "spreproc.h" + +/* +******************************************************************************** +* INCLUDE FILES +******************************************************************************** +*/ +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "weight_a.h" +#include "syn_filt.h" +#include "residu.h" +#include "memops.h" +#include "no_count.h" + +/* +******************************************************************************** +* PUBLIC PROGRAM CODE +******************************************************************************** +*/ +int subframePreProc( + enum Mode mode, /* i : coder mode */ + const Word16 gamma1[], /* i : spectral exp. factor 1 */ + const Word16 gamma1_12k2[],/* i : spectral exp. factor 1 for EFR */ + const Word16 gamma2[], /* i : spectral exp. factor 2 */ + Word16 *A, /* i : A(z) unquantized for the 4 subframes */ + Word16 *Aq, /* i : A(z) quantized for the 4 subframes */ + Word16 *speech, /* i : speech segment */ + Word16 *mem_err, /* i : pointer to error signal */ + Word16 *mem_w0, /* i : memory of weighting filter */ + Word16 *zero, /* i : pointer to zero vector */ + Word16 ai_zero[], /* o : history of weighted synth. filter */ + Word16 exc[], /* o : long term prediction residual */ + Word16 h1[], /* o : impulse response */ + Word16 xn[], /* o : target vector for pitch search */ + Word16 res2[], /* o : long term prediction residual */ + Word16 error[] /* o : error of LPC synthesis filter */ +) +{ + Word16 i; + Word16 Ap1[MP1]; /* A(z) with spectral expansion */ + Word16 Ap2[MP1]; /* A(z) with spectral expansion */ + const Word16 *g1; /* Pointer to correct gammma1 vector */ + + /*---------------------------------------------------------------* + * mode specific pointer to gamma1 values * + *---------------------------------------------------------------*/ + test (); test (); + if ( sub(mode, MR122) == 0 || sub(mode, MR102) == 0 ) + { + g1 = gamma1_12k2; move16 (); + } + else + { + g1 = gamma1; move16 (); + } + /*---------------------------------------------------------------* + * Find the weighted LPC coefficients for the weighting filter. * + *---------------------------------------------------------------*/ + Weight_Ai(A, g1, Ap1); + Weight_Ai(A, gamma2, Ap2); + + /*---------------------------------------------------------------* + * Compute impulse response, h1[], of weighted synthesis filter * + *---------------------------------------------------------------*/ + for (i = 0; i <= M; i++) + { + ai_zero[i] = Ap1[i]; move16 (); + } + + Syn_filt(Aq, ai_zero, h1, L_SUBFR, zero, 0); + Syn_filt(Ap2, h1, h1, L_SUBFR, zero, 0); + + /*------------------------------------------------------------------------* + * * + * Find the target vector for pitch search: * + * * + *------------------------------------------------------------------------*/ + + /* LPC residual */ + Residu(Aq, speech, res2, L_SUBFR); + Copy(res2, exc, L_SUBFR); + + Syn_filt(Aq, exc, error, L_SUBFR, mem_err, 0); + + Residu(Ap1, error, xn, L_SUBFR); + + /* target signal xn[]*/ + Syn_filt(Ap2, xn, xn, L_SUBFR, mem_w0, 0); + + return 0; +}