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