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 <stdint.h>
38 : #include "options.h"
39 : #ifdef DEBUGGING
40 : #include "debug.h"
41 : #endif
42 : #include "prot.h"
43 : #include "rom_com.h"
44 : #include "wmc_auto.h"
45 :
46 : /*-----------------------------------------------------------------*
47 : * Local constants
48 : *-----------------------------------------------------------------*/
49 :
50 : #define N_MAX_FFT 1024
51 :
52 : /*---------------------------------------------------------------------*
53 : * ifft_rel()
54 : *
55 : * Calculate the inverse FFT of a real signal
56 : *
57 : * Based on the FORTRAN code from the article "Real-valued Fast Fourier Transform Algorithms"
58 : * by Sorensen, ... in IEEE Trans. on ASSP, Vol. ASSP-35, No. June 6th 1987.
59 : *
60 : * Input: the io[] signal containing the spectrum in the following order :
61 : *
62 : * Re[0], Re[1], .. Re[n/2], Im[n/2-1], .. Im[1]
63 : *---------------------------------------------------------------------*/
64 :
65 1525550 : void ifft_rel(
66 : float io[], /* i/o: input/output vector */
67 : const int16_t n, /* i : vector length */
68 : const int16_t m /* i : log2 of vector length */
69 : )
70 : {
71 : int16_t i, j, k;
72 : int16_t step;
73 : int16_t n2, n4, n8, i0;
74 : int16_t is, id;
75 : float *x, *xi0, *xi1, *xi2, *xi3, *xi4, *xup1, *xdn6, *xup3, *xdn8;
76 : float xt;
77 : float r1;
78 : float t1, t2, t3, t4, t5;
79 : float cc1, cc3, ss1, ss3;
80 : const float *s, *s3, *c, *c3;
81 : const int16_t *idx;
82 : float temp[512];
83 : float n_inv;
84 :
85 1525550 : n_inv = 1.0f / n;
86 :
87 : /*-----------------------------------------------------------------*
88 : * IFFT
89 : *-----------------------------------------------------------------*/
90 :
91 1525550 : x = &io[-1];
92 1525550 : n2 = 2 * n;
93 11090894 : for ( k = 1; k < m; k++ )
94 : {
95 9565344 : is = 0;
96 9565344 : id = n2;
97 9565344 : n2 = n2 >> 1;
98 9565344 : n4 = n2 >> 2;
99 9565344 : n8 = n4 >> 1;
100 30862390 : while ( is < n - 1 )
101 : {
102 21297046 : xi1 = x + is + 1;
103 21297046 : xi2 = xi1 + n4;
104 21297046 : xi3 = xi2 + n4;
105 21297046 : xi4 = xi3 + n4;
106 :
107 164104824 : for ( i = is; i < n; i += id )
108 : {
109 142807778 : t1 = *xi1 - *xi3;
110 142807778 : *xi1 += *xi3;
111 142807778 : *xi2 = 2.0f * *xi2;
112 142807778 : *xi3 = t1 - 2.0f * *xi4;
113 142807778 : *xi4 = t1 + 2.0f * *xi4;
114 142807778 : if ( n4 != 1 )
115 : {
116 71073244 : t1 = ( *( xi2 + n8 ) - *( xi1 + n8 ) ) * INV_SQRT_2;
117 71073244 : t2 = ( *( xi4 + n8 ) + *( xi3 + n8 ) ) * INV_SQRT_2;
118 :
119 71073244 : *( xi1 + n8 ) += *( xi2 + n8 );
120 71073244 : *( xi2 + n8 ) = *( xi4 + n8 ) - *( xi3 + n8 );
121 71073244 : *( xi3 + n8 ) = (float) ( 2.0f * ( -t2 - t1 ) );
122 71073244 : *( xi4 + n8 ) = (float) ( 2.0f * ( -t2 + t1 ) );
123 : }
124 142807778 : xi1 += id;
125 142807778 : xi2 += id;
126 142807778 : xi3 += id;
127 142807778 : xi4 += id;
128 : }
129 21297046 : is = 2 * id - n2;
130 21297046 : id = 4 * id;
131 : }
132 9565344 : step = N_MAX_FFT / n2;
133 : #ifdef FIX_2268_OOB_INDEXING_IN_IFFT
134 9565344 : if ( n8 < 2 )
135 : {
136 3051100 : continue;
137 : }
138 : #endif
139 6514244 : s = sincos_t_ext + step;
140 6514244 : c = s + N_MAX_FFT / 4;
141 6514244 : s3 = sincos_t_ext + 3 * step;
142 6514244 : c3 = s3 + N_MAX_FFT / 4;
143 104652186 : for ( j = 2; j <= n8; j++ )
144 : {
145 98137942 : cc1 = *c;
146 98137942 : ss1 = *s;
147 98137942 : cc3 = *c3;
148 98137942 : ss3 = *s3;
149 :
150 98137942 : is = 0;
151 98137942 : id = 2 * n2;
152 :
153 98137942 : c += step;
154 98137942 : s += step;
155 :
156 98137942 : c3 += 3 * step;
157 98137942 : s3 += 3 * step;
158 219648674 : while ( is < n - 1 )
159 : {
160 121510732 : xup1 = x + j + is;
161 121510732 : xup3 = xup1 + 2 * n4;
162 121510732 : xdn6 = xup3 - 2 * j + 2;
163 121510732 : xdn8 = xdn6 + 2 * n4;
164 :
165 302641730 : for ( i = is; i < n; i += id )
166 : {
167 181130998 : t1 = *xup1 - *xdn6;
168 181130998 : *xup1 = *xup1 + *xdn6;
169 181130998 : xup1 += n4;
170 181130998 : xdn6 -= n4;
171 :
172 181130998 : t2 = *xdn6 - *xup1;
173 181130998 : *xdn6 = *xup1 + *xdn6;
174 :
175 181130998 : xdn6 += n4;
176 181130998 : t3 = *xdn8 + *xup3;
177 181130998 : *xdn6 = *xdn8 - *xup3;
178 :
179 181130998 : xup3 += n4;
180 181130998 : xdn8 -= n4;
181 :
182 181130998 : t4 = *xup3 + *xdn8;
183 181130998 : *xup1 = *xup3 - *xdn8;
184 :
185 181130998 : t5 = t1 - t4;
186 181130998 : t1 = t1 + t4;
187 181130998 : t4 = t2 - t3;
188 181130998 : t2 = t2 + t3;
189 181130998 : *xup3 = t1 * cc3 - t2 * ss3;
190 181130998 : xup3 -= n4;
191 181130998 : *xup3 = t5 * cc1 + t4 * ss1;
192 181130998 : *xdn8 = -t4 * cc1 + t5 * ss1;
193 :
194 181130998 : xdn8 += n4;
195 181130998 : *xdn8 = t2 * cc3 + t1 * ss3;
196 :
197 181130998 : xup1 -= n4;
198 181130998 : xup1 += id;
199 181130998 : xup3 += id;
200 181130998 : xdn6 += id;
201 181130998 : xdn8 += id;
202 : }
203 121510732 : is = 2 * id - n2;
204 121510732 : id = 4 * id;
205 : }
206 : }
207 : }
208 :
209 : /*-----------------------------------------------------------------*
210 : * Length two butterflies
211 : *-----------------------------------------------------------------*/
212 :
213 1525550 : is = 1;
214 1525550 : id = 4;
215 7503127 : while ( is < n )
216 : {
217 5977577 : xi0 = x + is;
218 5977577 : xi1 = xi0 + 1;
219 :
220 149649615 : for ( i0 = is; i0 <= n; i0 += id )
221 : {
222 143672038 : r1 = *xi0;
223 143672038 : *xi0 = r1 + *xi1;
224 143672038 : *xi1 = r1 - *xi1;
225 143672038 : xi0 += id;
226 143672038 : xi1 += id;
227 : }
228 5977577 : is = 2 * id - 1;
229 5977577 : id = 4 * id;
230 : }
231 :
232 : /*-----------------------------------------------------------------*
233 : * Digit reverse counter
234 : *-----------------------------------------------------------------*/
235 :
236 1525550 : idx = fft256_read_indexes;
237 1525550 : xi0 = &temp[0] - 1;
238 1525550 : if ( n == 128 )
239 : {
240 0 : for ( i = 0; i < n; i++ )
241 : {
242 0 : j = *idx++;
243 0 : temp[i] = x[1 + ( j >> 1 )];
244 : }
245 : }
246 1525550 : else if ( n == 256 )
247 : {
248 5838526 : for ( i = 0; i < n; i++ )
249 : {
250 5815808 : j = *idx++;
251 5815808 : temp[i] = x[1 + j];
252 : }
253 : }
254 1502832 : else if ( n == 512 )
255 : {
256 191973089 : for ( i = 0; i < 256; i++ )
257 : {
258 191226112 : j = *idx++;
259 191226112 : temp[i] = x[1 + 2 * j];
260 191226112 : temp[i + 256] = x[2 + 2 * j];
261 : }
262 : }
263 : else
264 : {
265 755855 : xi0 = x;
266 755855 : j = 1;
267 42545112 : for ( i = 1; i < n; i++ )
268 : {
269 41789257 : if ( i < j )
270 : {
271 18474474 : xt = x[j];
272 18474474 : x[j] = x[i];
273 18474474 : x[i] = xt;
274 : }
275 41789257 : k = n >> 1;
276 79392157 : while ( k < j )
277 : {
278 37602900 : j = j - k;
279 37602900 : k = k >> 1;
280 : }
281 41789257 : j = j + k;
282 : }
283 : }
284 :
285 : /*-----------------------------------------------------------------*
286 : * Normalization
287 : *-----------------------------------------------------------------*/
288 :
289 432338694 : for ( i = 1; i <= n; i++ )
290 : {
291 430813144 : x[i] = xi0[i] * n_inv;
292 : }
293 :
294 1525550 : return;
295 : }
|