1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------
2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License.
6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at
7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied.
14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions
15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License.
16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -------------------------------------------------------------------
17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Filename: dst32.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date: MM/DD/YYYY
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 x             32-bit integer input length 32
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Implement discrete sine transform of lenght 32
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "dst32.h"
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "dst16.h"
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define R_SHIFT1     29
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt29(x)   (Int32)(x*((Int32)1<<R_SHIFT1) + (x>=0?0.5F:-0.5F))
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int32 CosTable_16[14] =
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.50060299823520F),   Qfmt31(0.50547095989754F),
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.51544730992262F),   Qfmt31(0.53104259108978F),
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.55310389603444F),   Qfmt31(0.58293496820613F),
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.62250412303566F),   Qfmt31(0.67480834145501F),
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.74453627100230F),   Qfmt31(0.83934964541553F),
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt29(0.97256823786196F),   Qfmt29(1.16943993343288F),
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt29(1.48416461631417F),   Qfmt29(2.05778100995341F)
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber};
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid dst_32(Int32 vec[], Int32 scratch_mem[])   /* scratch_mem size 32 */
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *temp_even = scratch_mem;
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 i;
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_cos = &CosTable_16[13];
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp0 = vec[31] >> 1;
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp1, tmp2;
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_even = temp_even;
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_odd  = vec;
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vec  = vec;
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vecN_1  = vec;
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp3;
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = 0;
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 5; i != 0; i--)
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_even++) = *(pt_vec++);
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2         = *(pt_vec++);
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_even++) = *(pt_vec++);
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3         = *(pt_vec++);
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_even++) = *(pt_vec++);
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_odd++) = tmp2 + tmp1;
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_odd++) = tmp3 + tmp2;
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1         = *(pt_vec++);
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_odd++) = tmp1 + tmp3;
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_even) = *(pt_vec++);
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_odd)  = *(pt_vec) + tmp1;
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dst_16(temp_even, &scratch_mem[16]);
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dst_16(vec, &scratch_mem[24]);
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_vecN_1  = &vec[16];
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = temp_even[15];
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3  = fxp_mul32_Q31((vec[15] - tmp0) << 3, Qfmt31(0.63687550772175F)) << 2;
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp2  = temp_even[14];
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_vecN_1++)  = tmp3 - tmp1;
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[15]         = tmp3 + tmp1;
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1  = temp_even[13];
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3  = fxp_mul32_Q31((vec[14] + tmp0) << 3, Qfmt31(0.85190210461718F));
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_vecN_1++)  = tmp3 - tmp2;
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[14]         = tmp3 + tmp2;
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_even = &temp_even[12];
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_vec  = &vec[13];
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 2; i != 0; i--)
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3  = fxp_mul32_Q29((*(pt_vec) - tmp0), *(pt_cos--));
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_even--);
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec--)     = tmp3 + tmp1;
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vecN_1++)  = tmp3 - tmp1;
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3  = fxp_mul32_Q29((*(pt_vec) + tmp0), *(pt_cos--));
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_even--);
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec--)     = tmp3 + tmp2;
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vecN_1++)  = tmp3 - tmp2;
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 5; i != 0; i--)
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3  = fxp_mul32_Q31((*(pt_vec) - tmp0) << 1, *(pt_cos--));
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_even--);
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec--)     = tmp3 + tmp1;
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vecN_1++)  = tmp3 - tmp1;
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3  = fxp_mul32_Q31((*(pt_vec) + tmp0) << 1, *(pt_cos--));
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_even--);
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec--)     = tmp3 + tmp2;
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vecN_1++)  = tmp3 - tmp2;
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
201