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