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: dct64.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 64
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Implement dct of lenght 64
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 "dct16.h"
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "dct64.h"
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "synthesis_sub_band.h"
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt(a)   (Int32)(a*((Int32)1<<26) + (a>=0?0.5F:-0.5F))
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt31(a)   (Int32)(a*0x7FFFFFFF)
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int32 CosTable_48[48] =
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.50015063602065F) ,  Qfmt31(0.50135845244641F) ,
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.50378872568104F) ,  Qfmt31(0.50747117207256F) ,
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.51245147940822F) ,  Qfmt31(0.51879271310533F) ,
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.52657731515427F) ,  Qfmt31(0.53590981690799F) ,
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.54692043798551F) ,  Qfmt31(0.55976981294708F) ,
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.57465518403266F) ,  Qfmt31(0.59181853585742F) ,
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.61155734788251F) ,  Qfmt31(0.63423893668840F) ,
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.66031980781371F) ,  Qfmt31(0.69037212820021F) ,
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.72512052237720F) ,  Qfmt31(0.76549416497309F) ,
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt31(0.81270209081449F) ,  Qfmt31(0.86834471522335F) ,
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.93458359703641F) ,  Qfmt(1.01440826499705F) ,
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(1.11207162057972F) ,  Qfmt(1.23383273797657F) ,
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(1.38929395863283F) ,  Qfmt(1.59397228338563F) ,
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(1.87467598000841F) ,  Qfmt(2.28205006800516F) ,
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(2.92462842815822F) ,  Qfmt(4.08461107812925F) ,
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(6.79675071167363F) ,  Qfmt(20.37387816723145F) , /* 32 */
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.50060299823520F) ,  Qfmt(0.50547095989754F) ,
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.51544730992262F) ,  Qfmt(0.53104259108978F) ,
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.55310389603444F) ,  Qfmt(0.58293496820613F) ,
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.62250412303566F) ,  Qfmt(0.67480834145501F) ,
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.74453627100230F) ,  Qfmt(0.83934964541553F) ,
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(0.97256823786196F) ,  Qfmt(1.16943993343288F) ,
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(1.48416461631417F) ,  Qfmt(2.05778100995341F) ,
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Qfmt(3.40760841846872F) ,  Qfmt(10.19000812354803F)
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber};
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; dct_64
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pv_split_LC(Int32 *vector,
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 Int32 *temp_o)
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 i;
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vector     = &vector[0];
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vector_N_1 = &vector[31];
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_cosTerms = &CosTable_48[32];
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_temp_o = temp_o;
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp1;
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp2;
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp3;
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp1 = *(pt_vector);
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp2 = *(pt_vector_N_1--);
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 16; i != 0; i--)
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp3 = *(pt_cosTerms++);
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vector++) =   tmp1  + tmp2;
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), tmp3);
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_vector);
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_vector_N_1--);
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid dct_64(Int32 vec[], Int32 *scratch_mem)
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *temp_e1;
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *temp_o1;
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vec;
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   i;
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 aux1;
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 aux2;
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 aux3;
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 aux4;
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *cosTerms = &CosTable_48[31];
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_o1 = &vec[32];
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_e1 = temp_o1 - 1;
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 6; i != 0; i--)
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux1 = *(temp_e1);
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux2 = *(temp_o1);
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux3 = *(cosTerms--);
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_e1--) =   aux1  + aux2;
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3);
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux1 = *(temp_e1);
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux2 = *(temp_o1);
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux3 = *(cosTerms--);
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_e1--) =   aux1  + aux2;
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3);
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 10; i != 0; i--)
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux1 = *(temp_e1);
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux2 = *(temp_o1);
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux3 = *(cosTerms--);
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_e1--) =   aux1  + aux2;
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1;
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux1 = *(temp_e1);
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux2 = *(temp_o1);
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux3 = *(cosTerms--);
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_e1--) =   aux1  + aux2;
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1;
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pv_split(&vec[16]);
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dct_16(&vec[16], 0);
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dct_16(vec,     1);      // Even terms
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pv_merge_in_place_N32(vec);
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pv_split_z(&vec[32]);
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dct_16(&vec[32], 1);     // Even terms
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    dct_16(&vec[48], 0);
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pv_merge_in_place_N32(&vec[32]);
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1   = vec[32];
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3   = vec[33];
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4   = vec[ 1];  /* vec[ 1] */
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1     = vec[32] + vec[33];
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 0] +=  aux1;
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 1] +=  aux1;
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[34];
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[ 2];   /* vec[ 2] */
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 2] = aux4 + aux3;
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[ 3];  /* vec[ 3] */
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 3] = aux2 + aux3;
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[35];
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[32] = vec[ 4];
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[33] = vec[ 5];
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 4] = aux2 + aux1;
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 5] = aux4 + aux1;
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[36];
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[32];  /* vec[ 4] */
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[34] = vec[ 6];
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[35] = vec[ 7];
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 6] = aux4 + aux3;
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 7] = aux2 + aux3;
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[37];
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[33];  /* vec[ 5] */
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[32] = vec[ 8];
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[33] = vec[ 9];
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 8] = aux2 + aux1;
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 9] = aux4 + aux1;
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[38];
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[34];  /* vec[ 6] */
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[34] = vec[10];
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[10] = aux4 + aux3;
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[35];  /* vec[ 7] */
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[35] = vec[11];
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[11] = aux2 + aux3;
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[39];
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[36] = vec[12];
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[37] = vec[13];
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[12] = aux2 + aux1;
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[13] = aux4 + aux1;
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[40];
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[32];  /* vec[ 8] */
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[32] = vec[14];
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[14] = aux4 + aux3;
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[33];  /* vec[ 9] */
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[33] = vec[15];
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[15] = aux2 + aux3;
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[41];
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[38] = vec[16];
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[39] = vec[17];
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[16] = aux2 + aux1;
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[17] = aux4 + aux1;
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[42];
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[34];  /* vec[10] */
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[34] = vec[18];
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[18] = aux4 + aux3;
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[35];  /* vec[11] */
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[35] = vec[19];
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[19] = aux2 + aux3;
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[43];
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[40] = vec[20];
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[41] = vec[21];
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[20] = aux2 + aux1;
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[21] = aux4 + aux1;
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[44];
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[36];  /* vec[12] */
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[42] = vec[22];
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[43] = vec[23];
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[22] = aux4 + aux3;
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[23] = aux2 + aux3;
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[45];
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[37];  /* vec[13] */
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[0] = vec[24];
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[1] = vec[25];
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[24] = aux2 + aux1;
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[25] = aux4 + aux1;
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[46];
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[32];  /* vec[14] */
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[2] = vec[26];
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[3] = vec[27];
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[26] = aux4 + aux3;
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[27] = aux2 + aux3;
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[47];
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[33];  /* vec[15] */
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[4] = vec[28];
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[5] = vec[29];
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[28] = aux2 + aux1;
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[29] = aux4 + aux1;
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[48];
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[38];  /* vec[16] */
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[6] = vec[30];
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scratch_mem[7] = vec[31];
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[30] = aux4 + aux3;
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[31] = aux2 + aux3;
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[49];
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[39];  /* vec[17] */
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[32] = aux2 + aux1;
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[33] = aux4 + aux1;
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[50];
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[34];  /* vec[18] */
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[34] = aux4 + aux3;
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[35];  /* vec[19] */
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[35] = aux2 + aux3;
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[51];
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[36] = aux2 + aux1;
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[37] = aux4 + aux1;
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[52];
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[40];  /* vec[20] */
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[38] = aux4 + aux3;
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[39] = aux2 + aux3;
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[53];
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[41];  /* vec[21] */
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        += aux3;
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[40] = aux2 + aux1;
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[41] = aux4 + aux1;
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1        = vec[54];
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux2        = vec[42];  /* vec[22] */
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        += aux1;
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[42] = aux4 + aux3;
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux4        = vec[43];  /* vec[23] */
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[43] = aux2 + aux3;
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux3        = vec[55];
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* -----------------------------------*/
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pt_vec = &vec[44];
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_o1 = &vec[56];
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_e1 = &scratch_mem[0];
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 4; i != 0; i--)
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux1        += aux3;
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec++) = aux2 + aux1;
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec++) = aux4 + aux1;
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux1        = *(temp_o1++);
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux3        += aux1;
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux2        = *(temp_e1++);
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec++) = aux4 + aux3;
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vec++) = aux2 + aux3;
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux3        = *(temp_o1++);
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aux4        = *(temp_e1++);
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aux1       += aux3;
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[60] = aux2 + aux1;
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[61] = aux4 + aux1;
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[62] = aux4 + aux3;
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; pv_split
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pv_split(Int32 *temp_o)
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 i;
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_cosTerms = &CosTable_48[47];
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_temp_o = temp_o;
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_temp_e = pt_temp_o - 1;
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp1;
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp2;
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 cosx;
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 8; i != 0; i--)
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_temp_o);
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_temp_e);
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        cosx = *(pt_cosTerms--);
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_e--) =   tmp1  + tmp2;
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_temp_e);
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_temp_o);
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        cosx = *(pt_cosTerms--);
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_e--) =   tmp1  + tmp2;
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pv_split_z(Int32 *vector)
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 i;
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_vector     = &vector[31];
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_cosTerms = &CosTable_48[32];
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pt_temp_e = vector;
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp1;
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 tmp2;
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 cosx;
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = 8; i != 0; i--)
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_vector);
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_temp_e);
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        cosx = *(pt_cosTerms++);
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_e++) =   tmp1  + tmp2;
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = *(pt_temp_e);
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = *(pt_vector);
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        cosx = *(pt_cosTerms++);
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_temp_e++) =   tmp1  + tmp2;
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pv_merge_in_place_N32(Int32 vec[])
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 temp[4];
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[0] = vec[14];
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[14] = vec[ 7];
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[1] = vec[12];
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[12] = vec[ 6];
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[2] = vec[10];
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[10] = vec[ 5];
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[3] = vec[ 8];
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 8] = vec[ 4];
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 6] = vec[ 3];
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 4] = vec[ 2];
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 2] = vec[ 1];
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 1] = vec[16] + vec[17];
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[16] = temp[3];
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 3] = vec[18] + vec[17];
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 5] = vec[19] + vec[18];
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[18] = vec[9];
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[3] = vec[11];
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 7] = vec[20] + vec[19];
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[ 9] = vec[21] + vec[20];
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[20] = temp[2];
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[2] = vec[13];
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[11] = vec[22] + vec[21];
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[13] = vec[23] + vec[22];
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[22] = temp[3];
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp[3] = vec[15];
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[15] = vec[24] + vec[23];
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[17] = vec[25] + vec[24];
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[19] = vec[26] + vec[25];
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[21] = vec[27] + vec[26];
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[23] = vec[28] + vec[27];
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[25] = vec[29] + vec[28];
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[27] = vec[30] + vec[29];
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[29] = vec[30] + vec[31];
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[24] = temp[1];
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[26] = temp[2];
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[28] = temp[0];
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    vec[30] = temp[3];
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
570