FreeCalypso > hg > gsm-codec-lib
diff libtwamr/b_cn_cod.c @ 255:07f936338de1
libtwamr: integrated up to b_cn_cod.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 05 Apr 2024 17:31:49 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/b_cn_cod.c Fri Apr 05 17:31:49 2024 +0000 @@ -0,0 +1,159 @@ +/* +******************************************************************************** +* +* 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 : b_cn_cod.c +* Purpose : Contains function for comfort noise generation. +* +******************************************************************************** +*/ +/* +******************************************************************************** +* MODULE INCLUDE FILE AND VERSION ID +******************************************************************************** +*/ +#include "namespace.h" +#include "b_cn_cod.h" + +/* +******************************************************************************** +* INCLUDE FILES +******************************************************************************** +*/ +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "no_count.h" +#include "cnst.h" +#include "window.h" + +/* +******************************************************************************** +* LOCAL CONSTANTS +******************************************************************************** +*/ +#define NB_PULSE 10 /* number of random pulses in DTX operation */ + +/* +******************************************************************************** +* PUBLIC PROGRAM CODE +******************************************************************************** +*/ +/************************************************************************* + * + * FUNCTION NAME: pseudonoise + * + *************************************************************************/ +Word16 pseudonoise ( + Word32 *shift_reg, /* i/o : Old CN generator shift register state */ + Word16 no_bits /* i : Number of bits */ +) +{ + Word16 noise_bits, Sn, i; + + noise_bits = 0; move16 (); + for (i = 0; i < no_bits; i++) + { + /* State n == 31 */ + test (); logic32 (); + if ((*shift_reg & 0x00000001L) != 0) + { + Sn = 1; move16 (); + } + else + { + Sn = 0; move16 (); + } + + /* State n == 3 */ + test (); logic32 (); + if ((*shift_reg & 0x10000000L) != 0) + { + Sn = Sn ^ 1; move16 (); logic16 (); + } + else + { + Sn = Sn ^ 0; move16 (); logic16 (); + } + + noise_bits = shl (noise_bits, 1); + noise_bits = noise_bits | (extract_l (*shift_reg) & 1); + logic16 (); logic16 (); move16 (); + + *shift_reg = L_shr (*shift_reg, 1); + test (); + if (Sn & 1) + { + *shift_reg = *shift_reg | 0x40000000L; move32 (); logic32 (); + } + } + return noise_bits; +} + +/*************************************************************************** +* +* Function : build_CN_code +* +***************************************************************************/ +void build_CN_code ( + Word32 *seed, /* i/o : Old CN generator shift register state */ + Word16 cod[] /* o : Generated CN fixed codebook vector */ +) +{ + Word16 i, j, k; + + for (i = 0; i < L_SUBFR; i++) + { + cod[i] = 0; move16 (); + } + + for (k = 0; k < NB_PULSE; k++) + { + i = pseudonoise (seed, 2); /* generate pulse position */ + i = shr (extract_l (L_mult (i, 10)), 1); + i = add (i, k); + + j = pseudonoise (seed, 1); /* generate sign */ + + test (); + if (j > 0) + { + cod[i] = 4096; move16 (); + } + else + { + cod[i] = -4096; move16 (); + } + } + + return; +} + +/************************************************************************* + * + * FUNCTION NAME: build_CN_param + * + *************************************************************************/ +void build_CN_param ( + Word16 *seed, /* i/o : Old CN generator shift register state */ + const Word16 n_param, /* i : number of params */ + const Word16 param_size_table[],/* i : size of params */ + Word16 parm[] /* o : CN Generated params */ + ) +{ + Word16 i; + const Word16 *p; + + *seed = extract_l(L_add(L_shr(L_mult(*seed, 31821), 1), 13849L)); + + p = &window_200_40[*seed & 0x7F]; logic16(); + for(i=0; i< n_param;i++){ + move16 (); logic16(); logic16(); logic16(); + parm[i] = *p++ & ~(0xFFFF<<param_size_table[i]); + } +}