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 Filename: synthesis_sub_band.c
21
22------------------------------------------------------------------------------
23 REVISION HISTORY
24
25
26 Who:                                   Date: MM/DD/YYYY
27 Description:
28
29------------------------------------------------------------------------------
30 INPUT AND OUTPUT DEFINITIONS
31
32    Int32 vec[],            Input vector, 32-bit
33    const Int32 *cosTerms,  Cosine Terms
34    Int32 *scratch_mem      Scratch memory
35
36
37------------------------------------------------------------------------------
38 FUNCTION DESCRIPTION
39
40    Implement root squared of a number
41
42------------------------------------------------------------------------------
43 REQUIREMENTS
44
45
46------------------------------------------------------------------------------
47 REFERENCES
48
49------------------------------------------------------------------------------
50 PSEUDO-CODE
51
52------------------------------------------------------------------------------
53*/
54
55
56/*----------------------------------------------------------------------------
57; INCLUDES
58----------------------------------------------------------------------------*/
59
60#ifdef AAC_PLUS
61
62
63#include "pv_audio_type_defs.h"
64#include "fxp_mul32.h"
65#include "dct64.h"
66#include "synthesis_sub_band.h"
67#include "mdst.h"
68#include "dct16.h"
69
70
71/*----------------------------------------------------------------------------
72; MACROS
73; Define module specific macros here
74----------------------------------------------------------------------------*/
75
76
77/*----------------------------------------------------------------------------
78; DEFINES
79; Include all pre-processor statements here. Include conditional
80; compile variables also.
81----------------------------------------------------------------------------*/
82
83#define Qfmt_30(x)   (Int32)(x*((Int32)(1<<30)) + (x>=0?0.5F:-0.5F))
84#define Qfmt_25(x)   (Int32)(x*((Int32)(1<<25))*(1.5625F) + (x>=0?0.5F:-0.5F))
85
86#define SCALE_DOWN_LP   Qfmt_30(0.075000F)  /* 3/40 */
87#define SCALE_DOWN_HQ     Qfmt_30(0.009375F*0.64F)  /* 3/40 * 1/8 */
88
89/*----------------------------------------------------------------------------
90; LOCAL FUNCTION DEFINITIONS
91; Function Prototype declaration
92----------------------------------------------------------------------------*/
93
94/*----------------------------------------------------------------------------
95; LOCAL STORE/BUFFER/POINTER DEFINITIONS
96; Variable declaration - defined here and used outside this module
97----------------------------------------------------------------------------*/
98
99const Int32 CosTable_64[64] =
100{
101    Qfmt_25(0.50003765191555F),   Qfmt_25(40.74468810335183F),   Qfmt_25(0.50033903744282F),   Qfmt_25(13.58429025728446F),
102    Qfmt_25(0.50094271763809F),   Qfmt_25(8.15384860246681F),   Qfmt_25(0.50185051748424F),   Qfmt_25(5.82768837784465F),
103    Qfmt_25(0.50306519130137F),   Qfmt_25(4.53629093696936F),   Qfmt_25(0.50459044322165F),   Qfmt_25(3.71524273832697F),
104    Qfmt_25(0.50643095492855F),   Qfmt_25(3.14746219178191F),   Qfmt_25(0.50859242104981F),   Qfmt_25(2.73164502877394F),
105    Qfmt_25(0.51108159270668F),   Qfmt_25(2.41416000025008F),   Qfmt_25(0.51390632984754F),   Qfmt_25(2.16395781875198F),
106    Qfmt_25(0.51707566313349F),   Qfmt_25(1.96181784857117F),   Qfmt_25(0.52059986630189F),   Qfmt_25(1.79520521907789F),
107    Qfmt_25(0.52449054011472F),   Qfmt_25(1.65559652426412F),   Qfmt_25(0.52876070920749F),   Qfmt_25(1.53699410085250F),
108    Qfmt_25(0.53342493339713F),   Qfmt_25(1.43505508844143F),   Qfmt_25(0.53849943529198F),   Qfmt_25(1.34655762820629F),
109    Qfmt_25(0.54400224638178F),   Qfmt_25(1.26906117169912F),   Qfmt_25(0.54995337418324F),   Qfmt_25(1.20068325572942F),
110    Qfmt_25(0.55637499348989F),   Qfmt_25(1.13994867510150F),   Qfmt_25(0.56329166534170F),   Qfmt_25(1.08568506425801F),
111    Qfmt_25(0.57073058801215F),   Qfmt_25(1.03694904091039F),   Qfmt_25(0.57872188513482F),   Qfmt_25(0.99297296126755F),
112    Qfmt_25(0.58729893709379F),   Qfmt_25(0.95312587439212F),   Qfmt_25(0.59649876302446F),   Qfmt_25(0.91688444618465F),
113    Qfmt_25(0.60636246227215F),   Qfmt_25(0.88381100455962F),   Qfmt_25(0.61693572600507F),   Qfmt_25(0.85353675100661F),
114    Qfmt_25(0.62826943197077F),   Qfmt_25(0.82574877386279F),   Qfmt_25(0.64042033824166F),   Qfmt_25(0.80017989562169F),
115    Qfmt_25(0.65345189537513F),   Qfmt_25(0.77660065823396F),   Qfmt_25(0.66743520092634F),   Qfmt_25(0.75481293911653F),
116    Qfmt_25(0.68245012597642F),   Qfmt_25(0.73464482364786F),   Qfmt_25(0.69858665064723F),   Qfmt_25(0.71594645497057F),
117};
118
119
120/*----------------------------------------------------------------------------
121; EXTERNAL FUNCTION REFERENCES
122; Declare functions defined elsewhere and referenced in this module
123----------------------------------------------------------------------------*/
124
125/*----------------------------------------------------------------------------
126; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
127; Declare variables used in this module but defined elsewhere
128----------------------------------------------------------------------------*/
129
130/*----------------------------------------------------------------------------
131; FUNCTION CODE
132----------------------------------------------------------------------------*/
133
134
135
136void synthesis_sub_band_LC(Int32 Sr[], Int16 data[])
137{
138
139    Int32 *temp_o1 = (Int32 *) & data[0];
140
141    Int   i;
142    Int32 *pt_temp_e;
143    Int32 *pt_temp_o = temp_o1;
144    Int32 *pt_temp_x = &Sr[63];
145    Int32 temp1;
146    Int32 temp2;
147    Int32 temp3;
148    Int32 temp11;
149
150    Int16 *pt_data_1;
151    Int16 *pt_data_2;
152
153    Int32 *pt_Sr_1 = Sr;
154    Int16 tmp1;
155    Int16 tmp2;
156    Int16 tmp11;
157    Int16 tmp22;
158    const Int32 *pt_cosTerms = CosTable_48;
159
160
161    temp2 = *(pt_temp_x--);
162    for (i = 20; i != 0; i--)
163    {
164        temp1 = *(pt_Sr_1);
165        temp3 = *(pt_cosTerms++);
166        *(pt_Sr_1++) =   temp1  + temp2;
167        *(pt_temp_o++) = fxp_mul32_Q31((temp1 - temp2), temp3) << 1;
168        temp2 = *(pt_temp_x--);
169    }
170
171    for (i = 12; i != 0; i--)
172    {
173        temp1 = *(pt_Sr_1);
174        temp3 = *(pt_cosTerms++);
175        *(pt_Sr_1++) =   temp1  + temp2;
176        *(pt_temp_o++) = fxp_mul32_Q26((temp1 - temp2), temp3);
177        temp2 = *(pt_temp_x--);
178    }
179
180
181    pv_split_LC(temp_o1, &Sr[32]);
182
183    dct_16(temp_o1, 1);     // Even terms
184    dct_16(&Sr[32], 1);     // Odd  terms
185
186    /* merge */
187
188
189    pt_Sr_1 = &temp_o1[31];
190    pt_temp_e   =  &temp_o1[15];
191    pt_temp_o   =  &Sr[47];
192
193    temp1 = *(pt_temp_o--);
194    *(pt_Sr_1--) = temp1;
195    for (i = 5; i != 0; i--)
196    {
197        temp2 = *(pt_temp_o--);
198        *(pt_Sr_1--) = *(pt_temp_e--);
199        *(pt_Sr_1--) = temp1 + temp2;
200        temp3 = *(pt_temp_o--);
201        *(pt_Sr_1--) = *(pt_temp_e--);
202        *(pt_Sr_1--) = temp2 + temp3;
203        temp1 = *(pt_temp_o--);
204        *(pt_Sr_1--) = *(pt_temp_e--);
205        *(pt_Sr_1--) = temp1 + temp3;
206    }
207
208
209    pv_split_LC(Sr, &Sr[32]);
210
211    dct_16(Sr, 1);     // Even terms
212    dct_16(&Sr[32], 1);     // Odd  terms
213
214
215    pt_temp_x   =  &temp_o1[31];
216    pt_temp_e   =  &Sr[15];
217    pt_temp_o   =  &Sr[47];
218
219    pt_data_1 = &data[95];
220
221    temp2  = *(pt_temp_x--);
222    temp11 = *(pt_temp_x--);
223    temp1  = *(pt_temp_o--);
224
225    *(pt_data_1--) = (Int16) fxp_mul32_Q31(temp2, SCALE_DOWN_LP);
226    *(pt_data_1--) = (Int16) fxp_mul32_Q31(temp1, SCALE_DOWN_LP);
227
228    for (i = 5; i != 0; i--)
229    {
230        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP);
231        temp3         = *(pt_temp_x--);
232        *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP);
233        temp2          = *(pt_temp_o--);
234        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp3), SCALE_DOWN_LP);
235        temp11         = *(pt_temp_x--);
236        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp1 + temp2), SCALE_DOWN_LP);
237
238
239        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp3), SCALE_DOWN_LP);
240        temp1         = *(pt_temp_x--);
241        *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP);
242        temp3          = *(pt_temp_o--);
243        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp1), SCALE_DOWN_LP);
244        temp11         = *(pt_temp_x--);
245        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp2 + temp3), SCALE_DOWN_LP);
246
247
248        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp1), SCALE_DOWN_LP);
249        temp2         = *(pt_temp_x--);
250        *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP);
251        temp1          = *(pt_temp_o--);
252        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP);
253        temp11         = *(pt_temp_x--);
254        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp1 + temp3), SCALE_DOWN_LP);
255    }
256
257    *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP);
258    *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e), SCALE_DOWN_LP);
259
260    /* ---- merge ends---- */
261
262
263    pt_data_1 = &data[95];
264    pt_data_2 = &data[96];
265
266    *(pt_data_2++) =   0;
267    tmp1  =  *(pt_data_1--);
268    tmp2  =  *(pt_data_1--);
269    tmp11 =  *(pt_data_1--);
270    tmp22 =  *(pt_data_1--);
271
272    for (i = 7; i != 0; i--)
273    {
274        *(pt_data_2++) = (-tmp1);
275        *(pt_data_2++) = (-tmp2);
276        *(pt_data_2++) = (-tmp11);
277        *(pt_data_2++) = (-tmp22);
278        tmp1  =  *(pt_data_1--);
279        tmp2  =  *(pt_data_1--);
280        tmp11 =  *(pt_data_1--);
281        tmp22 =  *(pt_data_1--);
282    }
283
284
285    *(pt_data_2++) = (-tmp1);
286    *(pt_data_2++) = (-tmp2);
287    *(pt_data_2++) = (-tmp11);
288
289    pt_data_2 = &data[0];
290
291    *(pt_data_2++) =  tmp22;
292    tmp1  =  *(pt_data_1--);
293    tmp2  =  *(pt_data_1--);
294    tmp11 =  *(pt_data_1--);
295    tmp22 =  *(pt_data_1--);
296
297    for (i = 7; i != 0; i--)
298    {
299        *(pt_data_2++) =  tmp1;
300        *(pt_data_2++) =  tmp2;
301        *(pt_data_2++) =  tmp11;
302        *(pt_data_2++) =  tmp22;
303        tmp1  =  *(pt_data_1--);
304        tmp2  =  *(pt_data_1--);
305        tmp11 =  *(pt_data_1--);
306        tmp22 =  *(pt_data_1--);
307    }
308
309    *(pt_data_2++) =  tmp1;
310    *(pt_data_2++) =  tmp2;
311    *(pt_data_2++) =  tmp11;
312    *(pt_data_2)   =  tmp22;
313
314}
315
316
317void synthesis_sub_band_LC_down_sampled(Int32 Sr[], Int16 data[])
318{
319
320    Int i ;
321    Int16 *pt_data_1;
322
323    pt_data_1 = &data[0];
324
325    dct_32(Sr);
326
327    for (i = 0; i < 16; i++)
328    {
329        pt_data_1[   i] = (Int16)(Sr[16-i] >> 5);
330        pt_data_1[16+i] = (Int16)(Sr[i] >> 5);
331        pt_data_1[32+i] = (Int16)(Sr[16+i] >> 5);
332    }
333    for (i = 0; i < 15; i++)
334    {
335        pt_data_1[49+i] = (Int16)(-Sr[31-i] >> 5);
336    }
337    pt_data_1[48] = 0;
338}
339
340
341#ifdef HQ_SBR
342
343void synthesis_sub_band(Int32 Sr[], Int32 Si[], Int16 data[])
344{
345
346
347    Int32 i ;
348    Int16 *pt_data_1;
349    Int16 *pt_data_2;
350    Int32 *pt_Sr_1;
351    Int32 *pt_Sr_2;
352    Int32 *pt_Si_1;
353    Int32 *pt_Si_2;
354
355    Int32 tmp1;
356    Int32 tmp2;
357    Int32 tmp3;
358    Int32 tmp4;
359
360    Int32 cosx;
361    const Int32 *pt_CosTable = CosTable_64;
362
363
364    pt_Sr_1 = &Sr[0];
365    pt_Sr_2 = &Sr[63];
366
367    pt_Si_1 = &Si[0];
368    pt_Si_2 = &Si[63];
369
370
371    tmp3 = *pt_Sr_1;
372
373    for (i = 32; i != 0; i--)
374    {
375        tmp4 = *pt_Si_2;
376        cosx = *(pt_CosTable++);
377        *(pt_Sr_1++) = fxp_mul32_Q31(tmp3, cosx);
378        tmp3 = *pt_Si_1;
379        *(pt_Si_1++) = fxp_mul32_Q31(tmp4, cosx);
380        tmp4 = *pt_Sr_2;
381        cosx = *(pt_CosTable++);
382        *(pt_Si_2--) = fxp_mul32_Q31(tmp3, cosx);
383        *(pt_Sr_2--) = fxp_mul32_Q31(tmp4, cosx);
384        tmp3 = *pt_Sr_1;
385    }
386
387
388    dct_64(Sr, (Int32 *)data);
389    dct_64(Si, (Int32 *)data);
390
391
392    pt_data_1 = &data[0];
393    pt_data_2 = &data[127];
394
395    pt_Sr_1 = &Sr[0];
396    pt_Si_1 = &Si[0];
397
398    tmp1 = *(pt_Sr_1++);
399    tmp3 = *(pt_Sr_1++);
400    tmp2 = *(pt_Si_1++);
401    tmp4 = *(pt_Si_1++);
402
403    for (i = 32; i != 0; i--)
404    {
405        *(pt_data_1++) = (Int16) fxp_mul32_Q31((tmp2 - tmp1), SCALE_DOWN_HQ);
406        *(pt_data_1++) = (Int16) fxp_mul32_Q31(-(tmp3 + tmp4), SCALE_DOWN_HQ);
407        *(pt_data_2--) = (Int16) fxp_mul32_Q31((tmp1 + tmp2), SCALE_DOWN_HQ);
408        *(pt_data_2--) = (Int16) fxp_mul32_Q31((tmp3 - tmp4), SCALE_DOWN_HQ);
409
410        tmp1 = *(pt_Sr_1++);
411        tmp3 = *(pt_Sr_1++);
412        tmp2 = *(pt_Si_1++);
413        tmp4 = *(pt_Si_1++);
414    }
415
416}
417
418
419const Int32 exp_m0_25_phi[32] =
420{
421
422    0x7FFEFE6E,  0x7FEAFB4A, 0x7FC2F827, 0x7F87F505,
423    0x7F38F1E4,  0x7ED6EEC6, 0x7E60EBAB, 0x7DD6E892,
424    0x7D3AE57D,  0x7C89E26D, 0x7BC6DF61, 0x7AEFDC59,
425    0x7A06D958,  0x790AD65C, 0x77FBD367, 0x76D9D079,
426    0x75A6CD92,  0x7460CAB2, 0x7308C7DB, 0x719EC50D,
427    0x7023C248,  0x6E97BF8C, 0x6CF9BCDA, 0x6B4BBA33,
428    0x698CB796,  0x67BDB505, 0x65DEB27F, 0x63EFB005,
429    0x61F1AD97,  0x5FE4AB36, 0x5DC8A8E2, 0x5B9DA69C
430};
431
432void synthesis_sub_band_down_sampled(Int32 Sr[], Int32 Si[], Int16 data[])
433{
434
435    Int16 k;
436    Int16 *pt_data_1;
437    Int32 exp_m0_25;
438    const Int32 *pt_exp = exp_m0_25_phi;
439
440    Int32 *XX = Sr;
441    Int32 *YY = (Int32 *)data;
442    Int32 tmp1;
443    Int32 tmp2;
444
445    for (k = 0; k < 32; k++)
446    {
447        exp_m0_25 = *(pt_exp++);
448        tmp1 = Sr[k];
449        tmp2 = Si[k];
450        XX[k]    = cmplx_mul32_by_16(-tmp1,  tmp2, exp_m0_25);
451        YY[31-k] = cmplx_mul32_by_16(tmp2,  tmp1, exp_m0_25);
452    }
453
454    mdct_32(XX);
455    mdct_32(YY);
456
457    for (k = 0; k < 32; k++)
458    {
459        Si[k] = YY[k];
460    }
461
462    pt_data_1 = data;
463
464    for (k = 0; k < 16; k++)
465    {
466        *(pt_data_1++)  = (Int16)((XX[2*k  ] + Si[2*k  ]) >> 14);
467        *(pt_data_1++)  = (Int16)((XX[2*k+1] - Si[2*k+1]) >> 14);
468    }
469
470    for (k = 15; k > -1; k--)
471    {
472        *(pt_data_1++)  = (Int16)(-(XX[2*k+1] + Si[2*k+1]) >> 14);
473        *(pt_data_1++)  = (Int16)(-(XX[2*k  ] - Si[2*k  ]) >> 14);
474    }
475
476}
477
478
479#endif      /* HQ_SBR */
480
481#endif      /*  AAC_PLUS */
482
483
484