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: ps_decorrelate.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
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Decorrelation
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Decorrelation is achieved by means of all-pass filtering and delaying
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Sub-band samples s_k(n) are converted into de-correlated sub-bands samples
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  d_k(n). k index for frequency, n time index
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     _______                                              ________
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    |       |                                  _______   |        |
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    | Anal. |        |                        |       |  | Synth  |   QMF -> L
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     -------         o----------------------->|       |   --------    Synth
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberQMF                  |                s_k(n)  |Stereo |-------------->
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberAnal.              -------------------------->|       |
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     _______       | |                        |       |   ________
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    |       | HF --o |   -----------          |Process|  |        |
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   ---->|           |-------->|       |   --------    Synth
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         -----------          |_______|-------------->
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Delay is introduced to compensate QMF bands not passed through Hybrid
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Analysis
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberSC 29 Software Copyright Licencing Disclaimer:
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThis software module was originally developed by
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Coding Technologies
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberand edited by
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  -
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberin the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstandards for reference purposes and its performance may not have been
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoptimized. This software module is an implementation of one or more tools as
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberspecified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberISO/IEC gives users free license to this software module or modifications
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthereof for use in products claiming conformance to audiovisual and
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberStandards. ISO/IEC gives users the same free license to this software module or
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubermodifications thereof for research purposes and further ISO/IEC standardisation.
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThose intending to use this software module in products are advised that its
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberuse may infringe existing patents. ISO/IEC have no liability for use of this
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubersoftware module or modifications thereof. Copyright is not released for
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberproducts that do not conform to audiovisual and image-coding related ITU
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberRecommendations and/or ISO/IEC International Standards.
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe original developer retains full right to modify and use the code for its
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberown purpose, assign or donate the code to a third party and to inhibit third
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberparties from using the code for products that do not conform to audiovisual and
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International Standards.
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThis copyright notice must be included in all copies or derivative works.
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberCopyright (c) ISO/IEC 2003.
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef PARAMETRICSTEREO
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "pv_audio_type_defs.h"
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "ps_decorrelate.h"
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "aac_mem_funcs.h"
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "ps_all_pass_filter_coeff.h"
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "ps_pwr_transient_detection.h"
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "ps_all_pass_fract_delay_filter.h"
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "fxp_mul32.h"
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifndef min
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define min(a, b) ((a) < (b) ? (a) : (b))
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid ps_decorrelate(STRUCT_PS_DEC *h_ps_dec,
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int32 *rIntBufferLeft,
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int32 *iIntBufferLeft,
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int32 *rIntBufferRight,
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int32 *iIntBufferRight,
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Int32 scratch_mem[])
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 sb;
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 maxsb;
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 gr;
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 sb_delay;
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 bin;
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *aLeftReal;
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *aLeftImag;
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *aRightReal;
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *aRightImag;
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *aTransRatio = scratch_mem;   /* use  NO_BINS == 20 */
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 ***pppRealDelayRBufferSer;
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 ***pppImagDelayRBufferSer;
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 **ppRealDelayBuffer;
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 **ppImagDelayBuffer;
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32(*ppFractDelayPhaseFactorSer)[3];
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Power transient estimation and detection
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ps_pwr_transient_detection(h_ps_dec,
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               rIntBufferLeft,
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               iIntBufferLeft,
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               aTransRatio);
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aLeftReal = h_ps_dec->mHybridRealLeft;
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aLeftImag = h_ps_dec->mHybridImagLeft;
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aRightReal = h_ps_dec->mHybridRealRight;
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aRightImag = h_ps_dec->mHybridImagRight;
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pppRealDelayRBufferSer = h_ps_dec->aaaRealDelayRBufferSerSubQmf;
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pppImagDelayRBufferSer = h_ps_dec->aaaImagDelayRBufferSerSubQmf;
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ppRealDelayBuffer = h_ps_dec->aaRealDelayBufferSubQmf;
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ppImagDelayBuffer = h_ps_dec->aaImagDelayBufferSubQmf;
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ppFractDelayPhaseFactorSer = aaFractDelayPhaseFactorSerSubQmf;
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *   NO_IID_GROUPS (SUBQMF_GROUPS (12) + QMF_GROUPS (10)) == 22
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (gr = 0; gr < SUBQMF_GROUPS; gr++)      /*  0 to 9 */
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 rIn;
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 iIn;
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 *pt_rTmp;
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 *pt_iTmp;
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 rTmp;
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 cmplx;
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 tmp1, tmp2;
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* sb = subQMF/QMF subband */
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sb = groupBorders[gr];
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  For lower subbands
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Apply all-pass filtering
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_rTmp = &ppRealDelayBuffer[sb][h_ps_dec->delayBufIndex];
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_iTmp = &ppImagDelayBuffer[sb][h_ps_dec->delayBufIndex];
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = aLeftReal[sb];
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = aLeftImag[sb];
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        rIn = *pt_rTmp >> 1;
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        iIn = *pt_iTmp >> 1;
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pt_rTmp = tmp1;
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pt_iTmp = tmp2;
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Fractional delay vector
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  phi_fract(k) = exp(-j*pi*q_phi*f_center(k))       0<= k <= SUBQMF_GROUPS
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  q_phi = 0.39
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  f_center(k) frequency vector
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        cmplx =  aFractDelayPhaseFactorSubQmf[sb];
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aRightReal[sb]  = cmplx_mul32_by_16(rIn, -iIn, cmplx);
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        aRightImag[sb]  = cmplx_mul32_by_16(iIn,  rIn, cmplx);
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ps_all_pass_fract_delay_filter_type_I(h_ps_dec->aDelayRBufIndexSer,
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                              sb,
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                              ppFractDelayPhaseFactorSer[sb],
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                              pppRealDelayRBufferSer,
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                              pppImagDelayRBufferSer,
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                              &aRightReal[sb],
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                              &aRightImag[sb]);
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        bin = bins2groupMap[gr];
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        rTmp = aTransRatio[bin];
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (rTmp != 0x7FFFFFFF)
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            aRightReal[sb] = fxp_mul32_Q31(rTmp, aRightReal[sb]) << 1;
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            aRightImag[sb] = fxp_mul32_Q31(rTmp, aRightImag[sb]) << 1;
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* gr */
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aLeftReal = rIntBufferLeft;
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aLeftImag = iIntBufferLeft;
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aRightReal = rIntBufferRight;
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    aRightImag = iIntBufferRight;
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pppRealDelayRBufferSer = h_ps_dec->aaaRealDelayRBufferSerQmf;
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pppImagDelayRBufferSer = h_ps_dec->aaaImagDelayRBufferSerQmf;
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ppRealDelayBuffer = h_ps_dec->aaRealDelayBufferQmf;
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ppImagDelayBuffer = h_ps_dec->aaImagDelayBufferQmf;
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ppFractDelayPhaseFactorSer = aaFractDelayPhaseFactorSerQmf;
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (gr = SUBQMF_GROUPS; gr < NO_BINS; gr++)     /* 10 to 20 */
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        maxsb = min(h_ps_dec->usb, groupBorders[gr+1]);
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* sb = subQMF/QMF subband */
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (sb = groupBorders[gr]; sb < maxsb; sb++)
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 rIn, iIn;
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 *pt_rTmp, *pt_iTmp;
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 cmplx;
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 tmp1, tmp2;
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 rTmp;
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sb_delay = sb - NO_QMF_CHANNELS_IN_HYBRID;  /* NO_QMF_CHANNELS_IN_HYBRID == 3 */
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  For lower subbands
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Apply all-pass filtering
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_rTmp = &ppRealDelayBuffer[sb_delay][h_ps_dec->delayBufIndex];
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_iTmp = &ppImagDelayBuffer[sb_delay][h_ps_dec->delayBufIndex];
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            rIn = *pt_rTmp >> 1;
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            iIn = *pt_iTmp >> 1;
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = aLeftReal[sb];
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = aLeftImag[sb];
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pt_rTmp = tmp1;
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pt_iTmp = tmp2;
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Fractional delay vector
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  phi_fract(k) = exp(-j*pi*q_phi*f_center(k))       0<= k <= SUBQMF_GROUPS
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  q_phi = 0.39
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  f_center(k) frequency vector
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            cmplx =  aFractDelayPhaseFactor[sb_delay];
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            aRightReal[sb] = cmplx_mul32_by_16(rIn, -iIn, cmplx);
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            aRightImag[sb] = cmplx_mul32_by_16(iIn,  rIn, cmplx);
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ps_all_pass_fract_delay_filter_type_II(h_ps_dec->aDelayRBufIndexSer,
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   sb_delay,
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   ppFractDelayPhaseFactorSer[sb_delay],
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   pppRealDelayRBufferSer,
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   pppImagDelayRBufferSer,
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   &aRightReal[sb],
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   &aRightImag[sb],
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                   sb);
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            rTmp = aTransRatio[gr-2];
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (rTmp != 0x7FFFFFFF)
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightReal[sb] = fxp_mul32_Q31(rTmp, aRightReal[sb]) << 1;
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightImag[sb] = fxp_mul32_Q31(rTmp, aRightImag[sb]) << 1;
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* sb */
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    maxsb = min(h_ps_dec->usb, 35);  /*  35 == groupBorders[NO_BINS + 1] */
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* sb = subQMF/QMF subband */
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 factor = aTransRatio[NO_BINS-2];
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (sb = 23; sb < maxsb; sb++)    /*  23 == groupBorders[NO_BINS] */
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32  tmp, tmp2;
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 *pt_rTmp, *pt_iTmp;
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sb_delay = sb - NO_QMF_CHANNELS_IN_HYBRID;  /*  == 3 */
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  For the Upper Bands apply delay only
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                          -D(k)
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Apply Delay   H_k(z) = z         , D(k) == 1 or 14
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 k = sb - NO_ALLPASS_CHANNELS;  /* == 23 */
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_rTmp = &ppRealDelayBuffer[sb_delay][h_ps_dec->aDelayBufIndex[ k]];
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_iTmp = &ppImagDelayBuffer[sb_delay][h_ps_dec->aDelayBufIndex[ k]];
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (++h_ps_dec->aDelayBufIndex[ k] >= LONG_DELAY)     /* == 14 */
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                h_ps_dec->aDelayBufIndex[ k] = 0;
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp  = *pt_rTmp;
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = *pt_iTmp;
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (aTransRatio[NO_BINS-2] < 0x7FFFFFFF)
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightReal[sb] = fxp_mul32_Q31(factor, tmp) << 1;
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightImag[sb] = fxp_mul32_Q31(factor, tmp2) << 1;
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightReal[sb] = tmp;
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightImag[sb] = tmp2;
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp  = aLeftReal[sb];
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = aLeftImag[sb];
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pt_rTmp = tmp;
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pt_iTmp = tmp2;
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* sb */
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    maxsb = min(h_ps_dec->usb, 64);     /*  64 == groupBorders[NO_BINS+2] */
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* sb = subQMF/QMF subband */
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (sb = 35; sb < maxsb; sb++)    /*  35 == groupBorders[NO_BINS+1] */
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32 *pt_rTmp, *pt_iTmp;
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sb_delay = sb - NO_QMF_CHANNELS_IN_HYBRID;  /*  == 3 */
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  For the Upper Bands apply delay only
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                          -D(k)
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *  Apply Delay   H_k(z) = z         , D(k) == 1 or 14
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_rTmp = &ppRealDelayBuffer[sb_delay][0];
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_iTmp = &ppImagDelayBuffer[sb_delay][0];
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            aRightReal[sb] = *pt_rTmp;
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            aRightImag[sb] = *pt_iTmp;
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (aTransRatio[NO_BINS-1] < 0x7FFFFFFF)
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightReal[sb] = fxp_mul32_Q31(aTransRatio[NO_BINS-1], aRightReal[sb]) << 1;
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                aRightImag[sb] = fxp_mul32_Q31(aTransRatio[NO_BINS-1], aRightImag[sb]) << 1;
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pt_rTmp = aLeftReal[sb];
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pt_iTmp = aLeftImag[sb];
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* sb */
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (++h_ps_dec->delayBufIndex >= DELAY_ALLPASS)
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        h_ps_dec->delayBufIndex = 0;
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (++h_ps_dec->aDelayRBufIndexSer[0] >= 3)
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        h_ps_dec->aDelayRBufIndexSer[0] = 0;
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (++h_ps_dec->aDelayRBufIndexSer[1] >= 4)
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        h_ps_dec->aDelayRBufIndexSer[1] = 0;
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (++h_ps_dec->aDelayRBufIndexSer[2] >= 5)
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        h_ps_dec->aDelayRBufIndexSer[2] = 0;
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* END deCorrelate */
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
500