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 Filename: dct16.c
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date: MM/DD/YYYY
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 x             32-bit integer input length 16
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 flag           1  forward dct16, 0 modified dct-16
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Implement dct 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 "dct16.h"
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt_31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt15(x)   (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid dct_16(Int32 vec[], Int flag)
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp0;
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp1;
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp2;
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp3;
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp4;
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp5;
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp6;
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp7;
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o0;
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o1;
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o2;
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o3;
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o4;
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o5;
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o6;
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp_o7;
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 itmp_e0;
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 itmp_e1;
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 itmp_e2;
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*  split input vector */
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o0 = fxp_mul32_by_16((vec[ 0] - vec[15]), Qfmt15(0.50241928618816F));
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp0   =  vec[ 0] + vec[15];
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o7 = fxp_mul32_Q31((vec[ 7] - vec[ 8]) << 3, Qfmt_31(0.63764357733614F));
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp7   =  vec[ 7] + vec[ 8];
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    itmp_e0 = (tmp0 + tmp7);
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp7    = fxp_mul32_by_16((tmp0 - tmp7), Qfmt15(0.50979557910416F));
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o1 = fxp_mul32_by_16((vec[ 1] - vec[14]), Qfmt15(0.52249861493969F));
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1   =  vec[ 1] + vec[14];
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o6 = fxp_mul32_by_16((vec[ 6] - vec[ 9]) << 1, Qfmt15(0.86122354911916F));
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp6   =  vec[ 6] + vec[ 9];
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    itmp_e1 = (tmp1 + tmp6);
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp6    = fxp_mul32_by_16((tmp1 - tmp6), Qfmt15(0.60134488693505F));
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o2 = fxp_mul32_by_16((vec[ 2] - vec[13]), Qfmt15(0.56694403481636F));
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp2   =  vec[ 2] + vec[13];
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o5 = fxp_mul32_by_16((vec[ 5] - vec[10]) << 1, Qfmt15(0.53033884299517F));
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp5   =  vec[ 5] + vec[10];
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    itmp_e2 = (tmp2 + tmp5);
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp5    = fxp_mul32_by_16((tmp2 - tmp5), Qfmt15(0.89997622313642F));
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o3 = fxp_mul32_by_16((vec[ 3] - vec[12]), Qfmt15(0.64682178335999F));
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3   =  vec[ 3] + vec[12];
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o4 = fxp_mul32_by_16((vec[ 4] - vec[11]), Qfmt15(0.78815462345125F));
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp4   =  vec[ 4] + vec[11];
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1   = (tmp3 + tmp4);
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp4   =  fxp_mul32_Q31((tmp3 - tmp4) << 2, Qfmt_31(0.64072886193538F));
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*  split even part of tmp_e */
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp0 = (itmp_e0 + tmp1);
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = fxp_mul32_by_16((itmp_e0 - tmp1), Qfmt15(0.54119610014620F));
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3 = fxp_mul32_by_16((itmp_e1 - itmp_e2) << 1, Qfmt15(0.65328148243819F));
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp2 = (itmp_e1 + itmp_e2);
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 0]  = (tmp0 + tmp2) >> 1;
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 8]  = fxp_mul32_by_16((tmp0 - tmp2), Qfmt15(0.70710678118655F));
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[12]  = fxp_mul32_by_16((tmp1 - tmp3) << 1, Qfmt15(0.70710678118655F));
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 4]  =  tmp1 + tmp3;
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 4] +=  vec[12];
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*  split odd part of tmp_e */
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = fxp_mul32_by_16((tmp7 - tmp4) << 1, Qfmt15(0.54119610014620F));
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp7 += tmp4;
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3 = fxp_mul32_Q31((tmp6 - tmp5) << 2, Qfmt_31(0.65328148243819F));
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp6 += tmp5;
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[10]  = fxp_mul32_by_16((tmp7 - tmp6) << 1, Qfmt15(0.70710678118655F));
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 2]  =  tmp7 + tmp6;
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[14]  = fxp_mul32_by_16((tmp1 - tmp3) << 1, Qfmt15(0.70710678118655F));
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1    +=  tmp3 + vec[14];
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 2] +=  tmp1;
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 6]  =  tmp1 + vec[10];
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[10] += vec[14];
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    // dct8;
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp7 = tmp_o0 + tmp_o7;
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o7 = fxp_mul32_by_16((tmp_o0 - tmp_o7) << 1, Qfmt15(0.50979557910416F));
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp6 = tmp_o1 + tmp_o6;
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o1 = fxp_mul32_by_16((tmp_o1 - tmp_o6) << 1, Qfmt15(0.60134488693505F));
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp5 = tmp_o2 + tmp_o5;
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o5 = fxp_mul32_by_16((tmp_o2 - tmp_o5) << 1, Qfmt15(0.89997622313642F));
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp4 = tmp_o3 + tmp_o4;
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_o3 = fxp_mul32_Q31((tmp_o3 - tmp_o4) << 3, Qfmt_31(0.6407288619354F));
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (!flag)
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp7   = -tmp7;
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp_o7 = -tmp_o7;
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp6   = -tmp6;
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp_o1 = -tmp_o1;
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp5   = -tmp5;
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp_o5 = -tmp_o5;
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp4   = -tmp4;
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp_o3 = -tmp_o3;
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    // even part
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = fxp_mul32_by_16((tmp7 - tmp4) << 1, Qfmt15(0.54119610014620F));
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp0 =  tmp7 + tmp4;
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3 = fxp_mul32_Q31((tmp6 - tmp5) << 2, Qfmt_31(0.65328148243819F));
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp2 =  tmp6 + tmp5;
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 9]  = fxp_mul32_Q31((tmp0 - tmp2) << 1, Qfmt_31(0.70710678118655F));
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 1]  =  tmp0 + tmp2;
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[13]  = fxp_mul32_Q31((tmp1 - tmp3) << 1, Qfmt_31(0.70710678118655F));
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 5]  =  tmp1 + tmp3 + vec[13];
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    // odd part
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp0 =  tmp_o7 + tmp_o3;
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = fxp_mul32_by_16((tmp_o7 - tmp_o3) << 1, Qfmt15(0.54119610014620F));
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp2 =  tmp_o1 + tmp_o5;
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp3 = fxp_mul32_Q31((tmp_o1 - tmp_o5) << 2, Qfmt_31(0.65328148243819F));
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[11]  = fxp_mul32_Q31((tmp0 - tmp2) << 1, Qfmt_31(0.70710678118655F));
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 3]  =  tmp0 + tmp2;
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[15]  = fxp_mul32_Q31((tmp1 - tmp3) << 1, Qfmt_31(0.70710678118655F));
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 7]  =  tmp1 + tmp3 + vec[15];
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 3] += vec[ 7];
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 7] += vec[11];
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[11] += vec[15];
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 1] += vec[ 3];
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 3] += vec[ 5];
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 5] += vec[ 7];
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 7] += vec[ 9];
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 9] += vec[11];
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[11] += vec[13];
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[13] += vec[15];
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
267