1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_polyphase_filter_window.cpp
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *synth_buffer,    synthesis input buffer
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int16 *outPcm,          generated output ( 32 values)
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 numChannels       number of channels
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int16 *outPcm
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    apply polyphase filter window
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Input 32 subband samples
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Calculate 64 values
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) && !defined(PV_ARM_V5) && !defined(PV_ARM_V4) )
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_polyphase_filter_window.h"
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_dec_defs.h"
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_tables.h"
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module1 specific macros here
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module1
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module_x
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module_x but defined elsewhere
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_polyphase_filter_window(int32 *synth_buffer,
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                   int16 *outPcm,
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                   int32 numChannels)
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sum1;
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 sum2;
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *winPtr = pqmfSynthWin;
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i;
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (int16 j = 1; j < SUBBANDS_NUMBER / 2; j++)
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum1 = 0x00000020;
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum2 = 0x00000020;
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (i = (SUBBANDS_NUMBER >> 1);
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                i < HAN_SIZE + (SUBBANDS_NUMBER >> 1);
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                i += SUBBANDS_NUMBER << 4)
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 *pt_1 = &synth_buffer[ i+j];
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 *pt_2 = &synth_buffer[ i-j];
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 temp1 = pt_1[ 0];
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 temp3 = pt_2[ SUBBANDS_NUMBER*15 ];
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 temp2 = pt_2[ SUBBANDS_NUMBER* 1 ];
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 temp4 = pt_1[ SUBBANDS_NUMBER*14 ];
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[ 0]);
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[ 0]);
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[ 1]);
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[ 1]);
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[ 2]);
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[ 2]);
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[ 3]);
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[ 3]);
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp1 = pt_1[ SUBBANDS_NUMBER* 2];
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp3 = pt_2[ SUBBANDS_NUMBER*13];
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp2 = pt_2[ SUBBANDS_NUMBER* 3];
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp4 = pt_1[ SUBBANDS_NUMBER*12];
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[ 4]);
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[ 4]);
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[ 5]);
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[ 5]);
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[ 6]);
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[ 6]);
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[ 7]);
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[ 7]);
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp1 = pt_1[ SUBBANDS_NUMBER* 4 ];
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp3 = pt_2[ SUBBANDS_NUMBER*11 ];
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp2 = pt_2[ SUBBANDS_NUMBER* 5 ];
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp4 = pt_1[ SUBBANDS_NUMBER*10 ];
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[ 8]);
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[ 8]);
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[ 9]);
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[ 9]);
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[10]);
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[10]);
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[11]);
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[11]);
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp1 = pt_1[ SUBBANDS_NUMBER*6 ];
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp3 = pt_2[ SUBBANDS_NUMBER*9 ];
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp2 = pt_2[ SUBBANDS_NUMBER*7 ];
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            temp4 = pt_1[ SUBBANDS_NUMBER*8 ];
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[12]);
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[12]);
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[13]);
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[13]);
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[14]);
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[14]);
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[15]);
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[15]);
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            winPtr += 16;
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 k = j << (numChannels - 1);
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        outPcm[k] = saturate16(sum1 >> 6);
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        outPcm[(numChannels<<5) - k] = saturate16(sum2 >> 6);
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    sum1 = 0x00000020;
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    sum2 = 0x00000020;
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (i = 16; i < HAN_SIZE + 16; i += (SUBBANDS_NUMBER << 2))
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 *pt_synth = &synth_buffer[i];
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 temp1 = pt_synth[ 0                ];
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 temp2 = pt_synth[ SUBBANDS_NUMBER  ];
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 temp3 = pt_synth[ SUBBANDS_NUMBER/2];
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum1 = fxp_mac32_Q32(sum1, temp1, winPtr[0]) ;
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum1 = fxp_mac32_Q32(sum1, temp2, winPtr[1]) ;
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum2 = fxp_mac32_Q32(sum2, temp3, winPtr[2]) ;
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        temp1 = pt_synth[ SUBBANDS_NUMBER<<1 ];
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        temp2 = pt_synth[ 3*SUBBANDS_NUMBER  ];
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        temp3 = pt_synth[ SUBBANDS_NUMBER*5/2];
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum1 = fxp_mac32_Q32(sum1, temp1, winPtr[3]) ;
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum1 = fxp_mac32_Q32(sum1, temp2, winPtr[4]) ;
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sum2 = fxp_mac32_Q32(sum2, temp3, winPtr[5]) ;
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        winPtr += 6;
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    outPcm[0] = saturate16(sum1 >> 6);
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    outPcm[(SUBBANDS_NUMBER/2)<<(numChannels-1)] = saturate16(sum2 >> 6);
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif // If not assembly
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
240