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: dst16.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 16
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Implement discrete sine transform of lenght 16
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#include "dst16.h"
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "dst8.h"
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define R_SHIFT     28
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int32 CosTable_8[8] =
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.50241928618816F),   Qfmt(0.52249861493969F),
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.56694403481636F),   Qfmt(0.64682178335999F),
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.78815462345125F),   Qfmt(1.06067768599035F),
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(1.72244709823833F),   Qfmt(5.10114861868916F)
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber};
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid dst_16(Int32 vec[], Int32 scratch_mem[])     /* scratch_mem size 8 */
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *temp_even = scratch_mem;
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int i;
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_cos = &CosTable_8[7];
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp0 = vec[15] >> 1;
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp1, tmp2;
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_even = temp_even;
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_odd  = vec;
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vec  = vec;
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vecN_1;
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp3;
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_even++) = *(pt_vec++);
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1         = *(pt_vec++);
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_odd++) = tmp1;
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 3; i != 0; i--)
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_even++) = *(pt_vec++);
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2         = *(pt_vec++);
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_even++) = *(pt_vec++);
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3         = *(pt_vec++);
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_odd++) = tmp2 + tmp1;
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_odd++) = tmp3 + tmp2;
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1         = tmp3;
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_even)   = *(pt_vec++);
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *(pt_odd++) = *(pt_vec) + tmp1;
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dst_8(temp_even);
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dst_8(vec);
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_vec  = &vec[7];
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_even = &temp_even[7];
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_vecN_1  = &vec[8];
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = *(pt_even--);
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 4; i != 0; i--)
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3  = fxp_mul32_Q28((*(pt_vec) - tmp0), *(pt_cos--));
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_even--);
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec--)     = tmp3 + tmp1;
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vecN_1++)  = tmp3 - tmp1;
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3  = fxp_mul32_Q28((*(pt_vec) + tmp0), *(pt_cos--));
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_even--);
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vecN_1++)  = tmp3 - tmp2;
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec--)     = tmp3 + tmp2;
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
173