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