comparison libtwamr/ex_ctrl.c @ 364:3f27ca24c620

libtwamr: integrate ex_ctrl.c
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 06 May 2024 02:54:36 +0000
parents
children
comparison
equal deleted inserted replaced
363:0349de7c45b7 364:3f27ca24c620
1 /*************************************************************************
2 *
3 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
4 * R99 Version 3.3.0
5 * REL-4 Version 4.1.0
6 *
7 ********************************************************************************
8 *
9 * File : ex_ctrl.c
10 * Purpose : Excitation Control module in background noise
11 *
12 ********************************************************************************
13 */
14
15 /*
16 ********************************************************************************
17 * MODULE INCLUDE FILE AND VERSION ID
18 ********************************************************************************
19 */
20 #include "namespace.h"
21 #include "ex_ctrl.h"
22
23 #include "typedef.h"
24 #include "basic_op.h"
25 #include "no_count.h"
26 #include "cnst.h"
27 #include "memops.h"
28 #include "gmed_n.h"
29 #include "sqrt_l.h"
30
31 /*
32 ********************************************************************************
33 * LOCAL VARIABLES AND TABLES
34 ********************************************************************************
35 */
36 /*-----------------------------------------------------------------*
37 * Decoder constant parameters (defined in "cnst.h") *
38 *-----------------------------------------------------------------*
39 * L_FRAME : Frame size. *
40 * L_SUBFR : Sub-frame size. *
41 *-----------------------------------------------------------------*/
42
43 /*
44 ********************************************************************************
45 * PUBLIC PROGRAM CODE
46 ********************************************************************************
47 */
48
49 /*
50 **************************************************************************
51 *
52 * Function : Ex_ctrl
53 * Purpose : Charaterice synthesis speech and detect background noise
54 * Returns : background noise decision; 0 = no bgn, 1 = bgn
55 *
56 **************************************************************************
57 */
58 Word16 Ex_ctrl (Word16 excitation[], /*i/o: Current subframe excitation */
59 Word16 excEnergy, /* i : Exc. Energy, sqrt(totEx*totEx)*/
60 Word16 exEnergyHist[], /* i : History of subframe energies */
61 Word16 voicedHangover, /* i : # of fr. after last voiced fr.*/
62 Word16 prevBFI, /* i : Set i previous BFI */
63 Word16 carefulFlag /* i : Restrict dymamic in scaling */
64 )
65 {
66 Word16 i, exp;
67 Word16 testEnergy, scaleFactor, avgEnergy, prevEnergy;
68 Word32 t0;
69
70 /* get target level */
71 avgEnergy = gmed_n(exEnergyHist, 9); move16();
72
73 prevEnergy = shr( add (exEnergyHist[7], exEnergyHist[8]) ,1);
74
75 test ();
76 if ( sub (exEnergyHist[8], prevEnergy) < 0)
77 {
78 prevEnergy = exEnergyHist[8]; move16 ();
79 }
80
81 /* upscaling to avoid too rapid energy rises for some cases */
82 test (); test ();
83 if ( sub (excEnergy, avgEnergy) < 0 && sub (excEnergy, 5) > 0)
84 {
85 testEnergy = shl(prevEnergy, 2); /* testEnergy = 4*prevEnergy; */
86
87 test (); test ();
88 if ( sub (voicedHangover, 7) < 0 || prevBFI != 0 )
89 {
90 /* testEnergy = 3*prevEnergy */
91 testEnergy = sub (testEnergy, prevEnergy);
92 }
93
94 test ();
95 if ( sub (avgEnergy, testEnergy) > 0)
96 {
97 avgEnergy = testEnergy; move16 ();
98 }
99
100 /* scaleFactor=avgEnergy/excEnergy in Q0 (const 29 below)*/
101 exp = norm_s (excEnergy);
102 excEnergy = shl (excEnergy, exp);
103 excEnergy = div_s ((Word16) 16383, excEnergy);
104 t0 = L_mult (avgEnergy, excEnergy);
105 t0 = L_shr (t0, sub (20, exp)); /* const=30 for t0 in Q0, 20 for Q10 */
106 if ( L_sub(t0, 32767) > 0 )
107 {
108 t0 = 32767; move32 (); /* saturate */
109 }
110 scaleFactor = extract_l (t0);
111
112 /* test if scaleFactor > 3.0 */
113 test (); test ();
114 if ( carefulFlag != 0 && sub(scaleFactor, 3072) > 0 )
115 {
116 scaleFactor = 3072; move16 ();
117 }
118
119 /* scale the excitation by scaleFactor */
120 for (i = 0; i < L_SUBFR; i++)
121 {
122 t0 = L_mult (scaleFactor, excitation[i]);
123 t0 = L_shr (t0, 11);
124 excitation[i] = extract_l (t0);
125 }
126 }
127
128 return 0;
129 }