Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : /*====================================================================================
34 : EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
35 : ====================================================================================*/
36 :
37 : #include <assert.h>
38 : #include <stdint.h>
39 : #include "options.h"
40 : #include <math.h>
41 : #include "stat_dec.h"
42 : #include "prot_fx.h"
43 : #include "rom_com.h"
44 : #include "rom_com_fx.h"
45 : #include "wmc_auto.h"
46 : #if __STDC_VERSION__ >= 199901L
47 : #if defined __ICL
48 : #define restrict __restrict
49 : #endif
50 : #else
51 : #define restrict
52 : #endif
53 :
54 : /*-------------------------------------------------------------------*
55 : * Local prototypes
56 : *--------------------------------------------------------------------*/
57 :
58 : static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs );
59 :
60 : static void cldfb_init_proto_and_twiddles_enc_fx( HANDLE_CLDFB_FILTER_BANK hs );
61 :
62 : static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */
63 : Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */
64 : const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */
65 : Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */
66 : Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */
67 : Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */
68 : Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */
69 : Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */
70 : Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */
71 : Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */
72 : Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/
73 : Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */
74 : TEC_ENC_HANDLE hTecEnc );
75 :
76 : /*-------------------------------------------------------------------*
77 : * cplxMult()
78 : *
79 : * Conduct complex multiplication
80 : *--------------------------------------------------------------------*/
81 :
82 : /*-------------------------------------------------------------------*
83 : * cldfbAnalysis_ivas()
84 : *
85 : * Conduct multiple overlap complex low delay MDCT
86 : *--------------------------------------------------------------------*/
87 343170 : void cldfbAnalysis_ivas_fx(
88 : const Word32 *timeIn_fx, /* i : time buffer Qx */
89 : Word32 **realBuffer_fx, /* o : real value buffer Qx - 5*/
90 : Word32 **imagBuffer_fx, /* o : imag value buffer QX - 5*/
91 : const Word16 samplesToProcess, /* i : samples to process */
92 : HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */
93 : )
94 : {
95 : Word16 i, k;
96 : Word16 L2, M1, M2, M4;
97 343170 : Word16 no_col = h_cldfb->no_col;
98 343170 : move16();
99 :
100 : Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
101 : Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
102 : Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
103 : Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
104 : const Word32 *rot_vctr_re_fx;
105 : const Word32 *rot_vctr_im_fx;
106 : const Word32 *ptr_pf_fx;
107 : Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
108 : Word16 offset, frameSize;
109 :
110 343170 : offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
111 343170 : frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
112 :
113 343170 : assert( h_cldfb->prototype == CLDFB_PROTOTYPE_1_25MS );
114 : /* prepare input buffer */
115 343170 : timeBuffer_fx = buffer_fx;
116 343170 : Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
117 :
118 343170 : IF( GT_16( samplesToProcess, -1 ) )
119 : {
120 89965 : Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
121 89965 : set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
122 : }
123 : ELSE
124 : {
125 253205 : Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
126 : }
127 :
128 : /* only process needed cols */
129 343170 : IF( GT_16( samplesToProcess, -1 ) )
130 : {
131 89965 : no_col = s_min( no_col, div_l( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), shr( h_cldfb->no_channels, 1 ) ) );
132 : }
133 :
134 343170 : M1 = h_cldfb->no_channels;
135 343170 : move16();
136 343170 : M2 = shr( M1, 1 );
137 343170 : M4 = shr( M1, 2 );
138 343170 : L2 = shl( M1, 1 );
139 :
140 343170 : if ( s_and( M2, 1 ) )
141 : {
142 0 : M4 = add( M4, 1 );
143 : }
144 :
145 343170 : rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;
146 343170 : rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;
147 :
148 343170 : ptr_pf_fx = h_cldfb->p_filter_32;
149 343170 : move16();
150 :
151 5203149 : FOR( i = 0; i < no_col; i++ )
152 : {
153 26721288 : FOR( k = 0; k < M4; k++ )
154 : {
155 : /* prototype filter */
156 21861309 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx
157 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
158 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
159 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
160 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
161 :
162 21861309 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // Qx
163 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
164 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
165 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
166 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
167 :
168 21861309 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx
169 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
170 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
171 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
172 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
173 :
174 21861309 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx
175 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
176 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
177 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
178 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
179 :
180 :
181 : /* folding + pre modulation of DST IV */
182 21861309 : rr12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1
183 21861309 : ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // Qx - 1
184 : // cplxMult( &rBuffer_fx[2 * k], &rBuffer_fx[2 * k + 1], rr12_fx, ri12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] );
185 21861309 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3
186 21861309 : move32();
187 21861309 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3
188 21861309 : move32();
189 :
190 : /* folding + pre modulation of DCT IV */
191 21861309 : ir12_fx = L_add( r1_fx, r2_fx ); // Qx - 1
192 21861309 : ii12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1
193 : // cplxMult( &iBuffer_fx[2 * k], &iBuffer_fx[2 * k + 1], ir12_fx, ii12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] );
194 21861309 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3
195 21861309 : move32();
196 21861309 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3
197 21861309 : move32();
198 : }
199 :
200 26721288 : FOR( k = M4; k < M2; k++ )
201 : {
202 : /* prototype filter */
203 21861309 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx
204 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
205 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
206 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
207 21861309 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
208 :
209 21861309 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx
210 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
211 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
212 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
213 21861309 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
214 :
215 21861309 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx
216 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
217 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
218 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
219 21861309 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
220 :
221 21861309 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx
222 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
223 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
224 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
225 21861309 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
226 :
227 : /* folding + pre modulation of DST IV */
228 21861309 : rr12_fx = L_add( r1_fx, r2_fx ); // Qx - 1
229 21861309 : ri12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1
230 : // cplxMult( &rBuffer_fx[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] );
231 21861309 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3
232 21861309 : move32();
233 21861309 : rBuffer_fx[( 2 * k ) + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3
234 21861309 : move32();
235 :
236 : /* folding + pre modulation of DCT IV */
237 21861309 : ir12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1
238 21861309 : ii12_fx = L_add( i1_fx, i2_fx ); // Qx - 1
239 : // cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] );
240 21861309 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3
241 21861309 : move32();
242 21861309 : iBuffer_fx[( 2 * k ) + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3
243 21861309 : move32();
244 : }
245 :
246 : /* FFT of DST IV */
247 4859979 : fft_cldfb_fx( rBuffer_fx, M2 );
248 :
249 :
250 : /* post modulation of DST IV */
251 48582597 : FOR( k = 0; k < M2; k++ )
252 : {
253 : // cplxMult( &realBuffer[i][M1 - 1 - ( 2 * k )], &realBuffer[i][2 * k], rBuffer[2 * k], rBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] );
254 43722618 : realBuffer_fx[i][( M1 - 1 ) - ( k * 2 )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // Qx - 5
255 43722618 : move32();
256 43722618 : realBuffer_fx[i][2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5
257 43722618 : move32();
258 : }
259 :
260 : /* FFT of DCT IV */
261 4859979 : fft_cldfb_fx( iBuffer_fx, M2 );
262 :
263 :
264 : /* post modulation of DCT IV */
265 48582597 : FOR( k = 0; k < M2; k++ )
266 : {
267 : /* do it inplace */
268 : // cplxMult( &imagBuffer[i][2 * k], &imagBuffer[i][M1 - 1 - ( 2 * k )], iBuffer[2 * k], iBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] );
269 43722618 : imagBuffer_fx[i][2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[( 2 * k + 1 )], rot_vctr_im_fx[k] ); // QX - 5
270 43722618 : move32();
271 43722618 : imagBuffer_fx[i][( ( M1 - 1 ) - ( k * 2 ) )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5
272 43722618 : move32();
273 : }
274 :
275 4859979 : timeBuffer_fx += i_mult( L2, 5 );
276 4859979 : timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
277 : }
278 :
279 : /* update memory */
280 343170 : Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
281 :
282 343170 : return;
283 : }
284 :
285 : /*-------------------------------------------------------------------*
286 : * cldfbAnalysis_ts_ivas()
287 : *
288 : *
289 : *--------------------------------------------------------------------*/
290 0 : void cldfbAnalysis_ts_fx(
291 : const Word32 *timeIn_fx,
292 : /* i : time buffer */ // q
293 : Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
294 : /* o : real value buffer */ // q - 5
295 : Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
296 : /* o : imag value buffer */ // q - 5
297 : const Word16 samplesToProcess, /* i : samples to process */
298 : HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */
299 : Word16 *q_cldfb )
300 : {
301 : Word16 i, k;
302 : Word16 L2, M1, M2, M4;
303 0 : Word16 no_col = h_cldfb->no_col;
304 0 : move16();
305 :
306 : Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
307 : Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
308 : Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
309 : Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
310 : const Word32 *rot_vctr_re_fx;
311 : const Word32 *rot_vctr_im_fx;
312 : const Word32 *rot_vctr_delay_re_fx;
313 : const Word32 *rot_vctr_delay_im_fx;
314 : const Word32 *ptr_pf_fx;
315 : Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
316 : Word16 offset, frameSize;
317 :
318 0 : offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
319 0 : frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
320 :
321 : /* prepare input buffer */
322 0 : timeBuffer_fx = buffer_fx;
323 0 : Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
324 :
325 0 : IF( GT_16( samplesToProcess, -1 ) )
326 : {
327 0 : Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
328 0 : set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
329 : }
330 : ELSE
331 : {
332 0 : Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
333 : }
334 :
335 0 : h_cldfb->Q_cldfb_state = *q_cldfb;
336 0 : move16();
337 :
338 : /* only process needed cols */
339 0 : IF( GT_16( samplesToProcess, -1 ) )
340 : {
341 0 : no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
342 0 : assert( no_col == 1 );
343 : }
344 :
345 0 : M1 = h_cldfb->no_channels;
346 0 : move16();
347 0 : M2 = shr( M1, 1 );
348 0 : M4 = shr( M1, 2 );
349 0 : L2 = shl( M1, 1 );
350 :
351 0 : if ( s_and( M2, 1 ) )
352 : {
353 0 : M4 = add( M4, 1 );
354 : }
355 :
356 0 : rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; // q = 29
357 0 : rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx; // q = 29
358 0 : rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
359 0 : rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
360 :
361 0 : ptr_pf_fx = h_cldfb->p_filter_32;
362 0 : move16();
363 :
364 0 : FOR( i = 0; i < no_col; i++ )
365 : {
366 0 : FOR( k = 0; k < M4; k++ )
367 : {
368 : /* prototype filter */
369 0 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] ); // q
370 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
371 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
372 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
373 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
374 :
375 0 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q
376 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
377 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
378 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
379 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
380 :
381 0 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
382 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
383 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
384 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
385 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
386 :
387 0 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
388 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
389 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
390 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
391 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
392 :
393 : /* folding + pre modulation of DST IV */
394 0 : rr12_fx = L_sub( r1_fx, r2_fx ); // q -1
395 0 : ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
396 : /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
397 0 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3
398 0 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
399 0 : move32();
400 0 : move32();
401 :
402 : ///* folding + pre modulation of DCT IV */
403 0 : ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
404 0 : ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
405 : /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
406 0 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3
407 0 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
408 0 : move32();
409 0 : move32();
410 : }
411 :
412 0 : FOR( k = M4; k < M2; k++ )
413 : {
414 : /* prototype filter */
415 0 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
416 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
417 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
418 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
419 0 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
420 :
421 0 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
422 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
423 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
424 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
425 0 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
426 :
427 0 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
428 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
429 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
430 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
431 0 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
432 :
433 0 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
434 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
435 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
436 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
437 0 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
438 :
439 : /* folding + pre modulation of DST IV */
440 0 : rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
441 0 : ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
442 : /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
443 0 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3
444 0 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
445 0 : move32();
446 0 : move32();
447 :
448 : /* folding + pre modulation of DCT IV */
449 0 : ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
450 0 : ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
451 : /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
452 0 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3
453 0 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
454 0 : move32();
455 0 : move32();
456 : }
457 :
458 0 : *q_cldfb = sub( *q_cldfb, 3 );
459 0 : move16();
460 :
461 : /* FFT of DST IV */
462 : Word16 q_shift;
463 0 : q_shift = sub( s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) ), find_guarded_bits_fx( M2 ) );
464 0 : *q_cldfb = add( *q_cldfb, q_shift );
465 0 : move16();
466 0 : FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
467 : {
468 0 : rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift );
469 0 : move32();
470 : }
471 0 : FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
472 : {
473 0 : iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift );
474 0 : move32();
475 : }
476 0 : fft_cldfb_fx( rBuffer_fx, M2 );
477 :
478 0 : *q_cldfb = sub( *q_cldfb, 2 );
479 0 : move16();
480 :
481 : /* FFT of DCT IV */
482 0 : fft_cldfb_fx( iBuffer_fx, M2 );
483 :
484 0 : q_shift = s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) );
485 0 : *q_cldfb = add( *q_cldfb, q_shift );
486 0 : move16();
487 0 : FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
488 : {
489 0 : rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift );
490 0 : move32();
491 : }
492 0 : FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
493 : {
494 0 : iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift );
495 0 : move32();
496 : }
497 :
498 : /* post modulation of DST IV */
499 0 : FOR( k = 0; k < M2; k++ )
500 : {
501 : /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
502 0 : realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
503 0 : realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
504 0 : move32();
505 0 : move32();
506 : }
507 :
508 : /* post modulation of DCT IV */
509 0 : FOR( k = 0; k < M2; k++ )
510 : {
511 : /* do it inplace */
512 : /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
513 0 : imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
514 0 : imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
515 0 : move32();
516 0 : move32();
517 : }
518 :
519 0 : IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
520 : {
521 : /* rotation due to delay*/
522 : /*if(h_cldfb->da != M1)*/
523 0 : IF( rot_vctr_delay_re_fx != NULL )
524 : {
525 0 : FOR( k = 0; k < M1; k++ )
526 : {
527 : Word32 cplx_aux_fx;
528 : /* delay */
529 : /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
530 : sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
531 : /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
532 : /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
533 : /*realBuffer[k] = rBuffer[k];
534 : imagBuffer[k] = iBuffer[k];*/
535 0 : cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5
536 0 : imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5
537 0 : realBuffer_fx[k] = cplx_aux_fx;
538 0 : move32();
539 0 : move32();
540 : }
541 : }
542 : }
543 :
544 0 : timeBuffer_fx += i_mult( L2, 5 );
545 0 : timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
546 : }
547 :
548 : /* update memory */
549 0 : IF( GT_16( samplesToProcess, -1 ) )
550 : {
551 0 : Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
552 : }
553 : ELSE
554 : {
555 0 : Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
556 : }
557 :
558 0 : return;
559 : }
560 :
561 48608 : void cldfbAnalysis_ts_fx_var_q(
562 : const Word32 *timeIn_fx,
563 : /* i : time buffer */ // q
564 : Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
565 : /* o : real value buffer */ // q_cldfb - 5
566 : Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
567 : /* o : imag value buffer */ // q_cldfb - 5
568 : const Word16 samplesToProcess, /* i : samples to process */
569 : HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */
570 : Word16 *q_cldfb )
571 :
572 : {
573 : Word16 i, k;
574 : Word16 L2, M1, M2, M4;
575 48608 : Word16 no_col = h_cldfb->no_col;
576 48608 : move16();
577 : Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
578 : Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
579 : Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
580 : Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
581 : const Word32 *rot_vctr_re_fx;
582 : const Word32 *rot_vctr_im_fx;
583 : const Word32 *rot_vctr_delay_re_fx;
584 : const Word32 *rot_vctr_delay_im_fx;
585 : const Word32 *ptr_pf_fx;
586 : Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
587 : Word16 offset, frameSize;
588 :
589 48608 : offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
590 48608 : frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
591 :
592 : /* prepare input buffer */
593 48608 : timeBuffer_fx = buffer_fx;
594 48608 : Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
595 :
596 48608 : IF( GT_16( samplesToProcess, -1 ) )
597 : {
598 48608 : Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
599 48608 : set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
600 : }
601 : ELSE
602 : {
603 0 : Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
604 : }
605 :
606 48608 : IF( NE_16( h_cldfb->Q_cldfb_state, *q_cldfb ) )
607 : {
608 930 : Word16 norm_st = L_norm_arr( timeBuffer_fx, offset );
609 930 : IF( GE_16( norm_st, sub( *q_cldfb, h_cldfb->Q_cldfb_state ) ) )
610 : {
611 930 : scale_sig32( timeBuffer_fx, offset, sub( *q_cldfb, h_cldfb->Q_cldfb_state ) );
612 : /* cldfb_state will get updated at end of processing with values whose q is same as
613 : * *q_cldfb.
614 : */
615 930 : h_cldfb->Q_cldfb_state = *q_cldfb;
616 930 : move16();
617 : }
618 : ELSE
619 : {
620 0 : scale_sig32( &timeBuffer_fx[offset], frameSize, sub( h_cldfb->Q_cldfb_state, *q_cldfb ) );
621 0 : *q_cldfb = h_cldfb->Q_cldfb_state;
622 0 : move16();
623 : }
624 : }
625 :
626 : /* only process needed cols */
627 48608 : IF( GT_16( samplesToProcess, -1 ) )
628 : {
629 48608 : no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
630 48608 : assert( no_col == 1 );
631 : }
632 :
633 48608 : M1 = h_cldfb->no_channels;
634 48608 : M2 = shr( M1, 1 );
635 48608 : M4 = shr( M1, 2 );
636 48608 : L2 = shl( M1, 1 );
637 48608 : move16();
638 :
639 48608 : if ( s_and( M2, 1 ) )
640 : {
641 0 : M4 = add( M4, 1 );
642 : }
643 :
644 48608 : rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; // q = 29
645 48608 : rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx; // q = 29
646 48608 : rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
647 48608 : rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
648 :
649 48608 : ptr_pf_fx = h_cldfb->p_filter_32;
650 48608 : move16();
651 :
652 97216 : FOR( i = 0; i < no_col; i++ )
653 : {
654 777728 : FOR( k = 0; k < M4; k++ )
655 : {
656 : /* prototype filter */
657 729120 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
658 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
659 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
660 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
661 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
662 :
663 729120 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q
664 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
665 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
666 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
667 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
668 :
669 729120 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
670 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
671 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
672 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
673 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
674 :
675 729120 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
676 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
677 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
678 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
679 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
680 :
681 : /* folding + pre modulation of DST IV */
682 729120 : rr12_fx = L_sub( r1_fx, r2_fx ); // q -1
683 729120 : ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
684 : /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
685 729120 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3
686 729120 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
687 729120 : move32();
688 729120 : move32();
689 :
690 : ///* folding + pre modulation of DCT IV */
691 729120 : ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
692 729120 : ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
693 : /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
694 729120 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3
695 729120 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
696 729120 : move32();
697 729120 : move32();
698 : }
699 :
700 777728 : FOR( k = M4; k < M2; k++ )
701 : {
702 : /* prototype filter */
703 729120 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
704 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
705 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
706 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
707 729120 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
708 :
709 729120 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
710 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
711 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
712 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
713 729120 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
714 :
715 729120 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
716 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
717 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
718 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
719 729120 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
720 :
721 729120 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
722 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
723 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
724 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
725 729120 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
726 :
727 :
728 : /* folding + pre modulation of DST IV */
729 729120 : rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
730 729120 : ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
731 : /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
732 729120 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3
733 729120 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
734 729120 : move32();
735 729120 : move32();
736 :
737 : /* folding + pre modulation of DCT IV */
738 729120 : ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
739 729120 : ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
740 : /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
741 729120 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3
742 729120 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
743 729120 : move32();
744 729120 : move32();
745 : }
746 :
747 48608 : *q_cldfb = sub( *q_cldfb, 3 );
748 48608 : move16();
749 :
750 : /* FFT of DST IV */
751 48608 : fft_cldfb_fx( rBuffer_fx, M2 );
752 :
753 : /* post modulation of DST IV */
754 1506848 : FOR( k = 0; k < M2; k++ )
755 : {
756 : /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
757 1458240 : realBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
758 1458240 : realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
759 1458240 : move32();
760 1458240 : move32();
761 : }
762 48608 : *q_cldfb = sub( *q_cldfb, 2 );
763 48608 : move16();
764 :
765 : /* FFT of DCT IV */
766 48608 : fft_cldfb_fx( iBuffer_fx, M2 );
767 :
768 : /* post modulation of DCT IV */
769 1506848 : FOR( k = 0; k < M2; k++ )
770 : {
771 : /* do it inplace */
772 : /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
773 1458240 : imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
774 1458240 : imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
775 1458240 : move32();
776 1458240 : move32();
777 : }
778 :
779 48608 : IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
780 : {
781 : /* rotation due to delay*/
782 : /*if(h_cldfb->da != M1)*/
783 48608 : IF( rot_vctr_delay_re_fx != NULL )
784 : {
785 2965088 : FOR( k = 0; k < M1; k++ )
786 : {
787 : Word32 cplx_aux_fx;
788 : /* delay */
789 : /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
790 : sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
791 : /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
792 : /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
793 : /*realBuffer[k] = rBuffer[k];
794 : imagBuffer[k] = iBuffer[k];*/
795 2916480 : cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5
796 2916480 : imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5
797 2916480 : realBuffer_fx[k] = cplx_aux_fx;
798 2916480 : move32();
799 2916480 : move32();
800 : }
801 : }
802 : }
803 :
804 48608 : timeBuffer_fx += i_mult( L2, 5 );
805 48608 : timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
806 : }
807 :
808 : /* update memory */
809 48608 : IF( GT_16( samplesToProcess, -1 ) )
810 : {
811 48608 : Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
812 : }
813 : ELSE
814 : {
815 0 : Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
816 : }
817 :
818 48608 : return;
819 : }
820 :
821 :
822 12154056 : void cldfbAnalysis_ts_fx_fixed_q(
823 : const Word32 *timeIn_fx,
824 : /* i : time buffer */ // q
825 : Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
826 : /* o : real value buffer */ // q - 5
827 : Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
828 : /* o : imag value buffer */ // q - 5
829 : const Word16 samplesToProcess, /* i : samples to process */
830 : HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */
831 : Word16 *q_cldfb )
832 : {
833 : Word16 i, k;
834 : Word16 L2, M1, M2, M4;
835 12154056 : Word16 no_col = h_cldfb->no_col;
836 12154056 : move16();
837 : Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
838 : Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
839 : Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
840 : Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
841 : const Word32 *rot_vctr_re_fx;
842 : const Word32 *rot_vctr_im_fx;
843 : const Word32 *rot_vctr_delay_re_fx;
844 : const Word32 *rot_vctr_delay_im_fx;
845 : const Word32 *ptr_pf_fx;
846 : Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
847 : Word16 offset, frameSize, gb, hr, shift;
848 :
849 12154056 : offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
850 12154056 : frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
851 :
852 : /* prepare input buffer */
853 12154056 : timeBuffer_fx = buffer_fx;
854 12154056 : Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
855 12154056 : h_cldfb->Q_cldfb_state = *q_cldfb;
856 12154056 : move16();
857 :
858 12154056 : IF( GT_16( samplesToProcess, -1 ) )
859 : {
860 12154056 : Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
861 12154056 : set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
862 : }
863 : ELSE
864 : {
865 0 : Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
866 : }
867 :
868 : /* only process needed cols */
869 12154056 : IF( GT_16( samplesToProcess, -1 ) )
870 : {
871 12154056 : no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
872 12154056 : assert( no_col == 1 );
873 : }
874 :
875 12154056 : M1 = h_cldfb->no_channels;
876 12154056 : M2 = shr( M1, 1 );
877 12154056 : M4 = shr( M1, 2 );
878 12154056 : L2 = shl( M1, 1 );
879 12154056 : move16();
880 :
881 12154056 : if ( s_and( M2, 1 ) )
882 : {
883 0 : M4 = add( M4, 1 );
884 : }
885 :
886 12154056 : rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; // q = 29
887 12154056 : rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx; // q = 29
888 12154056 : rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
889 12154056 : rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
890 :
891 12154056 : ptr_pf_fx = h_cldfb->p_filter_32;
892 12154056 : move16();
893 :
894 24308112 : FOR( i = 0; i < no_col; i++ )
895 : {
896 167379464 : FOR( k = 0; k < M4; k++ )
897 : {
898 : /* prototype filter */
899 155225408 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
900 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
901 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
902 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
903 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
904 :
905 155225408 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q
906 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
907 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
908 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
909 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
910 :
911 155225408 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
912 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
913 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
914 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
915 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
916 :
917 155225408 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
918 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
919 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
920 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
921 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
922 :
923 : /* folding + pre modulation of DST IV */
924 155225408 : rr12_fx = L_sub( r1_fx, r2_fx ); // q -1
925 155225408 : ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
926 : /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
927 155225408 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3
928 155225408 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
929 155225408 : move32();
930 155225408 : move32();
931 :
932 : ///* folding + pre modulation of DCT IV */
933 155225408 : ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
934 155225408 : ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
935 : /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
936 155225408 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3
937 155225408 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
938 155225408 : move32();
939 155225408 : move32();
940 : }
941 :
942 167379464 : FOR( k = M4; k < M2; k++ )
943 : {
944 : /* prototype filter */
945 155225408 : r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
946 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
947 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
948 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
949 155225408 : r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
950 :
951 155225408 : r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
952 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
953 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
954 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
955 155225408 : r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
956 :
957 155225408 : i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q
958 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
959 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
960 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
961 155225408 : i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
962 :
963 155225408 : i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q
964 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
965 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
966 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
967 155225408 : i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
968 :
969 : /* folding + pre modulation of DST IV */
970 155225408 : rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
971 155225408 : ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
972 : /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
973 155225408 : rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3
974 155225408 : rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
975 155225408 : move32();
976 155225408 : move32();
977 :
978 : /* folding + pre modulation of DCT IV */
979 155225408 : ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
980 155225408 : ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
981 : /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
982 155225408 : iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3
983 155225408 : iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
984 155225408 : move32();
985 155225408 : move32();
986 : }
987 :
988 12154056 : *q_cldfb = sub( *q_cldfb, 3 );
989 12154056 : move16();
990 :
991 : /* FFT of DST IV */
992 12154056 : fft_cldfb_fx( rBuffer_fx, M2 );
993 :
994 : /* post modulation of DST IV */
995 322604872 : FOR( k = 0; k < M2; k++ )
996 : {
997 : /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
998 310450816 : realBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
999 310450816 : realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
1000 310450816 : move32();
1001 310450816 : move32();
1002 : }
1003 12154056 : *q_cldfb = sub( *q_cldfb, 2 );
1004 12154056 : move16();
1005 :
1006 12154056 : gb = find_guarded_bits_fx( M1 );
1007 12154056 : hr = L_norm_arr( iBuffer_fx, M1 );
1008 :
1009 12154056 : IF( LT_16( hr, gb ) )
1010 : {
1011 11601 : scale_sig32( iBuffer_fx, M1, sub( hr, gb ) );
1012 : }
1013 :
1014 : /* FFT of DCT IV */
1015 12154056 : fft_cldfb_fx( iBuffer_fx, M2 );
1016 :
1017 : /* post modulation of DCT IV */
1018 12154056 : IF( LT_16( hr, gb ) )
1019 : {
1020 11601 : shift = sub( gb, hr );
1021 259961 : FOR( k = 0; k < M2; k++ )
1022 : {
1023 : /* do it inplace */
1024 : /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
1025 248360 : imagBuffer_fx[2 * k] = L_shl( Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ), shift ); // q - 5
1026 248360 : imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_shl( Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ), shift ); // q - 5
1027 248360 : move32();
1028 248360 : move32();
1029 : }
1030 : }
1031 : ELSE
1032 : {
1033 322344911 : FOR( k = 0; k < M2; k++ )
1034 : {
1035 : /* do it inplace */
1036 : /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
1037 310202456 : imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
1038 310202456 : imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
1039 310202456 : move32();
1040 310202456 : move32();
1041 : }
1042 : }
1043 :
1044 12154056 : IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1045 : {
1046 : /* rotation due to delay*/
1047 : /*if(h_cldfb->da != M1)*/
1048 12154056 : IF( rot_vctr_delay_re_fx != NULL )
1049 : {
1050 633055688 : FOR( k = 0; k < M1; k++ )
1051 : {
1052 : Word32 cplx_aux_fx;
1053 : /* delay */
1054 : /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
1055 : sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
1056 : /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
1057 : /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
1058 : /*realBuffer[k] = rBuffer[k];
1059 : imagBuffer[k] = iBuffer[k];*/
1060 620901632 : cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5
1061 620901632 : imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5
1062 620901632 : realBuffer_fx[k] = cplx_aux_fx;
1063 620901632 : move32();
1064 620901632 : move32();
1065 : }
1066 : }
1067 : }
1068 :
1069 12154056 : timeBuffer_fx += i_mult( L2, 5 );
1070 12154056 : timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
1071 : }
1072 :
1073 : /* update memory */
1074 12154056 : IF( GT_16( samplesToProcess, -1 ) )
1075 : {
1076 12154056 : Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
1077 : }
1078 : ELSE
1079 : {
1080 0 : Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
1081 : }
1082 :
1083 12154056 : return;
1084 : }
1085 :
1086 : /*-------------------------------------------------------------------*
1087 : * cldfbSynthesis_ivas()
1088 : *
1089 : * Conduct inverse multple overlap cmplex low delay MDCT
1090 : *--------------------------------------------------------------------*/
1091 12032585 : void cldfbSynthesis_ivas_fx(
1092 : Word32 **realBuffer_fx, /* i : real values Qx*/
1093 : Word32 **imagBuffer_fx, /* i : imag values Qx*/
1094 : Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/
1095 : const Word16 samplesToProcess, /* i : number of processed samples */
1096 : const Word16 shift, /* i : scale for state buffer */
1097 : const Word16 out_shift, /* i : scale for output buffer */
1098 : HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */
1099 : )
1100 : {
1101 : Word16 i;
1102 : Word16 k;
1103 : Word16 L2;
1104 : Word16 M1;
1105 : Word16 M2;
1106 : Word16 M41;
1107 : Word16 M42;
1108 : Word16 Mz;
1109 :
1110 : Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
1111 : Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
1112 : const Word32 *rot_vctr_re_fx;
1113 : const Word32 *rot_vctr_im_fx;
1114 : const Word32 *rot_vctr_delay_re_fx;
1115 : const Word32 *rot_vctr_delay_im_fx;
1116 : Word32 rr12_fx, ir12_fx;
1117 : Word32 ri12_fx, ii12_fx;
1118 :
1119 : Word32 *synthesisBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 10 * CLDFB_NO_CHANNELS_MAX )];
1120 : Word32 new_samples_fx[2 * CLDFB_NO_CHANNELS_MAX];
1121 :
1122 : Word32 *ptr_time_out_fx;
1123 : const Word32 *p_filter_32;
1124 :
1125 : Word32 accu0, accu1, accu2, accu3, accu4;
1126 12032585 : Word16 no_col = h_cldfb->no_col;
1127 12032585 : move16();
1128 :
1129 12032585 : M1 = h_cldfb->no_channels;
1130 12032585 : move16();
1131 12032585 : L2 = shl( M1, 1 );
1132 12032585 : M2 = shr( M1, 1 );
1133 12032585 : M41 = shr( M2, 1 );
1134 12032585 : M42 = sub( M2, M41 );
1135 12032585 : Mz = sub( M1, h_cldfb->bandsToZero );
1136 :
1137 : /* only process needed cols */
1138 12032585 : IF( GT_16( samplesToProcess, -1 ) )
1139 : {
1140 11892937 : no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
1141 11892937 : move16();
1142 : }
1143 :
1144 12032585 : rot_vctr_re_fx = h_cldfb->rot_vec_syn_re_fx;
1145 12032585 : rot_vctr_im_fx = h_cldfb->rot_vec_syn_im_fx;
1146 :
1147 12032585 : rot_vctr_delay_re_fx = h_cldfb->rot_vec_syn_delay_re_fx;
1148 12032585 : rot_vctr_delay_im_fx = h_cldfb->rot_vec_syn_delay_im_fx;
1149 :
1150 12032585 : synthesisBuffer_fx = buffer_fx;
1151 12032585 : Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + i_mult( M1, no_col ), h_cldfb->p_filter_length );
1152 :
1153 12032585 : p_filter_32 = h_cldfb->p_filter_32;
1154 12032585 : ptr_time_out_fx = timeOut_fx;
1155 :
1156 : /*synthesisBuffer += M1 * h_cldfb->no_col;*/
1157 12032585 : synthesisBuffer_fx += i_mult( M1, no_col );
1158 :
1159 29992862 : FOR( k = 0; k < no_col; k++ )
1160 : {
1161 17960277 : IF( EQ_16( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1162 : {
1163 : /* rotation due to delay*/
1164 : /*if(h_cldfb->ds != M1)*/
1165 15296591 : IF( rot_vctr_delay_re_fx != NULL )
1166 : {
1167 821094011 : FOR( i = 0; i < M1; i++ )
1168 : {
1169 : Word32 cplx_aux;
1170 : /* delay */
1171 : /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], cos((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)),
1172 : sin((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)));*/
1173 : /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
1174 : /*cplxMult(&realBuffer[k][i], &imagBuffer[k][i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
1175 805797420 : cplx_aux = Msub_32_32( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_re_fx[i] ), imagBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ); // Qx
1176 805797420 : imagBuffer_fx[k][i] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ), imagBuffer_fx[k][i], rot_vctr_delay_re_fx[i] );
1177 805797420 : move32();
1178 805797420 : realBuffer_fx[k][i] = cplx_aux;
1179 805797420 : move32();
1180 : /*realBuffer[k][i] = rBuffer[i];*/
1181 : /*imagBuffer[k][i] = iBuffer[i];*/
1182 : }
1183 : }
1184 : }
1185 93754845 : FOR( i = Mz; i < M1; i++ )
1186 : {
1187 75794568 : realBuffer_fx[k][i] = 0;
1188 75794568 : move32();
1189 75794568 : imagBuffer_fx[k][i] = 0;
1190 75794568 : move32();
1191 : }
1192 :
1193 488682177 : FOR( i = 0; i < M2; i++ )
1194 : {
1195 : /* pre modulation of DST IV */
1196 : /*cplxMult(&rBuffer[2*i], &rBuffer[2*i+1], realBuffer[k][2*i], realBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/
1197 470721900 : rBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_re_fx[i] ), realBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[i] ); // Qx
1198 470721900 : move32();
1199 470721900 : rBuffer_fx[2 * i + 1] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ), realBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[i] ); // Qx
1200 470721900 : move32();
1201 :
1202 : /* pre modulation of DCT IV */
1203 : /*cplxMult(&iBuffer[2*i], &iBuffer[2*i+1],-imagBuffer[k][2*i], imagBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/
1204 470721900 : iBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_re_fx[i] ), imagBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[i] ); // Qx
1205 470721900 : move32();
1206 470721900 : iBuffer_fx[2 * i + 1] = Msub_32_32( Mpy_32_32( imagBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[i] ), imagBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ); // Qx
1207 470721900 : move32();
1208 : }
1209 :
1210 : /* FFT of DST IV */
1211 17960277 : fft_cldfb_fx( rBuffer_fx, M2 );
1212 :
1213 : /* FFT of DCT IV */
1214 17960277 : fft_cldfb_fx( iBuffer_fx, M2 );
1215 :
1216 : /* folding */
1217 253321227 : FOR( i = 0; i < M41; i++ )
1218 : {
1219 : /* post modulation of DST IV */
1220 235360950 : rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ), rBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ); // Qx
1221 235360950 : ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ), rBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ); // Qx
1222 :
1223 : /* post modulation of DCT IV */
1224 235360950 : ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ), iBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ); // Qx
1225 235360950 : ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ), iBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ); // Qx
1226 :
1227 235360950 : new_samples_fx[M1 + M2 + 1 + 2 * i] = L_negate( L_add( rr12_fx, ii12_fx ) ); // Qx
1228 235360950 : move32();
1229 235360950 : new_samples_fx[M2 - 2 - 2 * i] = L_negate( L_add( ri12_fx, ir12_fx ) ); // Qx
1230 235360950 : move32();
1231 :
1232 235360950 : new_samples_fx[M1 + M2 - 2 - 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx
1233 235360950 : move32();
1234 235360950 : new_samples_fx[M2 + 1 + 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx
1235 235360950 : move32();
1236 : }
1237 :
1238 253321227 : FOR( i = 0; i < M42; i++ )
1239 : {
1240 : /* post modulation of DST IV */
1241 235360950 : rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_re_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx
1242 235360950 : ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_im_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx
1243 :
1244 : /* post modulation of DCT IV */
1245 235360950 : ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_re_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx
1246 235360950 : ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_im_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx
1247 :
1248 235360950 : new_samples_fx[M1 + M2 + 2 * i] = L_add( ri12_fx, ir12_fx ); // Qx
1249 235360950 : move32();
1250 235360950 : new_samples_fx[M2 - 1 - 2 * i] = L_add( rr12_fx, ii12_fx ); // Qx
1251 235360950 : move32();
1252 :
1253 235360950 : new_samples_fx[M1 + M2 - 1 - 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx
1254 235360950 : move32();
1255 235360950 : new_samples_fx[M2 + 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx
1256 235360950 : move32();
1257 : }
1258 :
1259 : /* synthesis prototype filter */
1260 17960277 : IF( 0 == shift )
1261 : {
1262 999448877 : FOR( i = 0; i < L2; i++ )
1263 : {
1264 990228720 : accu0 = Madd_32_32( synthesisBuffer_fx[i], new_samples_fx[L2 - 1 - i], p_filter_32[i] ); // Qx - 1
1265 990228720 : accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 1 * L2 + i )] ); // Qx - 1
1266 990228720 : accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 2 * L2 + i )] ); // Qx - 1
1267 990228720 : accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 3 * L2 + i )] ); // Qx - 1
1268 990228720 : accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 4 * L2 + i )] ); // Qx - 1
1269 :
1270 990228720 : synthesisBuffer_fx[i] = accu0;
1271 990228720 : move32();
1272 990228720 : synthesisBuffer_fx[1 * L2 + i] = accu1;
1273 990228720 : move32();
1274 990228720 : synthesisBuffer_fx[2 * L2 + i] = accu2;
1275 990228720 : move32();
1276 990228720 : synthesisBuffer_fx[3 * L2 + i] = accu3;
1277 990228720 : move32();
1278 990228720 : synthesisBuffer_fx[4 * L2 + i] = accu4;
1279 990228720 : move32();
1280 : }
1281 : }
1282 : ELSE
1283 : {
1284 :
1285 901399000 : FOR( i = 0; i < L2; i++ )
1286 : {
1287 892658880 : Word32 prod = L_shl_sat( ( new_samples_fx[L2 - 1 - i] ), shift );
1288 892658880 : accu0 = Madd_32_32( synthesisBuffer_fx[i], prod, p_filter_32[i] ); // Qx -1 + shift
1289 892658880 : accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], prod, p_filter_32[( 1 * L2 + i )] ); // Qx -1 + shift
1290 892658880 : accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], prod, p_filter_32[( 2 * L2 + i )] ); // Qx -1 + shift
1291 892658880 : accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], prod, p_filter_32[( 3 * L2 + i )] ); // Qx -1 + shift
1292 892658880 : accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], prod, p_filter_32[( 4 * L2 + i )] ); // Qx -1 + shift
1293 :
1294 892658880 : synthesisBuffer_fx[i] = accu0;
1295 892658880 : move32();
1296 892658880 : synthesisBuffer_fx[1 * L2 + i] = accu1;
1297 892658880 : move32();
1298 892658880 : synthesisBuffer_fx[2 * L2 + i] = accu2;
1299 892658880 : move32();
1300 892658880 : synthesisBuffer_fx[3 * L2 + i] = accu3;
1301 892658880 : move32();
1302 892658880 : synthesisBuffer_fx[4 * L2 + i] = accu4;
1303 892658880 : move32();
1304 : }
1305 : }
1306 :
1307 17960277 : IF( 0 == out_shift )
1308 : {
1309 942749389 : FOR( i = 0; i < M1; i++ )
1310 : {
1311 925180760 : ptr_time_out_fx[( M1 - 1 ) - i] = synthesisBuffer_fx[4 * L2 + M1 + i];
1312 925180760 : move32();
1313 : }
1314 : }
1315 : ELSE
1316 : {
1317 16654688 : FOR( i = 0; i < M1; i++ )
1318 : {
1319 16263040 : ptr_time_out_fx[( M1 - 1 ) - i] = L_shl_sat( synthesisBuffer_fx[4 * L2 + M1 + i], out_shift );
1320 16263040 : move32();
1321 : }
1322 : }
1323 :
1324 17960277 : ptr_time_out_fx += M1;
1325 :
1326 17960277 : synthesisBuffer_fx -= M1;
1327 :
1328 17960277 : set32_fx( synthesisBuffer_fx, 0, M1 );
1329 : }
1330 :
1331 : /* update memory */
1332 12032585 : Copy32( buffer_fx, h_cldfb->cldfb_state_fx, h_cldfb->p_filter_length );
1333 :
1334 12032585 : return;
1335 : }
1336 :
1337 0 : void configureCldfb_ivas_enc_fx(
1338 : HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */
1339 : const Word32 sampling_rate /* i : sampling rate */
1340 : )
1341 : {
1342 :
1343 0 : h_cldfb->no_col = CLDFB_NO_COL_MAX;
1344 0 : h_cldfb->bandsToZero = 0;
1345 0 : h_cldfb->nab = 0;
1346 :
1347 0 : h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) );
1348 0 : h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels );
1349 0 : h_cldfb->zeros = 0;
1350 0 : h_cldfb->anaScalefactor = 0;
1351 0 : h_cldfb->synScalefactor = 0;
1352 0 : h_cldfb->filterScale = 1;
1353 0 : cldfb_init_proto_and_twiddles_enc_fx( h_cldfb );
1354 :
1355 0 : return;
1356 : }
1357 47045 : void configureCldfb_ivas_fx(
1358 : HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */
1359 : const Word32 sampling_rate /* i : sampling rate */
1360 : )
1361 : {
1362 :
1363 47045 : h_cldfb->no_col = CLDFB_NO_COL_MAX;
1364 47045 : move16();
1365 47045 : h_cldfb->bandsToZero = 0;
1366 47045 : move16();
1367 47045 : h_cldfb->nab = 0;
1368 47045 : move16();
1369 :
1370 : // h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f );
1371 47045 : h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) );
1372 47045 : move16();
1373 47045 : h_cldfb->zeros = 0;
1374 47045 : move16();
1375 47045 : h_cldfb->anaScalefactor = 0;
1376 47045 : move16();
1377 47045 : h_cldfb->synScalefactor = 0;
1378 47045 : move16();
1379 47045 : h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels );
1380 47045 : move16();
1381 :
1382 47045 : cldfb_init_proto_and_twiddles( h_cldfb );
1383 :
1384 47045 : return;
1385 : }
1386 : /*-------------------------------------------------------------------*
1387 : * openClfdb()
1388 : *
1389 : * open and configures a CLDFB handle
1390 : *--------------------------------------------------------------------*/
1391 26755 : ivas_error openCldfb_ivas_fx(
1392 : HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */
1393 : CLDFB_TYPE type, /* i : analysis or synthesis */
1394 : const Word32 sampling_rate, /* i : sampling rate */
1395 : CLDFB_PROTOTYPE prototype, /* i : CLDFB version (1.25ms/5ms delay) */
1396 : const Word16 enc_dec ) /* i : encoder/decoder flag */
1397 : {
1398 : HANDLE_CLDFB_FILTER_BANK hs;
1399 : Word16 buf_len;
1400 :
1401 26755 : IF( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL )
1402 : {
1403 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
1404 : }
1405 :
1406 26755 : hs->type = type;
1407 26755 : move32();
1408 26755 : hs->prototype = prototype;
1409 26755 : move32();
1410 26755 : IF( enc_dec == ENC )
1411 : {
1412 0 : configureCldfb_ivas_enc_fx( hs, sampling_rate );
1413 0 : hs->Q_cldfb_state = 0;
1414 : }
1415 : ELSE
1416 : {
1417 26755 : configureCldfb_ivas_fx( hs, sampling_rate );
1418 26755 : hs->Q_cldfb_state = Q11;
1419 : }
1420 26755 : move16();
1421 26755 : hs->memory32 = NULL;
1422 26755 : hs->FilterStates = NULL;
1423 26755 : hs->memory_length = 0;
1424 26755 : move16();
1425 :
1426 26755 : IF( EQ_32( type, CLDFB_ANALYSIS ) )
1427 : {
1428 11542 : buf_len = sub( hs->p_filter_length, hs->no_channels );
1429 : }
1430 : ELSE
1431 : {
1432 15213 : buf_len = hs->p_filter_length;
1433 15213 : move16();
1434 : }
1435 :
1436 26755 : IF( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL )
1437 : {
1438 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
1439 : }
1440 :
1441 26755 : hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer
1442 26755 : move16();
1443 26755 : hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/
1444 26755 : move16();
1445 26755 : set32_fx( hs->cldfb_state_fx, 0, buf_len );
1446 :
1447 26755 : *h_cldfb = hs;
1448 26755 : move16();
1449 :
1450 26755 : return IVAS_ERR_OK;
1451 : }
1452 :
1453 : /*-------------------------------------------------------------------*
1454 : * resampleCldfb_ivas()
1455 : *
1456 : * Change sample rate of filter bank
1457 : *--------------------------------------------------------------------*/
1458 14638 : void resampleCldfb_ivas_fx(
1459 : HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */
1460 : const Word32 newSamplerate )
1461 : {
1462 : Word16 timeOffset;
1463 :
1464 : /* keep old parameters before switching*/
1465 14638 : Word16 timeOffsetold = sub( hs->p_filter_length, hs->no_channels );
1466 :
1467 : /* new settings */
1468 14638 : configureCldfb_ivas_fx( hs, newSamplerate );
1469 :
1470 14638 : timeOffset = sub( hs->p_filter_length, hs->no_channels );
1471 :
1472 : /*low complexity-resampling only stored previous samples that are needed for next frame modulation */
1473 14638 : L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, timeOffset, timeOffsetold );
1474 :
1475 14638 : return;
1476 : }
1477 :
1478 0 : static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */
1479 : Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */
1480 : const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */
1481 : Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */
1482 : Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */
1483 : Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */
1484 : Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */
1485 : Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */
1486 : Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */
1487 : Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */
1488 : Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/
1489 : Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */
1490 : TEC_ENC_HANDLE hTecEnc )
1491 : {
1492 : Word16 j;
1493 : Word16 k;
1494 : Word16 s;
1495 : Word16 sm;
1496 : Word32 nrg;
1497 : Word16 numberColsL;
1498 : Word16 numberBandsM;
1499 : Word16 numberBandsM20;
1500 : Word32 energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
1501 : Word16 energyValuesSumE[CLDFB_NO_CHANNELS_MAX];
1502 : // Word16 freqTable[2] = {20, 40};
1503 : #ifndef ISSUE_1836_replace_overflow_libcom
1504 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
1505 : Flag Overflow = 0;
1506 : move32();
1507 : #endif
1508 : #endif
1509 :
1510 0 : FOR( k = 0; k < numberCols; k++ )
1511 : {
1512 0 : FOR( j = 0; j < numberBands; j++ )
1513 : {
1514 0 : nrg = L_mult0( realValues[k][j], realValues[k][j] ); // Q(2*sf_Values)
1515 0 : nrg = L_mac0( nrg, imagValues[k][j], imagValues[k][j] ); // Q(2*sf_Values)
1516 :
1517 0 : energyValues[k][j] = nrg;
1518 0 : move32();
1519 : }
1520 : }
1521 :
1522 0 : IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL )
1523 : {
1524 : Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX];
1525 : Word16 ScaleX2;
1526 0 : assert( numberCols == CLDFB_NO_COL_MAX );
1527 0 : FOR( j = 0; j < numberCols; j++ )
1528 : {
1529 0 : tempEnergyValuesArry[j] = &energyValues[j][0];
1530 : }
1531 :
1532 0 : ScaleX2 = shl( sf_Values, 1 );
1533 0 : calcHiEnvLoBuff_Fix(
1534 : numberCols,
1535 : freqTable,
1536 : 1,
1537 : tempEnergyValuesArry,
1538 0 : hTecEnc->loBuffer,
1539 0 : hTecEnc->hiTempEnv,
1540 : ScaleX2 );
1541 : }
1542 :
1543 0 : FOR( j = 0; j < numberBands; j++ )
1544 : {
1545 0 : energyValuesSum[j] = 0;
1546 0 : move32();
1547 0 : energyValuesSumE[j] = 31;
1548 0 : move16();
1549 0 : FOR( k = 0; k < CLDFB_NO_COL_MAX; k++ )
1550 : {
1551 0 : nrg = L_shr_r( energyValues[k][j], sub( energyValuesSumE[j], 31 ) ); // Q(2*sf_Values - (energyValuesSumE[j]-31))
1552 0 : IF( LT_32( L_sub( maxWord32, nrg ), energyValuesSum[j] ) )
1553 : {
1554 0 : energyValuesSumE[j] = add( energyValuesSumE[j], 1 );
1555 0 : move16();
1556 0 : energyValuesSum[j] = L_shr_r( energyValuesSum[j], 1 );
1557 0 : move32();
1558 0 : nrg = L_shr_r( nrg, 1 );
1559 : }
1560 0 : energyValuesSum[j] = L_add( energyValuesSum[j], nrg );
1561 0 : move32();
1562 : }
1563 0 : test();
1564 0 : if ( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) )
1565 : {
1566 0 : *energyValuesSum_Exp = energyValuesSumE[j];
1567 0 : move16();
1568 : }
1569 : }
1570 0 : FOR( j = 0; j < numberBands; j++ )
1571 : {
1572 0 : energyValuesSum[j] = L_shr_r( energyValuesSum[j], sub( *energyValuesSum_Exp, energyValuesSumE[j] ) ); // Q(energyValuesSum_Exp - (2*sf_Values))
1573 0 : move32();
1574 : }
1575 0 : *energyValuesSum_Exp = sub( *energyValuesSum_Exp, shl( sf_Values, 1 ) );
1576 0 : move16();
1577 :
1578 0 : IF( GT_16( numberBands, 20 ) )
1579 : {
1580 0 : numberBandsM = s_min( numberBands, 40 );
1581 0 : numberBandsM20 = sub( numberBandsM, 20 );
1582 :
1583 0 : numberColsL = sub( numberCols, numLookahead );
1584 :
1585 : /* sum up CLDFB energy above 8 kHz */
1586 0 : s = BASOP_util_norm_s_bands2shift( i_mult( numberColsL, numberBandsM20 ) );
1587 0 : s = sub( s, 4 );
1588 0 : nrg = 0;
1589 0 : move32();
1590 0 : FOR( k = 0; k < numberColsL; k++ )
1591 : {
1592 0 : FOR( j = 20; j < numberBandsM; j++ )
1593 : {
1594 : #ifdef ISSUE_1836_replace_overflow_libcom
1595 0 : nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) );
1596 : #else
1597 : nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow );
1598 : #endif
1599 : }
1600 : }
1601 :
1602 0 : s = sub( sub( shl( sf_Values, 1 ), 1 ), s );
1603 0 : sm = sub( s_min( s, *sf_energyLookahead ), 1 );
1604 :
1605 0 : *energyHF = L_add( L_shr( nrg, limitScale32( sub( s, sm ) ) ),
1606 0 : L_shr( *energyLookahead, sub( *sf_energyLookahead, sm ) ) ); // Q(31-(-nm))
1607 0 : move32();
1608 :
1609 0 : *energyHF_Exp = negate( sm );
1610 0 : move16();
1611 :
1612 : /* process look-ahead region */
1613 0 : s = BASOP_util_norm_s_bands2shift( i_mult( numLookahead, numberBandsM20 ) );
1614 0 : s = sub( s, 2 );
1615 0 : nrg = 0;
1616 0 : move32();
1617 0 : FOR( k = numberColsL; k < numberCols; k++ )
1618 : {
1619 0 : FOR( j = 20; j < numberBandsM; j++ )
1620 : {
1621 : #ifdef ISSUE_1836_replace_overflow_libcom
1622 0 : nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) );
1623 : #else
1624 : nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow );
1625 : #endif
1626 : }
1627 : }
1628 :
1629 0 : s = sub( shl( sf_Values, 1 ), s );
1630 0 : sm = sub( s_min( s, 44 ), 1 );
1631 : BASOP_SATURATE_WARNING_OFF_EVS
1632 : /* nrg + 6.1e-5f => value 0x40000000, scale 44 */
1633 0 : *energyLookahead = L_add_sat( L_shr_sat( nrg, sub( s, sm ) ),
1634 0 : L_shr_sat( 0x40000000, s_max( -31, s_min( 31, sub( 44, sm ) ) ) ) );
1635 0 : move32();
1636 : BASOP_SATURATE_WARNING_ON_EVS
1637 0 : *sf_energyLookahead = sm;
1638 0 : move16();
1639 :
1640 0 : return;
1641 : }
1642 :
1643 :
1644 0 : *energyHF = 0x40000000;
1645 0 : move32();
1646 0 : *energyHF_Exp = 17;
1647 0 : move16();
1648 : }
1649 :
1650 :
1651 0 : void analysisCldfbEncoder_ivas_fx(
1652 : Encoder_State *st, /* i/o: encoder state structure */
1653 : Word32 *timeIn, /*q11*/
1654 : Word16 timeInq,
1655 : Word16 samplesToProcess,
1656 : Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q(scale.lb_scale)
1657 : Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q(scale.lb_scale)
1658 : Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q15
1659 : Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q15
1660 : Word32 *ppBuf_Ener, // Q(31-enerBuffSum_exp)
1661 : Word16 *enerBuffSum_exp,
1662 : CLDFB_SCALE_FACTOR *scale )
1663 : {
1664 : Word16 i;
1665 : CLDFB_SCALE_FACTOR enerScale;
1666 : Word32 *ppBuf_Real[CLDFB_NO_COL_MAX];
1667 : Word32 *ppBuf_Imag[CLDFB_NO_COL_MAX];
1668 : Word16 *ppBuf_Real16[CLDFB_NO_COL_MAX];
1669 : Word16 *ppBuf_Imag16[CLDFB_NO_COL_MAX];
1670 : Word32 l_timeIn[L_FRAME48k];
1671 0 : Word16 norm_timeIn = s_min( L_norm_arr( timeIn, samplesToProcess ), L_norm_arr( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ) ) );
1672 0 : Word16 guard_bits = find_guarded_bits_fx( shl( samplesToProcess, 1 ) );
1673 0 : Word16 shift = 0;
1674 0 : move16();
1675 :
1676 0 : FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
1677 : {
1678 0 : ppBuf_Real[i] = &realBuffer[i][0];
1679 0 : ppBuf_Imag[i] = &imagBuffer[i][0];
1680 0 : ppBuf_Real16[i] = &realBuffer16[i][0];
1681 0 : ppBuf_Imag16[i] = &imagBuffer16[i][0];
1682 : }
1683 0 : IF( GT_16( guard_bits, norm_timeIn ) )
1684 : {
1685 0 : shift = sub( guard_bits, norm_timeIn );
1686 0 : v_shr_32( timeIn, l_timeIn, samplesToProcess, shift );
1687 0 : scale_sig32( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ), negate( shift ) );
1688 : }
1689 : ELSE
1690 : {
1691 0 : Copy32( timeIn, l_timeIn, samplesToProcess );
1692 : }
1693 :
1694 0 : cldfbAnalysis_ivas_fx( l_timeIn, ppBuf_Real, ppBuf_Imag, samplesToProcess, st->cldfbAnaEnc );
1695 :
1696 0 : IF( GT_16( guard_bits, norm_timeIn ) )
1697 : {
1698 0 : shift = sub( guard_bits, norm_timeIn );
1699 0 : scale_sig32( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ), shift );
1700 : }
1701 :
1702 0 : scale->lb_scale = sub( Q31, sub( sub( timeInq, shift ), Q5 ) );
1703 0 : enerScale.lb_scale = negate( scale->lb_scale );
1704 0 : enerScale.lb_scale16 = sub( Q15, scale->lb_scale );
1705 0 : move16();
1706 0 : move16();
1707 0 : move16();
1708 :
1709 0 : AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 );
1710 :
1711 0 : GetEnergyCldfb_ivas_fx( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc );
1712 :
1713 0 : return;
1714 : }
1715 :
1716 45899 : void deleteCldfb_ivas_fx(
1717 : HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */
1718 : )
1719 : {
1720 45899 : HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb;
1721 :
1722 45899 : test();
1723 45899 : IF( h_cldfb == NULL || *h_cldfb == NULL )
1724 : {
1725 19144 : return;
1726 : }
1727 :
1728 26755 : IF( hs->cldfb_state_fx )
1729 : {
1730 26755 : free( hs->cldfb_state_fx );
1731 : }
1732 :
1733 26755 : IF( hs->FilterStates )
1734 : {
1735 0 : free( hs->FilterStates );
1736 : }
1737 :
1738 26755 : free( hs );
1739 26755 : *h_cldfb = NULL;
1740 :
1741 26755 : return;
1742 : }
1743 :
1744 :
1745 : /*-------------------------------------------------------------------*
1746 : * cldfb_init_proto_and_twiddles()
1747 : *
1748 : * Initializes rom pointer
1749 : *--------------------------------------------------------------------*/
1750 :
1751 47045 : static void cldfb_init_proto_and_twiddles(
1752 : HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
1753 : )
1754 : {
1755 : /*find appropriate set of rotVecs*/
1756 47045 : SWITCH( hs->no_channels )
1757 : {
1758 0 : case 10:
1759 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx;
1760 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx;
1761 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx;
1762 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx;
1763 0 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1764 : {
1765 0 : hs->ds = 10;
1766 0 : hs->da = 10;
1767 0 : hs->rot_vec_ana_delay_re_fx = NULL;
1768 0 : hs->rot_vec_ana_delay_im_fx = NULL;
1769 0 : hs->rot_vec_syn_delay_im_fx = NULL;
1770 0 : hs->rot_vec_syn_delay_re_fx = NULL;
1771 0 : hs->p_filter_32 = CLDFB80_10_fx;
1772 0 : hs->scale = CLDFB80_10_SCALE_FX_Q8;
1773 : }
1774 0 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1775 : {
1776 0 : hs->ds = 40;
1777 0 : hs->da = -20;
1778 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1779 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1780 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1781 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1782 0 : hs->p_filter_32 = LDQMF_10_fx;
1783 0 : hs->scale = LDQMF_10_SCALE_FX_Q8;
1784 : }
1785 0 : BREAK;
1786 :
1787 8605 : case 16:
1788 8605 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx;
1789 8605 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx;
1790 8605 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx;
1791 8605 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx;
1792 8605 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1793 : {
1794 8412 : hs->ds = 20;
1795 8412 : hs->da = 20;
1796 8412 : hs->rot_vec_ana_delay_re_fx = NULL;
1797 8412 : hs->rot_vec_ana_delay_im_fx = NULL;
1798 8412 : hs->rot_vec_syn_delay_im_fx = NULL;
1799 8412 : hs->rot_vec_syn_delay_re_fx = NULL;
1800 8412 : hs->p_filter_32 = CLDFB80_16_fx;
1801 8412 : hs->scale = CLDFB80_16_SCALE_FX_Q8;
1802 : }
1803 193 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1804 : {
1805 193 : hs->ds = 80;
1806 193 : hs->da = -40;
1807 193 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1808 193 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1809 193 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1810 193 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1811 193 : hs->p_filter_32 = LDQMF_16_fx;
1812 193 : hs->scale = LDQMF_16_SCALE_FX_Q8;
1813 : }
1814 8605 : BREAK;
1815 :
1816 13651 : case 20:
1817 13651 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx;
1818 13651 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx;
1819 13651 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx;
1820 13651 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx;
1821 13651 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1822 : {
1823 11894 : hs->ds = 20;
1824 11894 : hs->da = 20;
1825 11894 : hs->rot_vec_ana_delay_re_fx = NULL;
1826 11894 : hs->rot_vec_ana_delay_im_fx = NULL;
1827 11894 : hs->rot_vec_syn_delay_im_fx = NULL;
1828 11894 : hs->rot_vec_syn_delay_re_fx = NULL;
1829 11894 : hs->p_filter_32 = CLDFB80_20_fx;
1830 11894 : hs->scale = CLDFB80_20_SCALE_FX_Q8;
1831 : }
1832 1757 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1833 : {
1834 1757 : hs->ds = 80;
1835 1757 : hs->da = -40;
1836 1757 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1837 1757 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1838 1757 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1839 1757 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1840 1757 : hs->p_filter_32 = LDQMF_20_fx;
1841 1757 : hs->scale = LDQMF_20_SCALE_FX_Q8;
1842 : }
1843 13651 : BREAK;
1844 :
1845 0 : case 30:
1846 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx;
1847 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx;
1848 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx;
1849 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx;
1850 0 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1851 : {
1852 0 : hs->ds = 30;
1853 0 : hs->da = 30;
1854 0 : hs->rot_vec_ana_delay_re_fx = NULL;
1855 0 : hs->rot_vec_ana_delay_im_fx = NULL;
1856 0 : hs->rot_vec_syn_delay_im_fx = NULL;
1857 0 : hs->rot_vec_syn_delay_re_fx = NULL;
1858 0 : hs->p_filter_32 = CLDFB80_30_fx;
1859 0 : hs->scale = CLDFB80_30_SCALE_FX_Q8;
1860 : }
1861 0 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1862 : {
1863 0 : hs->ds = 120;
1864 0 : hs->da = -60;
1865 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1866 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1867 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1868 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1869 0 : hs->p_filter_32 = LDQMF_30_fx;
1870 0 : hs->scale = LDQMF_30_SCALE_FX_Q8;
1871 : }
1872 0 : BREAK;
1873 :
1874 1733 : case 32:
1875 1733 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx;
1876 1733 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx;
1877 1733 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx;
1878 1733 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx;
1879 1733 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1880 : {
1881 1733 : hs->ds = 32;
1882 1733 : hs->da = 32;
1883 1733 : hs->rot_vec_ana_delay_re_fx = NULL;
1884 1733 : hs->rot_vec_ana_delay_im_fx = NULL;
1885 1733 : hs->rot_vec_syn_delay_im_fx = NULL;
1886 1733 : hs->rot_vec_syn_delay_re_fx = NULL;
1887 1733 : hs->p_filter_32 = CLDFB80_32_fx;
1888 1733 : hs->scale = CLDFB80_32_SCALE_FX_Q8;
1889 : }
1890 0 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1891 : {
1892 0 : hs->ds = 160;
1893 0 : hs->da = -80;
1894 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1895 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1896 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1897 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1898 0 : hs->p_filter_32 = LDQMF_32_fx;
1899 0 : hs->scale = LDQMF_32_SCALE_FX_Q8;
1900 : }
1901 1733 : BREAK;
1902 :
1903 5207 : case 40:
1904 5207 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx;
1905 5207 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx;
1906 5207 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx;
1907 5207 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx;
1908 5207 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1909 : {
1910 2964 : hs->ds = 40;
1911 2964 : hs->da = 40;
1912 2964 : hs->rot_vec_ana_delay_re_fx = NULL;
1913 2964 : hs->rot_vec_ana_delay_im_fx = NULL;
1914 2964 : hs->rot_vec_syn_delay_im_fx = NULL;
1915 2964 : hs->rot_vec_syn_delay_re_fx = NULL;
1916 2964 : hs->p_filter_32 = CLDFB80_40_fx;
1917 2964 : hs->scale = CLDFB80_40_SCALE_FX_Q8;
1918 : }
1919 2243 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1920 : {
1921 2243 : hs->ds = 160;
1922 2243 : hs->da = -80;
1923 2243 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1924 2243 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1925 2243 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1926 2243 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1927 2243 : hs->p_filter_32 = LDQMF_40_fx;
1928 2243 : hs->scale = LDQMF_40_SCALE_FX_Q8;
1929 : }
1930 5207 : BREAK;
1931 :
1932 17849 : case 60:
1933 17849 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx;
1934 17849 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx;
1935 17849 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx;
1936 17849 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx;
1937 17849 : IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
1938 : {
1939 9267 : hs->ds = 60;
1940 9267 : hs->da = 60;
1941 9267 : hs->rot_vec_ana_delay_re_fx = NULL;
1942 9267 : hs->rot_vec_ana_delay_im_fx = NULL;
1943 9267 : hs->rot_vec_syn_delay_re_fx = NULL;
1944 9267 : hs->rot_vec_syn_delay_im_fx = NULL;
1945 9267 : hs->p_filter_32 = CLDFB80_60_fx;
1946 9267 : hs->scale = CLDFB80_60_SCALE_FX_Q8;
1947 : }
1948 8582 : ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
1949 : {
1950 8582 : hs->ds = 240;
1951 8582 : hs->da = -120;
1952 8582 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1953 8582 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1954 8582 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
1955 8582 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
1956 8582 : hs->p_filter_32 = LDQMF_60_fx;
1957 8582 : hs->scale = LDQMF_60_SCALE_FX_Q8;
1958 : }
1959 17849 : BREAK;
1960 : }
1961 47045 : move16();
1962 47045 : move16();
1963 47045 : move16();
1964 47045 : move16();
1965 :
1966 47045 : return;
1967 : }
1968 :
1969 0 : static void cldfb_init_proto_and_twiddles_enc_fx(
1970 : HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
1971 : )
1972 : {
1973 : /*find appropriate set of rotVecs*/
1974 0 : SWITCH( hs->no_channels )
1975 : {
1976 0 : case 10:
1977 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx;
1978 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx;
1979 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx;
1980 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx;
1981 0 : hs->rRotVctr = rRotVectr_10;
1982 0 : hs->iRotVctr = iRotVectr_10;
1983 0 : IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
1984 : {
1985 0 : hs->synScalefactor = add( cldfb_synScale[0], hs->filterScale );
1986 0 : move16();
1987 : }
1988 : ELSE
1989 : {
1990 0 : hs->anaScalefactor = add( cldfb_anaScale[0], hs->filterScale );
1991 0 : move16();
1992 : }
1993 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
1994 : {
1995 0 : hs->ds = 10;
1996 0 : hs->da = 10;
1997 0 : move16();
1998 0 : move16();
1999 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2000 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2001 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2002 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2003 0 : hs->scale = cldfb_scale_2_5ms[0];
2004 0 : move16();
2005 0 : move16();
2006 0 : hs->p_filter_32 = CLDFB80_10_fx;
2007 : }
2008 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2009 : {
2010 0 : hs->ds = 40;
2011 0 : hs->da = -20;
2012 0 : move16();
2013 0 : move16();
2014 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2015 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2016 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2017 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2018 0 : hs->p_filter_32 = LDQMF_10_fx;
2019 0 : hs->scale = cldfb_scale_5_0ms[0];
2020 0 : move16();
2021 0 : move16();
2022 : }
2023 0 : BREAK;
2024 :
2025 0 : case 16:
2026 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx;
2027 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx;
2028 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx;
2029 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx;
2030 0 : hs->rRotVctr = rRotVectr_16;
2031 0 : hs->iRotVctr = iRotVectr_16;
2032 : {
2033 0 : hs->anaScalefactor = add( cldfb_anaScale[1], hs->filterScale );
2034 0 : move16();
2035 : }
2036 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
2037 : {
2038 0 : hs->ds = 20;
2039 0 : hs->da = 20;
2040 0 : move16();
2041 0 : move16();
2042 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2043 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2044 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2045 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2046 0 : hs->p_filter_32 = CLDFB80_16_fx;
2047 0 : hs->scale = cldfb_scale_2_5ms[1];
2048 0 : move16();
2049 0 : move16();
2050 : }
2051 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2052 : {
2053 0 : hs->ds = 80;
2054 0 : hs->da = -40;
2055 0 : move16();
2056 0 : move16();
2057 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2058 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2059 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2060 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2061 0 : hs->p_filter_32 = LDQMF_16_fx;
2062 0 : hs->scale = cldfb_scale_5_0ms[1];
2063 0 : move16();
2064 0 : move16();
2065 : }
2066 0 : BREAK;
2067 :
2068 0 : case 20:
2069 :
2070 0 : hs->rRotVctr = rRotVectr_20;
2071 0 : hs->iRotVctr = iRotVectr_20;
2072 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx;
2073 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx;
2074 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx;
2075 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx;
2076 0 : IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
2077 : {
2078 0 : hs->synScalefactor = add( cldfb_synScale[2], hs->filterScale );
2079 0 : move16();
2080 : }
2081 : ELSE
2082 : {
2083 0 : hs->anaScalefactor = add( cldfb_anaScale[2], hs->filterScale );
2084 0 : move16();
2085 : }
2086 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
2087 : {
2088 0 : hs->ds = 20;
2089 0 : hs->da = 20;
2090 0 : move16();
2091 0 : move16();
2092 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2093 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2094 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2095 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2096 0 : hs->p_filter_32 = CLDFB80_20_fx;
2097 0 : hs->scale = cldfb_scale_2_5ms[2];
2098 0 : move16();
2099 0 : move16();
2100 : }
2101 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2102 : {
2103 0 : hs->ds = 80;
2104 0 : hs->da = -40;
2105 0 : move16();
2106 0 : move16();
2107 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2108 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2109 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2110 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2111 0 : hs->p_filter_32 = LDQMF_20_fx;
2112 0 : hs->scale = cldfb_scale_5_0ms[2];
2113 0 : move16();
2114 0 : move16();
2115 : }
2116 0 : BREAK;
2117 :
2118 0 : case 30:
2119 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx;
2120 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx;
2121 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx;
2122 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx;
2123 0 : hs->rRotVctr = rRotVectr_30;
2124 0 : hs->iRotVctr = iRotVectr_30;
2125 0 : IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
2126 : {
2127 0 : hs->synScalefactor = add( cldfb_synScale[6], hs->filterScale );
2128 0 : move16();
2129 : }
2130 : ELSE
2131 : {
2132 0 : hs->anaScalefactor = add( cldfb_anaScale[6], hs->filterScale );
2133 0 : move16();
2134 : }
2135 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
2136 : {
2137 0 : hs->ds = 30;
2138 0 : hs->da = 30;
2139 0 : move16();
2140 0 : move16();
2141 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2142 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2143 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2144 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2145 0 : hs->scale = cldfb_scale_2_5ms[6];
2146 0 : hs->p_filter_32 = CLDFB80_30_fx;
2147 : }
2148 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2149 : {
2150 0 : hs->ds = 120;
2151 0 : hs->da = -60;
2152 0 : move16();
2153 0 : move16();
2154 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2155 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2156 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2157 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2158 0 : hs->scale = cldfb_scale_5_0ms[6];
2159 0 : hs->p_filter_32 = LDQMF_30_fx;
2160 0 : move16();
2161 0 : move16();
2162 : }
2163 0 : BREAK;
2164 :
2165 0 : case 32:
2166 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx;
2167 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx;
2168 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx;
2169 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx;
2170 0 : hs->rRotVctr = rRotVectr_32;
2171 0 : hs->iRotVctr = iRotVectr_32;
2172 : {
2173 0 : hs->anaScalefactor = add( cldfb_anaScale[3], hs->filterScale );
2174 0 : move16();
2175 : }
2176 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
2177 : {
2178 0 : hs->ds = 32;
2179 0 : hs->da = 32;
2180 0 : move16();
2181 0 : move16();
2182 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2183 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2184 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2185 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2186 0 : hs->p_filter_32 = CLDFB80_32_fx;
2187 0 : hs->scale = cldfb_scale_2_5ms[3];
2188 0 : move16();
2189 0 : move16();
2190 : }
2191 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2192 : {
2193 0 : hs->ds = 160;
2194 0 : hs->da = -80;
2195 0 : move16();
2196 0 : move16();
2197 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2198 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2199 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2200 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2201 0 : hs->scale = cldfb_scale_5_0ms[3];
2202 0 : hs->p_filter_32 = LDQMF_32_fx;
2203 0 : move16();
2204 0 : move16();
2205 : }
2206 0 : BREAK;
2207 :
2208 0 : case 40:
2209 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx;
2210 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx;
2211 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx;
2212 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx;
2213 0 : hs->rRotVctr = rRotVectr_40;
2214 0 : hs->iRotVctr = iRotVectr_40;
2215 0 : IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
2216 : {
2217 0 : hs->synScalefactor = add( cldfb_synScale[4], hs->filterScale );
2218 0 : move16();
2219 : }
2220 : ELSE
2221 : {
2222 0 : hs->anaScalefactor = add( cldfb_anaScale[4], hs->filterScale );
2223 0 : move16();
2224 : }
2225 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
2226 : {
2227 0 : hs->ds = 40;
2228 0 : hs->da = 40;
2229 0 : move16();
2230 0 : move16();
2231 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2232 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2233 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2234 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2235 0 : hs->scale = cldfb_scale_2_5ms[4];
2236 0 : hs->p_filter_32 = CLDFB80_40_fx;
2237 0 : move16();
2238 0 : move16();
2239 : }
2240 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2241 : {
2242 0 : hs->ds = 160;
2243 0 : hs->da = -80;
2244 0 : move16();
2245 0 : move16();
2246 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2247 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2248 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2249 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2250 0 : hs->p_filter_32 = LDQMF_40_fx;
2251 0 : hs->scale = cldfb_scale_5_0ms[4];
2252 0 : move16();
2253 0 : move16();
2254 : }
2255 0 : BREAK;
2256 :
2257 0 : case 60:
2258 0 : hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx;
2259 0 : hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx;
2260 0 : hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx;
2261 0 : hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx;
2262 0 : hs->rRotVctr = rRotVectr_60;
2263 0 : hs->iRotVctr = iRotVectr_60;
2264 0 : IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
2265 : {
2266 0 : hs->synScalefactor = add( cldfb_synScale[5], hs->filterScale );
2267 0 : move16();
2268 : }
2269 : ELSE
2270 : {
2271 0 : hs->anaScalefactor = add( cldfb_anaScale[5], hs->filterScale );
2272 0 : move16();
2273 : }
2274 0 : IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
2275 : {
2276 0 : hs->ds = 60;
2277 0 : hs->da = 60;
2278 0 : move16();
2279 0 : move16();
2280 0 : hs->rot_vec_ana_delay_re_fx = NULL;
2281 0 : hs->rot_vec_ana_delay_im_fx = NULL;
2282 0 : hs->rot_vec_syn_delay_re_fx = NULL;
2283 0 : hs->rot_vec_syn_delay_im_fx = NULL;
2284 0 : hs->p_filter_32 = CLDFB80_60_fx;
2285 0 : hs->scale = cldfb_scale_2_5ms[5];
2286 0 : move16();
2287 0 : move16();
2288 : }
2289 0 : ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
2290 : {
2291 0 : hs->ds = 240;
2292 0 : hs->da = -120;
2293 0 : move16();
2294 0 : move16();
2295 0 : hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2296 0 : hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2297 0 : hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
2298 0 : hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
2299 0 : hs->p_filter_32 = LDQMF_60_fx;
2300 0 : hs->scale = cldfb_scale_5_0ms[5];
2301 0 : move16();
2302 0 : move16();
2303 : }
2304 0 : break;
2305 : }
2306 :
2307 0 : return;
2308 : }
2309 : /*-------------------------------------------------------------------*
2310 : * cldfb_save_memory_ivas()
2311 : *
2312 : * Save the memory of filter; to be restored with cldfb_restore_memory_ivas()
2313 : *--------------------------------------------------------------------*/
2314 5806 : ivas_error cldfb_save_memory_ivas_fx(
2315 : HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
2316 : )
2317 : {
2318 5806 : UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
2319 5806 : test();
2320 5806 : IF( hs->memory32 != NULL || ( hs->memory_length != 0 ) )
2321 : {
2322 : /* memory already stored; Free memory first */
2323 0 : return IVAS_ERR_OK;
2324 : }
2325 :
2326 5806 : IF( EQ_16( hs->type, CLDFB_ANALYSIS ) )
2327 : {
2328 2903 : hs->memory_length = offset;
2329 2903 : move16();
2330 : }
2331 : ELSE
2332 : {
2333 2903 : hs->memory_length = hs->p_filter_length;
2334 2903 : move16();
2335 : }
2336 5806 : IF( ( hs->memory32 = (Word32 *) malloc( hs->memory_length * sizeof( Word32 ) ) ) == NULL )
2337 : {
2338 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" );
2339 : }
2340 : /* save the memory */
2341 5806 : Copy32( hs->cldfb_state_fx, hs->memory32, hs->memory_length );
2342 :
2343 5806 : return IVAS_ERR_OK;
2344 : }
2345 :
2346 : /*-------------------------------------------------------------------*
2347 : * cldfb_restore_memory_ivas()
2348 : *
2349 : * Restores the memory of filter; memory to be save by cldfb_save_memory_ivas()
2350 : *--------------------------------------------------------------------*/
2351 5806 : void cldfb_restore_memory_ivas_fx(
2352 : HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
2353 : )
2354 : {
2355 5806 : UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
2356 : UWord16 size;
2357 5806 : test();
2358 5806 : IF( hs->memory32 == NULL || EQ_16( hs->memory_length, 0 ) )
2359 : {
2360 : /* memory not allocated */
2361 0 : return;
2362 : }
2363 :
2364 5806 : IF( hs->type == CLDFB_ANALYSIS )
2365 : {
2366 2903 : size = offset;
2367 2903 : move16();
2368 : }
2369 : ELSE
2370 : {
2371 2903 : size = hs->p_filter_length;
2372 2903 : move16();
2373 : }
2374 :
2375 : /* read the memory */
2376 5806 : Copy32( hs->memory32, hs->cldfb_state_fx, hs->memory_length );
2377 :
2378 : /* adjust sample rate if it was changed in the meanwhile */
2379 5806 : IF( NE_16( hs->memory_length, size ) )
2380 : {
2381 0 : L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, size, hs->memory_length );
2382 : }
2383 5806 : hs->cldfb_state_length = size;
2384 5806 : move16();
2385 5806 : hs->memory_length = 0;
2386 5806 : move16();
2387 5806 : free( hs->memory32 );
2388 5806 : hs->memory32 = NULL;
2389 :
2390 5806 : return;
2391 : }
2392 :
2393 : /*-------------------------------------------------------------------*
2394 : * cldfb_reset_memory_ivas()
2395 : *
2396 : * Resets the memory of filter.
2397 : *--------------------------------------------------------------------*/
2398 1361516 : void cldfb_reset_memory_fx(
2399 : HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
2400 : )
2401 : {
2402 : Word16 memory_length;
2403 1361516 : UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
2404 :
2405 1361516 : IF( hs->type == CLDFB_ANALYSIS )
2406 : {
2407 479777 : memory_length = offset;
2408 479777 : move16();
2409 : }
2410 : ELSE
2411 : {
2412 881739 : memory_length = hs->p_filter_length;
2413 881739 : move16();
2414 : }
2415 :
2416 1361516 : hs->cldfb_state_length = memory_length;
2417 1361516 : move16();
2418 : /* save the memory */
2419 1361516 : set32_fx( hs->cldfb_state_fx, 0, memory_length );
2420 1361516 : hs->Q_cldfb_state = Q11;
2421 1361516 : move16();
2422 :
2423 1361516 : return;
2424 : }
|