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