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 ------------------------------------------------------------------------------
20
21 PacketVideo Corp.
22 MP3 Decoder Library
23
24 Filename: pvmp3_imdct_synth.cpp
25
26 Date: 09/21/2007
27
28 ------------------------------------------------------------------------------
29 REVISION HISTORY
30
31
32 Description:
33
34 ------------------------------------------------------------------------------
35 INPUT AND OUTPUT DEFINITIONS
36
37 Input
38 int32 in[], Pointer to spec values of current channel
39 int32 overlap[], Pointer to overlap values of current channel
40 uint32 blk_type, Block type
41 int16 mx_band, In case of mixed blocks, # of bands with long
42 blocks (2 or 4) else 0
43 int32 *Scratch_mem
44 Returns
45
46 int32 in[],
47
48 ------------------------------------------------------------------------------
49 FUNCTION DESCRIPTION
50
51 The frequency lines are preprocessed by the "alias reduction" scheme
52 and fed into the IMDCT matrix, each 18 into one transform block.
53 The first half of the output values are added to the stored overlap
54 values from the last block. These values are new output values and
55 are input values for the polyphase filterbank. The second half of the
56 output values is stored for overlap with the next data granule.
57 The number of windowed samples is 12 for short blocks, and 36 for long
58 blocks
59
60 Windowing
61
62 Depending on window_switching_flag[gr][ch], block_type[gr][ch] and
63 mixed_block_flag[gr][ch] different shapes of windows are used.
64 normal window
65 start window
66 stop window
67 short windows
68 Each of the three short blocks is windowed separately.
69 The windowed short blocks must be overlapped and concatenated.
70
71 Overlapping and adding with previous block
72
73 The first half (18 values) of the current block (36 values) has to be
74 overlapped with the second half of the previous block. The second half
75 of the current block has to be stored for overlapping with the next block
76
77 ------------------------------------------------------------------------------
78 REQUIREMENTS
79
80
81 ------------------------------------------------------------------------------
82 REFERENCES
83
84 [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
85 ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
86
87 ------------------------------------------------------------------------------
88 PSEUDO-CODE
89
90 ------------------------------------------------------------------------------
91 */
92
93
94 /*----------------------------------------------------------------------------
95 ; INCLUDES
96 ----------------------------------------------------------------------------*/
97
98 #include "pvmp3_imdct_synth.h"
99 #include "pv_mp3dec_fxd_op.h"
100 #include "pvmp3_dec_defs.h"
101 #include "pvmp3_mdct_18.h"
102 #include "pvmp3_mdct_6.h"
103 #include "mp3_mem_funcs.h"
104
105
106
107 /*----------------------------------------------------------------------------
108 ; MACROS
109 ; Define module specific macros here
110 ----------------------------------------------------------------------------*/
111
112
113 /*----------------------------------------------------------------------------
114 ; DEFINES
115 ; Include all pre-processor statements here. Include conditional
116 ; compile variables also.
117 ----------------------------------------------------------------------------*/
118 #define LONG 0
119 #define START 1
120 #define SHORT 2
121 #define STOP 3
122
123 /*----------------------------------------------------------------------------
124 ; LOCAL FUNCTION DEFINITIONS
125 ; Function Prototype declaration
126 ----------------------------------------------------------------------------*/
127
128 /*----------------------------------------------------------------------------
129 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
130 ; Variable declaration - defined here and used outside this module
131 ----------------------------------------------------------------------------*/
132 /*
133 * sin(pi/36*(k+0.5)),k=0..35
134 */
135
136 const int32 normal_win[36] =
137 {
138 Qfmt_31(0.08723877473068f), Qfmt_31(0.26105238444010f), Qfmt_31(0.43287922787620f),
139 Qfmt_31(0.60141159900854f), Qfmt_31(0.76536686473018f), Qfmt_31(0.92349722647006f),
140 Qfmt_31(0.53729960834682f), Qfmt_31(0.60876142900872f), Qfmt_31(0.67559020761566f),
141 Qfmt_31(-0.73727733681012f), Qfmt_31(-0.79335334029124f), Qfmt_31(0.84339144581289f),
142 Qfmt_31(0.88701083317822f), Qfmt_31(0.92387953251129f), Qfmt_31(-0.95371695074823f),
143 Qfmt_31(-0.97629600711993f), Qfmt_31(-0.99144486137381f), Qfmt_31(-0.99904822158186f),
144 Qfmt_31(0.99904822158186f), Qfmt_31(0.99144486137381f), Qfmt_31(0.97629600711993f),
145 Qfmt_31(0.95371695074823f), Qfmt_31(0.92387953251129f), Qfmt_31(0.88701083317822f),
146 Qfmt_31(0.84339144581289f), Qfmt_31(0.79335334029124f), Qfmt_31(0.73727733681012f),
147 Qfmt_31(0.67559020761566f), Qfmt_31(0.60876142900872f), Qfmt_31(0.53729960834682f),
148 Qfmt_31(0.46174861323503f), Qfmt_31(0.38268343236509f), Qfmt_31(0.30070579950427f),
149 Qfmt_31(0.21643961393810f), Qfmt_31(0.13052619222005f), Qfmt_31(0.04361938736534f)
150 };
151
152
153 const int32 start_win[36] =
154 {
155 /* k=0..17 sin(pi/36*(k+0.5)), */
156 Qfmt_31(0.08723877473068f), Qfmt_31(0.26105238444010f), Qfmt_31(0.43287922787620f),
157 Qfmt_31(0.60141159900854f), Qfmt_31(0.76536686473018f), Qfmt_31(0.92349722647006f),
158 Qfmt_31(0.53729960834682f), Qfmt_31(0.60876142900872f), Qfmt_31(0.67559020761566f),
159 Qfmt_31(-0.73727733681012f), Qfmt_31(-0.79335334029124f), Qfmt_31(0.84339144581289f),
160 Qfmt_31(0.88701083317822f), Qfmt_31(0.92387953251129f), Qfmt_31(-0.95371695074823f),
161 Qfmt_31(-0.97629600711993f), Qfmt_31(-0.99144486137381f), Qfmt_31(-0.99904822158186f),
162
163 Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f),
164 Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f),
165 /* k=24..29; sin(pi/12*(k-18+0.5)) */
166 Qfmt_31(0.99144486137381f), Qfmt_31(0.92387953251129f), Qfmt_31(0.79335334029124f),
167 Qfmt_31(0.60876142900872f), Qfmt_31(0.38268343236509f), Qfmt_31(0.13052619222005f),
168
169 Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f),
170 Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f)
171 };
172
173
174 const int32 stop_win[36] =
175 {
176 Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f),
177 Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f),
178 /* k=6..11; sin(pi/12*(k-6+0.5)) */
179 Qfmt_31(0.13052619222005f), Qfmt_31(0.38268343236509f), Qfmt_31(0.60876142900872f),
180 Qfmt_31(-0.79335334029124f), Qfmt_31(-0.92387953251129f), Qfmt_31(0.99144486137381f),
181
182 Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), Qfmt_31(-0.99999990000000f),
183 Qfmt_31(-0.99999990000000f), Qfmt_31(-0.99999990000000f), Qfmt_31(-0.99999990000000f),
184 /* k=18..35 sin(pi/36*(k+0.5)), */
185 Qfmt_31(0.99904822158186f), Qfmt_31(0.99144486137381f), Qfmt_31(0.97629600711993f),
186 Qfmt_31(0.95371695074823f), Qfmt_31(0.92387953251129f), Qfmt_31(0.88701083317822f),
187 Qfmt_31(0.84339144581289f), Qfmt_31(0.79335334029124f), Qfmt_31(0.73727733681012f),
188 Qfmt_31(0.67559020761566f), Qfmt_31(0.60876142900872f), Qfmt_31(0.53729960834682f),
189 Qfmt_31(0.46174861323503f), Qfmt_31(0.38268343236509f), Qfmt_31(0.30070579950427f),
190 Qfmt_31(0.21643961393810f), Qfmt_31(0.13052619222005f), Qfmt_31(0.04361938736534f)
191 };
192
193
194 const int32 short_win[12] =
195 {
196 /* k=0..11; sin(pi/12*(k+0.5)) */
197 Qfmt_31(0.13052619222005f), Qfmt_31(0.38268343236509f), Qfmt_31(0.60876142900872f),
198 Qfmt_31(0.79335334029124f), Qfmt_31(0.92387953251129f), Qfmt_31(0.99144486137381f),
199 Qfmt_31(0.99144486137381f), Qfmt_31(0.92387953251129f), Qfmt_31(0.79335334029124f),
200 Qfmt_31(0.60876142900872f), Qfmt_31(0.38268343236509f), Qfmt_31(0.13052619222005f),
201 };
202 /*----------------------------------------------------------------------------
203 ; EXTERNAL FUNCTION REFERENCES
204 ; Declare functions defined elsewhere and referenced in this module
205 ----------------------------------------------------------------------------*/
206
207 /*----------------------------------------------------------------------------
208 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
209 ; Declare variables used in this module but defined elsewhere
210 ----------------------------------------------------------------------------*/
211
212 /*----------------------------------------------------------------------------
213 ; FUNCTION CODE
214 ----------------------------------------------------------------------------*/
215
pvmp3_imdct_synth(int32 in[SUBBANDS_NUMBER * FILTERBANK_BANDS],int32 overlap[SUBBANDS_NUMBER * FILTERBANK_BANDS],uint32 blk_type,int16 mx_band,int32 used_freq_lines,int32 * Scratch_mem)216 void pvmp3_imdct_synth(int32 in[SUBBANDS_NUMBER*FILTERBANK_BANDS],
217 int32 overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS],
218 uint32 blk_type,
219 int16 mx_band,
220 int32 used_freq_lines,
221 int32 *Scratch_mem)
222 {
223
224 int32 band;
225 int32 bands2process = used_freq_lines + 2;
226
227 if (bands2process > SUBBANDS_NUMBER)
228 {
229 bands2process = SUBBANDS_NUMBER; /* default */
230 }
231
232
233 /*
234 * in case of mx_poly_band> 0, do
235 * long transforms
236 */
237
238
239 for (band = 0; band < bands2process; band++)
240 {
241 uint32 current_blk_type = (band < mx_band) ? LONG : blk_type;
242
243 int32 * out = in + (band * FILTERBANK_BANDS);
244 int32 * history = overlap + (band * FILTERBANK_BANDS);
245
246 switch (current_blk_type)
247 {
248 case LONG:
249
250 pvmp3_mdct_18(out, history, normal_win);
251
252 break;
253
254 case START:
255
256 pvmp3_mdct_18(out, history, start_win);
257
258 break;
259
260 case STOP:
261
262 pvmp3_mdct_18(out, history, stop_win);
263
264 break;
265
266 case SHORT:
267 {
268 int32 *tmp_prev_ovr = &Scratch_mem[FILTERBANK_BANDS];
269 int32 i;
270
271 for (i = 0; i < 6; i++)
272 {
273 Scratch_mem[i ] = out[(i*3)];
274 Scratch_mem[6 +i] = out[(i*3) + 1];
275 Scratch_mem[12 +i] = out[(i*3) + 2];
276 }
277
278 pvmp3_mdct_6(&Scratch_mem[ 0], &tmp_prev_ovr[ 0]);
279 pvmp3_mdct_6(&Scratch_mem[ 6], &tmp_prev_ovr[ 6]);
280 pvmp3_mdct_6(&Scratch_mem[12], &tmp_prev_ovr[12]);
281
282 for (i = 0; i < 6; i++)
283 {
284 int32 temp = history[i];
285 /* next iteration overlap */
286 history[i] = fxp_mul32_Q32(tmp_prev_ovr[ 6+i] << 1, short_win[6+i]);
287 history[i] += fxp_mul32_Q32(Scratch_mem[12+i] << 1, short_win[ i]);
288 out[i] = temp;
289 }
290
291 for (i = 0; i < 6; i++)
292 {
293 out[i+6] = fxp_mul32_Q32(Scratch_mem[i] << 1, short_win[i]);
294 out[i+6] += history[i+6];
295 /* next iteration overlap */
296 history[i+6] = fxp_mul32_Q32(tmp_prev_ovr[12+i] << 1, short_win[6+i]);
297
298 }
299 for (i = 0; i < 6; i++)
300 {
301 out[i+12] = fxp_mul32_Q32(tmp_prev_ovr[ i] << 1, short_win[6+i]);
302 out[i+12] += fxp_mul32_Q32(Scratch_mem[6+i] << 1, short_win[ i]);
303 out[i+12] += history[i+12];
304 history[12+i] = 0;
305 }
306 }
307
308 break;
309 }
310
311 /*
312 * Compensation for frequency inversion of polyphase filterbank
313 * every odd time sample of every odd odd subband is mulitplied by -1 before
314 * processing by the polyphase filter
315 */
316
317 if (band & 1)
318 {
319 for (int32 slot = 1; slot < FILTERBANK_BANDS; slot += 6)
320 {
321 int32 temp1 = out[slot ];
322 int32 temp2 = out[slot+2];
323 int32 temp3 = out[slot+4];
324 out[slot ] = -temp1;
325 out[slot+2] = -temp2;
326 out[slot+4] = -temp3;
327 }
328 }
329 }
330
331
332 for (band = bands2process; band < SUBBANDS_NUMBER; band++)
333 {
334 int32 * out = in + (band * FILTERBANK_BANDS);
335 int32 * history = overlap + (band * FILTERBANK_BANDS);
336 int32 slot;
337
338 if (band & 1)
339 {
340 for (slot = 0; slot < FILTERBANK_BANDS; slot += 6)
341 {
342 int32 temp1 = history[slot ];
343 int32 temp2 = history[slot+1];
344 int32 temp3 = history[slot+2];
345 out[slot ] = temp1;
346 out[slot+1] = -temp2;
347 out[slot+2] = temp3;
348
349 temp1 = history[slot+3];
350 temp2 = history[slot+4];
351 temp3 = history[slot+5];
352 out[slot+3] = -temp1;
353 out[slot+4] = temp2;
354 out[slot+5] = -temp3;
355 }
356 }
357 else
358 {
359 for (slot = 0; slot < FILTERBANK_BANDS; slot += 3)
360 {
361 int32 temp1 = history[slot ];
362 int32 temp2 = history[slot+1];
363 int32 temp3 = history[slot+2];
364 out[slot ] = temp1;
365 out[slot+1] = temp2;
366 out[slot+2] = temp3;
367 }
368 }
369
370 pv_memset(history, 0, FILTERBANK_BANDS*sizeof(*overlap));
371 }
372 }
373
374
375
376
377