1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20 
21     3GPP TS 26.173
22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23     Available from http://www.3gpp.org
24 
25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31 
32 
33 
34  Filename: phase_dispersion.cpp
35 
36      Date: 05/08/2007
37 
38 ------------------------------------------------------------------------------
39  REVISION HISTORY
40 
41 
42  Description:
43 
44 ------------------------------------------------------------------------------
45  INPUT AND OUTPUT DEFINITIONS
46 
47      int16 gain_code,               (i) Q0  : gain of code
48      int16 gain_pit,                (i) Q14 : gain of pitch
49      int16 code[],                  (i/o)   : code vector
50      int16 mode,                    (i)     : level, 0=hi, 1=lo, 2=off
51      int16 disp_mem[],              (i/o)   : static memory (size = 8)
52      int16 ScratchMem[]
53 
54 ------------------------------------------------------------------------------
55  FUNCTION DESCRIPTION
56 
57     post-processing to enhance noise in low bit rate.
58 
59 ------------------------------------------------------------------------------
60  REQUIREMENTS
61 
62 
63 ------------------------------------------------------------------------------
64  REFERENCES
65 
66 ------------------------------------------------------------------------------
67  PSEUDO-CODE
68 
69 ------------------------------------------------------------------------------
70 */
71 
72 
73 /*----------------------------------------------------------------------------
74 ; INCLUDES
75 ----------------------------------------------------------------------------*/
76 
77 #include "pv_amr_wb_type_defs.h"
78 #include "pvamrwbdecoder_basic_op.h"
79 #include "pvamrwbdecoder_cnst.h"
80 #include "pvamrwbdecoder_mem_funcs.h"
81 #include "pvamrwbdecoder_acelp.h"
82 #include "pvamrwb_math_op.h"
83 
84 
85 /*----------------------------------------------------------------------------
86 ; MACROS
87 ; Define module specific macros here
88 ----------------------------------------------------------------------------*/
89 
90 
91 /*----------------------------------------------------------------------------
92 ; DEFINES
93 ; Include all pre-processor statements here. Include conditional
94 ; compile variables also.
95 ----------------------------------------------------------------------------*/
96 #define pitch_0_9  14746                   /* 0.9 in Q14 */
97 #define pitch_0_6  9830                    /* 0.6 in Q14 */
98 #define L_SUBFR 64
99 
100 /*----------------------------------------------------------------------------
101 ; LOCAL FUNCTION DEFINITIONS
102 ; Function Prototype declaration
103 ----------------------------------------------------------------------------*/
104 
105 /*----------------------------------------------------------------------------
106 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
107 ; Variable declaration - defined here and used outside this module
108 ----------------------------------------------------------------------------*/
109 /* impulse response with phase dispersion */
110 
111 /* 2.0 - 6.4 kHz phase dispersion */
112 static const int16 ph_imp_low[L_SUBFR] =
113 {
114     20182,  9693,  3270, -3437, 2864, -5240,  1589, -1357,
115     600,  3893, -1497,  -698, 1203, -5249,  1199,  5371,
116     -1488,  -705, -2887,  1976,  898,   721, -3876,  4227,
117     -5112,  6400, -1032, -4725, 4093, -4352,  3205,  2130,
118     -1996, -1835,  2648, -1786, -406,   573,  2484, -3608,
119     3139, -1363, -2566,  3808, -639, -2051,  -541,  2376,
120     3932, -6262,  1432, -3601, 4889,   370,   567, -1163,
121     -2854,  1914,    39, -2418, 3454,  2975, -4021,  3431
122 };
123 
124 /* 3.2 - 6.4 kHz phase dispersion */
125 static const int16 ph_imp_mid[L_SUBFR] =
126 {
127     24098, 10460, -5263,  -763,  2048,  -927,  1753, -3323,
128     2212,   652, -2146,  2487, -3539,  4109, -2107,  -374,
129     -626,  4270, -5485,  2235,  1858, -2769,   744,  1140,
130     -763, -1615,  4060, -4574,  2982, -1163,   731, -1098,
131     803,   167,  -714,   606,  -560,   639,    43, -1766,
132     3228, -2782,   665,   763,   233, -2002,  1291,  1871,
133     -3470,  1032,  2710, -4040,  3624, -4214,  5292, -4270,
134     1563,   108,  -580,  1642, -2458,   957,  544,   2540
135 };
136 
137 /*----------------------------------------------------------------------------
138 ; EXTERNAL FUNCTION REFERENCES
139 ; Declare functions defined elsewhere and referenced in this module
140 ----------------------------------------------------------------------------*/
141 
142 /*----------------------------------------------------------------------------
143 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
144 ; Declare variables used in this module but defined elsewhere
145 ----------------------------------------------------------------------------*/
146 
147 /*----------------------------------------------------------------------------
148 ; FUNCTION CODE
149 ----------------------------------------------------------------------------*/
150 
phase_dispersion(int16 gain_code,int16 gain_pit,int16 code[],int16 mode,int16 disp_mem[],int16 ScratchMem[])151 void phase_dispersion(
152     int16 gain_code,             /* (i) Q0  : gain of code             */
153     int16 gain_pit,              /* (i) Q14 : gain of pitch            */
154     int16 code[],                /* (i/o)   : code vector              */
155     int16 mode,                  /* (i)     : level, 0=hi, 1=lo, 2=off */
156     int16 disp_mem[],            /* (i/o)   : static memory (size = 8) */
157     int16 ScratchMem[]
158 )
159 {
160     int16 i, j, state;
161     int16 *prev_gain_pit, *prev_gain_code, *prev_state;
162     int16 *code2 = ScratchMem;
163 
164     prev_state = disp_mem;
165     prev_gain_code = disp_mem + 1;
166     prev_gain_pit = disp_mem + 2;
167 
168     pv_memset((void *)code2, 0, (2*L_SUBFR)*sizeof(*code2));
169 
170 
171     if (gain_pit < pitch_0_6)
172     {
173         state = 0;
174     }
175     else if (gain_pit < pitch_0_9)
176     {
177         state = 1;
178     }
179     else
180     {
181         state = 2;
182     }
183 
184     for (i = 5; i > 0; i--)
185     {
186         prev_gain_pit[i] = prev_gain_pit[i - 1];
187     }
188     prev_gain_pit[0] = gain_pit;
189 
190     if (sub_int16(gain_code, *prev_gain_code) > shl_int16(*prev_gain_code, 1))
191     {
192         /* onset */
193         if (state < 2)
194         {
195             state++;
196         }
197     }
198     else
199     {
200         j = 0;
201         for (i = 0; i < 6; i++)
202         {
203             if (prev_gain_pit[i] < pitch_0_6)
204             {
205                 j++;
206             }
207         }
208 
209         if (j > 2)
210         {
211             state = 0;
212         }
213         if (state > *prev_state + 1)
214         {
215             state--;
216         }
217     }
218 
219     *prev_gain_code = gain_code;
220     *prev_state = state;
221 
222     /* circular convolution */
223 
224     state += mode;              /* level of dispersion */
225 
226     if (state == 0)
227     {
228         for (i = 0; i < L_SUBFR; i++)
229         {
230             if (code[i] != 0)
231             {
232                 for (j = 0; j < L_SUBFR; j++)
233                 {
234                     code2[i + j] = add_int16(code2[i + j], mult_int16_r(code[i], ph_imp_low[j]));
235                 }
236             }
237         }
238     }
239     else if (state == 1)
240     {
241         for (i = 0; i < L_SUBFR; i++)
242         {
243             if (code[i] != 0)
244             {
245                 for (j = 0; j < L_SUBFR; j++)
246                 {
247                     code2[i + j] = add_int16(code2[i + j], mult_int16_r(code[i], ph_imp_mid[j]));
248                 }
249             }
250         }
251     }
252     if (state < 2)
253     {
254         for (i = 0; i < L_SUBFR; i++)
255         {
256             code[i] = add_int16(code2[i], code2[i + L_SUBFR]);
257         }
258     }
259     return;
260 }
261 
262