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