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   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_imdct_synth.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Input
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 in[],         Pointer to spec values of current channel
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 overlap[],    Pointer to overlap values of current channel
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 blk_type,    Block type
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int16 mx_band,      In case of mixed blocks, # of bands with long
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        blocks (2 or 4) else 0
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *Scratch_mem
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber  Returns
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 in[],
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    The frequency lines are preprocessed by the "alias reduction" scheme
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    and fed into the IMDCT matrix, each 18 into one transform block.
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    The first half of the output values are added to the stored overlap
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    values from the last block. These values are new output values and
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    are input values for the polyphase filterbank. The second half of the
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    output values is stored for overlap with the next data granule.
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    The number of windowed samples is 12 for short blocks, and 36 for long
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    blocks
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberWindowing
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Depending on window_switching_flag[gr][ch], block_type[gr][ch] and
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mixed_block_flag[gr][ch] different shapes of windows are used.
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        normal window
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        start window
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        stop window
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        short windows
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            Each of the three short blocks is windowed separately.
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            The windowed short blocks must be overlapped and concatenated.
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberOverlapping and adding with previous block
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    The first half (18 values) of the current block (36 values) has to be
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    overlapped with the second half of the previous block. The second half
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    of the current block has to be stored for overlapping with the next block
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_imdct_synth.h"
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_dec_defs.h"
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_mdct_18.h"
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_mdct_6.h"
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "mp3_mem_funcs.h"
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define LONG        0
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define START       1
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define SHORT       2
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define STOP        3
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *   sin(pi/36*(k+0.5)),k=0..35
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 normal_win[36] =
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.08723877473068f),   Qfmt_31(0.26105238444010f),   Qfmt_31(0.43287922787620f),
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.60141159900854f),   Qfmt_31(0.76536686473018f),   Qfmt_31(0.92349722647006f),
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.53729960834682f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.67559020761566f),
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(-0.73727733681012f),   Qfmt_31(-0.79335334029124f),   Qfmt_31(0.84339144581289f),
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.88701083317822f),   Qfmt_31(0.92387953251129f),   Qfmt_31(-0.95371695074823f),
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(-0.97629600711993f),   Qfmt_31(-0.99144486137381f),   Qfmt_31(-0.99904822158186f),
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99904822158186f),   Qfmt_31(0.99144486137381f),   Qfmt_31(0.97629600711993f),
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.95371695074823f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.88701083317822f),
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.84339144581289f),   Qfmt_31(0.79335334029124f),   Qfmt_31(0.73727733681012f),
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.67559020761566f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.53729960834682f),
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.46174861323503f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.30070579950427f),
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.21643961393810f),   Qfmt_31(0.13052619222005f),   Qfmt_31(0.04361938736534f)
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 start_win[36] =
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*   k=0..17  sin(pi/36*(k+0.5)),  */
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.08723877473068f),   Qfmt_31(0.26105238444010f),   Qfmt_31(0.43287922787620f),
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.60141159900854f),   Qfmt_31(0.76536686473018f),   Qfmt_31(0.92349722647006f),
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.53729960834682f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.67559020761566f),
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(-0.73727733681012f),   Qfmt_31(-0.79335334029124f),   Qfmt_31(0.84339144581289f),
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.88701083317822f),   Qfmt_31(0.92387953251129f),   Qfmt_31(-0.95371695074823f),
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(-0.97629600711993f),   Qfmt_31(-0.99144486137381f),   Qfmt_31(-0.99904822158186f),
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*    k=24..29; sin(pi/12*(k-18+0.5)) */
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99144486137381f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.79335334029124f),
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.60876142900872f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.13052619222005f),
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f)
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 stop_win[36] =
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*    k=6..11; sin(pi/12*(k-6+0.5)) */
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.13052619222005f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.60876142900872f),
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(-0.79335334029124f),   Qfmt_31(-0.92387953251129f),   Qfmt_31(0.99144486137381f),
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(-0.99999990000000f),
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(-0.99999990000000f),   Qfmt_31(-0.99999990000000f),   Qfmt_31(-0.99999990000000f),
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*   k=18..35  sin(pi/36*(k+0.5)),  */
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99904822158186f),   Qfmt_31(0.99144486137381f),   Qfmt_31(0.97629600711993f),
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.95371695074823f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.88701083317822f),
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.84339144581289f),   Qfmt_31(0.79335334029124f),   Qfmt_31(0.73727733681012f),
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.67559020761566f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.53729960834682f),
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.46174861323503f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.30070579950427f),
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.21643961393810f),   Qfmt_31(0.13052619222005f),   Qfmt_31(0.04361938736534f)
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 short_win[12] =
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*    k=0..11; sin(pi/12*(k+0.5)) */
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.13052619222005f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.60876142900872f),
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.79335334029124f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.99144486137381f),
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.99144486137381f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.79335334029124f),
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt_31(0.60876142900872f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.13052619222005f),
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_imdct_synth(int32  in[SUBBANDS_NUMBER*FILTERBANK_BANDS],
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32  overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS],
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       uint32 blk_type,
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int16  mx_band,
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32  used_freq_lines,
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                       int32  *Scratch_mem)
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 band;
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 bands2process = used_freq_lines + 2;
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (bands2process > SUBBANDS_NUMBER)
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        bands2process = SUBBANDS_NUMBER;  /* default */
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     *  in case of mx_poly_band> 0, do
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     *  long transforms
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     */
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (band = 0; band < bands2process; band++)
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        uint32 current_blk_type = (band < mx_band) ? LONG : blk_type;
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 * out     = in      + (band * FILTERBANK_BANDS);
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 * history = overlap + (band * FILTERBANK_BANDS);
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        switch (current_blk_type)
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case LONG:
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_mdct_18(out, history, normal_win);
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case START:
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_mdct_18(out, history, start_win);
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case STOP:
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_mdct_18(out, history, stop_win);
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case SHORT:
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 *tmp_prev_ovr = &Scratch_mem[FILTERBANK_BANDS];
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 i;
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (i = 0; i < 6; i++)
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[i    ] = out[(i*3)];
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[6  +i] = out[(i*3) + 1];
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    Scratch_mem[12 +i] = out[(i*3) + 2];
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_mdct_6(&Scratch_mem[ 0], &tmp_prev_ovr[ 0]);
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_mdct_6(&Scratch_mem[ 6], &tmp_prev_ovr[ 6]);
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pvmp3_mdct_6(&Scratch_mem[12], &tmp_prev_ovr[12]);
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (i = 0; i < 6; i++)
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    int32 temp  =  history[i];
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* next iteration overlap */
286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    history[i]  =  fxp_mul32_Q32(tmp_prev_ovr[ 6+i] << 1, short_win[6+i]);
287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    history[i] +=  fxp_mul32_Q32(Scratch_mem[12+i] << 1, short_win[  i]);
288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    out[i]  =  temp;
289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
291d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (i = 0; i < 6; i++)
292d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
293d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    out[i+6]   =  fxp_mul32_Q32(Scratch_mem[i] << 1, short_win[i]);
294d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    out[i+6]  +=  history[i+6];
295d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    /* next iteration overlap */
296d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    history[i+6]  =  fxp_mul32_Q32(tmp_prev_ovr[12+i] << 1, short_win[6+i]);
297d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
298d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
299d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                for (i = 0; i < 6; i++)
300d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                {
301d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    out[i+12]  =  fxp_mul32_Q32(tmp_prev_ovr[  i] << 1, short_win[6+i]);
302d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    out[i+12] +=  fxp_mul32_Q32(Scratch_mem[6+i] << 1, short_win[  i]);
303d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    out[i+12] +=  history[i+12];
304d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    history[12+i]  =  0;
305d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                }
306d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
307d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
308d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            break;
309d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
310d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
311d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /*
312d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *     Compensation for frequency inversion of polyphase filterbank
313d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *     every odd time sample of every odd odd subband is mulitplied by -1  before
314d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *     processing by the polyphase filter
315d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         */
316d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
317d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (band & 1)
318d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
319d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            for (int32 slot = 1; slot < FILTERBANK_BANDS; slot += 6)
320d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
321d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp1 = out[slot  ];
322d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp2 = out[slot+2];
323d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp3 = out[slot+4];
324d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot  ] = -temp1;
325d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+2] = -temp2;
326d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+4] = -temp3;
327d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
328d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
329d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
330d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
331d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
332d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (band = bands2process; band < SUBBANDS_NUMBER; band++)
333d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
334d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 * out     = in      + (band * FILTERBANK_BANDS);
335d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 * history = overlap + (band * FILTERBANK_BANDS);
336d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 slot;
337d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
338d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (band & 1)
339d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
340d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            for (slot = 0; slot < FILTERBANK_BANDS; slot += 6)
341d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
342d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp1 =  history[slot  ];
343d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp2 =  history[slot+1];
344d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp3 =  history[slot+2];
345d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot  ] =  temp1;
346d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+1] = -temp2;
347d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+2] =  temp3;
348d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
349d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                temp1 =  history[slot+3];
350d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                temp2 =  history[slot+4];
351d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                temp3 =  history[slot+5];
352d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+3] = -temp1;
353d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+4] =  temp2;
354d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+5] = -temp3;
355d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
356d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
357d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
358d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
359d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            for (slot = 0; slot < FILTERBANK_BANDS; slot += 3)
360d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
361d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp1 =  history[slot  ];
362d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp2 =  history[slot+1];
363d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 temp3 =  history[slot+2];
364d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot  ] =  temp1;
365d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+1] =  temp2;
366d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                out[slot+2] =  temp3;
367d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
368d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
369d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
370d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pv_memset(history, 0, FILTERBANK_BANDS*sizeof(*overlap));
371d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
372d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
373d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
374d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
375d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
376d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
377