comparison 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
comparison
equal deleted inserted replaced
254:f931e704adc5 255:07f936338de1
1 /*
2 ********************************************************************************
3 *
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
5 * R99 Version 3.3.0
6 * REL-4 Version 4.1.0
7 *
8 ********************************************************************************
9 *
10 * File : b_cn_cod.c
11 * Purpose : Contains function for comfort noise generation.
12 *
13 ********************************************************************************
14 */
15 /*
16 ********************************************************************************
17 * MODULE INCLUDE FILE AND VERSION ID
18 ********************************************************************************
19 */
20 #include "namespace.h"
21 #include "b_cn_cod.h"
22
23 /*
24 ********************************************************************************
25 * INCLUDE FILES
26 ********************************************************************************
27 */
28 #include "typedef.h"
29 #include "basic_op.h"
30 #include "oper_32b.h"
31 #include "no_count.h"
32 #include "cnst.h"
33 #include "window.h"
34
35 /*
36 ********************************************************************************
37 * LOCAL CONSTANTS
38 ********************************************************************************
39 */
40 #define NB_PULSE 10 /* number of random pulses in DTX operation */
41
42 /*
43 ********************************************************************************
44 * PUBLIC PROGRAM CODE
45 ********************************************************************************
46 */
47 /*************************************************************************
48 *
49 * FUNCTION NAME: pseudonoise
50 *
51 *************************************************************************/
52 Word16 pseudonoise (
53 Word32 *shift_reg, /* i/o : Old CN generator shift register state */
54 Word16 no_bits /* i : Number of bits */
55 )
56 {
57 Word16 noise_bits, Sn, i;
58
59 noise_bits = 0; move16 ();
60 for (i = 0; i < no_bits; i++)
61 {
62 /* State n == 31 */
63 test (); logic32 ();
64 if ((*shift_reg & 0x00000001L) != 0)
65 {
66 Sn = 1; move16 ();
67 }
68 else
69 {
70 Sn = 0; move16 ();
71 }
72
73 /* State n == 3 */
74 test (); logic32 ();
75 if ((*shift_reg & 0x10000000L) != 0)
76 {
77 Sn = Sn ^ 1; move16 (); logic16 ();
78 }
79 else
80 {
81 Sn = Sn ^ 0; move16 (); logic16 ();
82 }
83
84 noise_bits = shl (noise_bits, 1);
85 noise_bits = noise_bits | (extract_l (*shift_reg) & 1);
86 logic16 (); logic16 (); move16 ();
87
88 *shift_reg = L_shr (*shift_reg, 1);
89 test ();
90 if (Sn & 1)
91 {
92 *shift_reg = *shift_reg | 0x40000000L; move32 (); logic32 ();
93 }
94 }
95 return noise_bits;
96 }
97
98 /***************************************************************************
99 *
100 * Function : build_CN_code
101 *
102 ***************************************************************************/
103 void build_CN_code (
104 Word32 *seed, /* i/o : Old CN generator shift register state */
105 Word16 cod[] /* o : Generated CN fixed codebook vector */
106 )
107 {
108 Word16 i, j, k;
109
110 for (i = 0; i < L_SUBFR; i++)
111 {
112 cod[i] = 0; move16 ();
113 }
114
115 for (k = 0; k < NB_PULSE; k++)
116 {
117 i = pseudonoise (seed, 2); /* generate pulse position */
118 i = shr (extract_l (L_mult (i, 10)), 1);
119 i = add (i, k);
120
121 j = pseudonoise (seed, 1); /* generate sign */
122
123 test ();
124 if (j > 0)
125 {
126 cod[i] = 4096; move16 ();
127 }
128 else
129 {
130 cod[i] = -4096; move16 ();
131 }
132 }
133
134 return;
135 }
136
137 /*************************************************************************
138 *
139 * FUNCTION NAME: build_CN_param
140 *
141 *************************************************************************/
142 void build_CN_param (
143 Word16 *seed, /* i/o : Old CN generator shift register state */
144 const Word16 n_param, /* i : number of params */
145 const Word16 param_size_table[],/* i : size of params */
146 Word16 parm[] /* o : CN Generated params */
147 )
148 {
149 Word16 i;
150 const Word16 *p;
151
152 *seed = extract_l(L_add(L_shr(L_mult(*seed, 31821), 1), 13849L));
153
154 p = &window_200_40[*seed & 0x7F]; logic16();
155 for(i=0; i< n_param;i++){
156 move16 (); logic16(); logic16(); logic16();
157 parm[i] = *p++ & ~(0xFFFF<<param_size_table[i]);
158 }
159 }