123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /*
- ********************************************************************************
- *
- * 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 : syn_filt.c
- * Purpose : Perform synthesis filtering through 1/A(z).
- *
- ********************************************************************************
- */
- /*
- ********************************************************************************
- * MODULE INCLUDE FILE AND VERSION ID
- ********************************************************************************
- */
- #include "syn_filt.h"
- const char syn_filt_id[] = "@(#)$Id $" syn_filt_h;
- /*
- ********************************************************************************
- * INCLUDE FILES
- ********************************************************************************
- */
- #include "typedef.h"
- #include "basic_op.h"
- #include "count.h"
- #include "cnst.h"
- /*
- ********************************************************************************
- * LOCAL VARIABLES AND TABLES
- ********************************************************************************
- */
- /*
- *--------------------------------------*
- * Constants (defined in cnst.h *
- *--------------------------------------*
- * M : LPC order *
- *--------------------------------------*
- */
- /*
- ********************************************************************************
- * PUBLIC PROGRAM CODE
- ********************************************************************************
- */
- void Syn_filt (
- Word16 a[], /* (i) : a[M+1] prediction coefficients (M=10) */
- Word16 x[], /* (i) : input signal */
- Word16 y[], /* (o) : output signal */
- Word16 lg, /* (i) : size of filtering */
- Word16 mem[], /* (i/o) : memory associated with this filtering. */
- Word16 update /* (i) : 0=no update, 1=update of memory. */
- )
- {
- Word16 i, j;
- Word32 s;
- Word16 tmp[80]; /* This is usually done by memory allocation (lg+M) */
- Word16 *yy;
- /* Copy mem[] to yy[] */
- yy = tmp; move16 ();
- for (i = 0; i < M; i++)
- {
- *yy++ = mem[i]; move16 ();
- }
- /* Do the filtering. */
- for (i = 0; i < lg; i++)
- {
- s = L_mult_ex (x[i], a[0]);
- for (j = 1; j <= M; j++)
- {
- s = L_msu_ex (s, a[j], yy[-j]);
- }
- s = L_shl_ex (s, 3);
- *yy++ = round_ex (s); move16 ();
- }
- for (i = 0; i < lg; i++)
- {
- y[i] = tmp[i + M]; move16 ();
- }
- /* Update of memory if update==1 */
- test ();
- if (update != 0)
- {
- for (i = 0; i < M; i++)
- {
- mem[i] = y[lg - M + i]; move16 ();
- }
- }
- return;
- }
|