1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
4 **
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ** GNU General Public License for more details.
14 **
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 **
19 ** Any non-GPL usage of this software or parts of this software is strictly
20 ** forbidden.
21 **
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24 **
25 ** $Id: sbr_dct.c,v 1.15 2004/09/04 14:56:28 menno Exp $
26 **/
27 
28 #include "common.h"
29 
30 #ifdef SBR_DEC
31 
32 #ifdef _MSC_VER
33 #pragma warning(disable:4305)
34 #pragma warning(disable:4244)
35 #endif
36 
37 
38 #include "sbr_dct.h"
39 
DCT4_32(real_t * y,real_t * x)40 void DCT4_32(real_t *y, real_t *x)
41 {
42     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10;
43     real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20;
44     real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30;
45     real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40;
46     real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50;
47     real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60;
48     real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70;
49     real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80;
50     real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90;
51     real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100;
52     real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110;
53     real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120;
54     real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130;
55     real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140;
56     real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150;
57     real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160;
58     real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170;
59     real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180;
60     real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190;
61     real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200;
62     real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210;
63     real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220;
64     real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230;
65     real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240;
66     real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250;
67     real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260;
68     real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270;
69     real_t f271, f272, f273, f274, f275, f276, f277, f278, f279, f280;
70     real_t f281, f282, f283, f284, f285, f286, f287, f288, f289, f290;
71     real_t f291, f292, f293, f294, f295, f296, f297, f298, f299, f300;
72     real_t f301, f302, f303, f304, f305, f306, f307, f310, f311, f312;
73     real_t f313, f316, f317, f318, f319, f322, f323, f324, f325, f328;
74     real_t f329, f330, f331, f334, f335, f336, f337, f340, f341, f342;
75     real_t f343, f346, f347, f348, f349, f352, f353, f354, f355, f358;
76     real_t f359, f360, f361, f364, f365, f366, f367, f370, f371, f372;
77     real_t f373, f376, f377, f378, f379, f382, f383, f384, f385, f388;
78     real_t f389, f390, f391, f394, f395, f396, f397;
79 
80     f0 = x[15] - x[16];
81     f1 = x[15] + x[16];
82     f2 = MUL_F(FRAC_CONST(0.7071067811865476), f1);
83     f3 = MUL_F(FRAC_CONST(0.7071067811865476), f0);
84     f4 = x[8] - x[23];
85     f5 = x[8] + x[23];
86     f6 = MUL_F(FRAC_CONST(0.7071067811865476), f5);
87     f7 = MUL_F(FRAC_CONST(0.7071067811865476), f4);
88     f8 = x[12] - x[19];
89     f9 = x[12] + x[19];
90     f10 = MUL_F(FRAC_CONST(0.7071067811865476), f9);
91     f11 = MUL_F(FRAC_CONST(0.7071067811865476), f8);
92     f12 = x[11] - x[20];
93     f13 = x[11] + x[20];
94     f14 = MUL_F(FRAC_CONST(0.7071067811865476), f13);
95     f15 = MUL_F(FRAC_CONST(0.7071067811865476), f12);
96     f16 = x[14] - x[17];
97     f17 = x[14] + x[17];
98     f18 = MUL_F(FRAC_CONST(0.7071067811865476), f17);
99     f19 = MUL_F(FRAC_CONST(0.7071067811865476), f16);
100     f20 = x[9] - x[22];
101     f21 = x[9] + x[22];
102     f22 = MUL_F(FRAC_CONST(0.7071067811865476), f21);
103     f23 = MUL_F(FRAC_CONST(0.7071067811865476), f20);
104     f24 = x[13] - x[18];
105     f25 = x[13] + x[18];
106     f26 = MUL_F(FRAC_CONST(0.7071067811865476), f25);
107     f27 = MUL_F(FRAC_CONST(0.7071067811865476), f24);
108     f28 = x[10] - x[21];
109     f29 = x[10] + x[21];
110     f30 = MUL_F(FRAC_CONST(0.7071067811865476), f29);
111     f31 = MUL_F(FRAC_CONST(0.7071067811865476), f28);
112     f32 = x[0] - f2;
113     f33 = x[0] + f2;
114     f34 = x[31] - f3;
115     f35 = x[31] + f3;
116     f36 = x[7] - f6;
117     f37 = x[7] + f6;
118     f38 = x[24] - f7;
119     f39 = x[24] + f7;
120     f40 = x[3] - f10;
121     f41 = x[3] + f10;
122     f42 = x[28] - f11;
123     f43 = x[28] + f11;
124     f44 = x[4] - f14;
125     f45 = x[4] + f14;
126     f46 = x[27] - f15;
127     f47 = x[27] + f15;
128     f48 = x[1] - f18;
129     f49 = x[1] + f18;
130     f50 = x[30] - f19;
131     f51 = x[30] + f19;
132     f52 = x[6] - f22;
133     f53 = x[6] + f22;
134     f54 = x[25] - f23;
135     f55 = x[25] + f23;
136     f56 = x[2] - f26;
137     f57 = x[2] + f26;
138     f58 = x[29] - f27;
139     f59 = x[29] + f27;
140     f60 = x[5] - f30;
141     f61 = x[5] + f30;
142     f62 = x[26] - f31;
143     f63 = x[26] + f31;
144     f64 = f39 + f37;
145     f65 = MUL_F(FRAC_CONST(-0.5411961001461969), f39);
146     f66 = MUL_F(FRAC_CONST(0.9238795325112867), f64);
147     f67 = MUL_C(COEF_CONST(1.3065629648763766), f37);
148     f68 = f65 + f66;
149     f69 = f67 - f66;
150     f70 = f38 + f36;
151     f71 = MUL_C(COEF_CONST(1.3065629648763770), f38);
152     f72 = MUL_F(FRAC_CONST(-0.3826834323650904), f70);
153     f73 = MUL_F(FRAC_CONST(0.5411961001461961), f36);
154     f74 = f71 + f72;
155     f75 = f73 - f72;
156     f76 = f47 + f45;
157     f77 = MUL_F(FRAC_CONST(-0.5411961001461969), f47);
158     f78 = MUL_F(FRAC_CONST(0.9238795325112867), f76);
159     f79 = MUL_C(COEF_CONST(1.3065629648763766), f45);
160     f80 = f77 + f78;
161     f81 = f79 - f78;
162     f82 = f46 + f44;
163     f83 = MUL_C(COEF_CONST(1.3065629648763770), f46);
164     f84 = MUL_F(FRAC_CONST(-0.3826834323650904), f82);
165     f85 = MUL_F(FRAC_CONST(0.5411961001461961), f44);
166     f86 = f83 + f84;
167     f87 = f85 - f84;
168     f88 = f55 + f53;
169     f89 = MUL_F(FRAC_CONST(-0.5411961001461969), f55);
170     f90 = MUL_F(FRAC_CONST(0.9238795325112867), f88);
171     f91 = MUL_C(COEF_CONST(1.3065629648763766), f53);
172     f92 = f89 + f90;
173     f93 = f91 - f90;
174     f94 = f54 + f52;
175     f95 = MUL_C(COEF_CONST(1.3065629648763770), f54);
176     f96 = MUL_F(FRAC_CONST(-0.3826834323650904), f94);
177     f97 = MUL_F(FRAC_CONST(0.5411961001461961), f52);
178     f98 = f95 + f96;
179     f99 = f97 - f96;
180     f100 = f63 + f61;
181     f101 = MUL_F(FRAC_CONST(-0.5411961001461969), f63);
182     f102 = MUL_F(FRAC_CONST(0.9238795325112867), f100);
183     f103 = MUL_C(COEF_CONST(1.3065629648763766), f61);
184     f104 = f101 + f102;
185     f105 = f103 - f102;
186     f106 = f62 + f60;
187     f107 = MUL_C(COEF_CONST(1.3065629648763770), f62);
188     f108 = MUL_F(FRAC_CONST(-0.3826834323650904), f106);
189     f109 = MUL_F(FRAC_CONST(0.5411961001461961), f60);
190     f110 = f107 + f108;
191     f111 = f109 - f108;
192     f112 = f33 - f68;
193     f113 = f33 + f68;
194     f114 = f35 - f69;
195     f115 = f35 + f69;
196     f116 = f32 - f74;
197     f117 = f32 + f74;
198     f118 = f34 - f75;
199     f119 = f34 + f75;
200     f120 = f41 - f80;
201     f121 = f41 + f80;
202     f122 = f43 - f81;
203     f123 = f43 + f81;
204     f124 = f40 - f86;
205     f125 = f40 + f86;
206     f126 = f42 - f87;
207     f127 = f42 + f87;
208     f128 = f49 - f92;
209     f129 = f49 + f92;
210     f130 = f51 - f93;
211     f131 = f51 + f93;
212     f132 = f48 - f98;
213     f133 = f48 + f98;
214     f134 = f50 - f99;
215     f135 = f50 + f99;
216     f136 = f57 - f104;
217     f137 = f57 + f104;
218     f138 = f59 - f105;
219     f139 = f59 + f105;
220     f140 = f56 - f110;
221     f141 = f56 + f110;
222     f142 = f58 - f111;
223     f143 = f58 + f111;
224     f144 = f123 + f121;
225     f145 = MUL_F(FRAC_CONST(-0.7856949583871021), f123);
226     f146 = MUL_F(FRAC_CONST(0.9807852804032304), f144);
227     f147 = MUL_C(COEF_CONST(1.1758756024193588), f121);
228     f148 = f145 + f146;
229     f149 = f147 - f146;
230     f150 = f127 + f125;
231     f151 = MUL_F(FRAC_CONST(0.2758993792829431), f127);
232     f152 = MUL_F(FRAC_CONST(0.5555702330196022), f150);
233     f153 = MUL_C(COEF_CONST(1.3870398453221475), f125);
234     f154 = f151 + f152;
235     f155 = f153 - f152;
236     f156 = f122 + f120;
237     f157 = MUL_C(COEF_CONST(1.1758756024193591), f122);
238     f158 = MUL_F(FRAC_CONST(-0.1950903220161287), f156);
239     f159 = MUL_F(FRAC_CONST(0.7856949583871016), f120);
240     f160 = f157 + f158;
241     f161 = f159 - f158;
242     f162 = f126 + f124;
243     f163 = MUL_C(COEF_CONST(1.3870398453221473), f126);
244     f164 = MUL_F(FRAC_CONST(-0.8314696123025455), f162);
245     f165 = MUL_F(FRAC_CONST(-0.2758993792829436), f124);
246     f166 = f163 + f164;
247     f167 = f165 - f164;
248     f168 = f139 + f137;
249     f169 = MUL_F(FRAC_CONST(-0.7856949583871021), f139);
250     f170 = MUL_F(FRAC_CONST(0.9807852804032304), f168);
251     f171 = MUL_C(COEF_CONST(1.1758756024193588), f137);
252     f172 = f169 + f170;
253     f173 = f171 - f170;
254     f174 = f143 + f141;
255     f175 = MUL_F(FRAC_CONST(0.2758993792829431), f143);
256     f176 = MUL_F(FRAC_CONST(0.5555702330196022), f174);
257     f177 = MUL_C(COEF_CONST(1.3870398453221475), f141);
258     f178 = f175 + f176;
259     f179 = f177 - f176;
260     f180 = f138 + f136;
261     f181 = MUL_C(COEF_CONST(1.1758756024193591), f138);
262     f182 = MUL_F(FRAC_CONST(-0.1950903220161287), f180);
263     f183 = MUL_F(FRAC_CONST(0.7856949583871016), f136);
264     f184 = f181 + f182;
265     f185 = f183 - f182;
266     f186 = f142 + f140;
267     f187 = MUL_C(COEF_CONST(1.3870398453221473), f142);
268     f188 = MUL_F(FRAC_CONST(-0.8314696123025455), f186);
269     f189 = MUL_F(FRAC_CONST(-0.2758993792829436), f140);
270     f190 = f187 + f188;
271     f191 = f189 - f188;
272     f192 = f113 - f148;
273     f193 = f113 + f148;
274     f194 = f115 - f149;
275     f195 = f115 + f149;
276     f196 = f117 - f154;
277     f197 = f117 + f154;
278     f198 = f119 - f155;
279     f199 = f119 + f155;
280     f200 = f112 - f160;
281     f201 = f112 + f160;
282     f202 = f114 - f161;
283     f203 = f114 + f161;
284     f204 = f116 - f166;
285     f205 = f116 + f166;
286     f206 = f118 - f167;
287     f207 = f118 + f167;
288     f208 = f129 - f172;
289     f209 = f129 + f172;
290     f210 = f131 - f173;
291     f211 = f131 + f173;
292     f212 = f133 - f178;
293     f213 = f133 + f178;
294     f214 = f135 - f179;
295     f215 = f135 + f179;
296     f216 = f128 - f184;
297     f217 = f128 + f184;
298     f218 = f130 - f185;
299     f219 = f130 + f185;
300     f220 = f132 - f190;
301     f221 = f132 + f190;
302     f222 = f134 - f191;
303     f223 = f134 + f191;
304     f224 = f211 + f209;
305     f225 = MUL_F(FRAC_CONST(-0.8971675863426361), f211);
306     f226 = MUL_F(FRAC_CONST(0.9951847266721968), f224);
307     f227 = MUL_C(COEF_CONST(1.0932018670017576), f209);
308     f228 = f225 + f226;
309     f229 = f227 - f226;
310     f230 = f215 + f213;
311     f231 = MUL_F(FRAC_CONST(-0.4105245275223571), f215);
312     f232 = MUL_F(FRAC_CONST(0.8819212643483549), f230);
313     f233 = MUL_C(COEF_CONST(1.3533180011743529), f213);
314     f234 = f231 + f232;
315     f235 = f233 - f232;
316     f236 = f219 + f217;
317     f237 = MUL_F(FRAC_CONST(0.1386171691990915), f219);
318     f238 = MUL_F(FRAC_CONST(0.6343932841636455), f236);
319     f239 = MUL_C(COEF_CONST(1.4074037375263826), f217);
320     f240 = f237 + f238;
321     f241 = f239 - f238;
322     f242 = f223 + f221;
323     f243 = MUL_F(FRAC_CONST(0.6666556584777466), f223);
324     f244 = MUL_F(FRAC_CONST(0.2902846772544623), f242);
325     f245 = MUL_C(COEF_CONST(1.2472250129866711), f221);
326     f246 = f243 + f244;
327     f247 = f245 - f244;
328     f248 = f210 + f208;
329     f249 = MUL_C(COEF_CONST(1.0932018670017574), f210);
330     f250 = MUL_F(FRAC_CONST(-0.0980171403295605), f248);
331     f251 = MUL_F(FRAC_CONST(0.8971675863426364), f208);
332     f252 = f249 + f250;
333     f253 = f251 - f250;
334     f254 = f214 + f212;
335     f255 = MUL_C(COEF_CONST(1.3533180011743529), f214);
336     f256 = MUL_F(FRAC_CONST(-0.4713967368259979), f254);
337     f257 = MUL_F(FRAC_CONST(0.4105245275223569), f212);
338     f258 = f255 + f256;
339     f259 = f257 - f256;
340     f260 = f218 + f216;
341     f261 = MUL_C(COEF_CONST(1.4074037375263826), f218);
342     f262 = MUL_F(FRAC_CONST(-0.7730104533627369), f260);
343     f263 = MUL_F(FRAC_CONST(-0.1386171691990913), f216);
344     f264 = f261 + f262;
345     f265 = f263 - f262;
346     f266 = f222 + f220;
347     f267 = MUL_C(COEF_CONST(1.2472250129866711), f222);
348     f268 = MUL_F(FRAC_CONST(-0.9569403357322089), f266);
349     f269 = MUL_F(FRAC_CONST(-0.6666556584777469), f220);
350     f270 = f267 + f268;
351     f271 = f269 - f268;
352     f272 = f193 - f228;
353     f273 = f193 + f228;
354     f274 = f195 - f229;
355     f275 = f195 + f229;
356     f276 = f197 - f234;
357     f277 = f197 + f234;
358     f278 = f199 - f235;
359     f279 = f199 + f235;
360     f280 = f201 - f240;
361     f281 = f201 + f240;
362     f282 = f203 - f241;
363     f283 = f203 + f241;
364     f284 = f205 - f246;
365     f285 = f205 + f246;
366     f286 = f207 - f247;
367     f287 = f207 + f247;
368     f288 = f192 - f252;
369     f289 = f192 + f252;
370     f290 = f194 - f253;
371     f291 = f194 + f253;
372     f292 = f196 - f258;
373     f293 = f196 + f258;
374     f294 = f198 - f259;
375     f295 = f198 + f259;
376     f296 = f200 - f264;
377     f297 = f200 + f264;
378     f298 = f202 - f265;
379     f299 = f202 + f265;
380     f300 = f204 - f270;
381     f301 = f204 + f270;
382     f302 = f206 - f271;
383     f303 = f206 + f271;
384     f304 = f275 + f273;
385     f305 = MUL_F(FRAC_CONST(-0.9751575901732920), f275);
386     f306 = MUL_F(FRAC_CONST(0.9996988186962043), f304);
387     f307 = MUL_C(COEF_CONST(1.0242400472191164), f273);
388     y[0] = f305 + f306;
389     y[31] = f307 - f306;
390     f310 = f279 + f277;
391     f311 = MUL_F(FRAC_CONST(-0.8700688593994936), f279);
392     f312 = MUL_F(FRAC_CONST(0.9924795345987100), f310);
393     f313 = MUL_C(COEF_CONST(1.1148902097979263), f277);
394     y[2] = f311 + f312;
395     y[29] = f313 - f312;
396     f316 = f283 + f281;
397     f317 = MUL_F(FRAC_CONST(-0.7566008898816587), f283);
398     f318 = MUL_F(FRAC_CONST(0.9757021300385286), f316);
399     f319 = MUL_C(COEF_CONST(1.1948033701953984), f281);
400     y[4] = f317 + f318;
401     y[27] = f319 - f318;
402     f322 = f287 + f285;
403     f323 = MUL_F(FRAC_CONST(-0.6358464401941451), f287);
404     f324 = MUL_F(FRAC_CONST(0.9495281805930367), f322);
405     f325 = MUL_C(COEF_CONST(1.2632099209919283), f285);
406     y[6] = f323 + f324;
407     y[25] = f325 - f324;
408     f328 = f291 + f289;
409     f329 = MUL_F(FRAC_CONST(-0.5089684416985408), f291);
410     f330 = MUL_F(FRAC_CONST(0.9142097557035307), f328);
411     f331 = MUL_C(COEF_CONST(1.3194510697085207), f289);
412     y[8] = f329 + f330;
413     y[23] = f331 - f330;
414     f334 = f295 + f293;
415     f335 = MUL_F(FRAC_CONST(-0.3771887988789273), f295);
416     f336 = MUL_F(FRAC_CONST(0.8700869911087114), f334);
417     f337 = MUL_C(COEF_CONST(1.3629851833384954), f293);
418     y[10] = f335 + f336;
419     y[21] = f337 - f336;
420     f340 = f299 + f297;
421     f341 = MUL_F(FRAC_CONST(-0.2417766217337384), f299);
422     f342 = MUL_F(FRAC_CONST(0.8175848131515837), f340);
423     f343 = MUL_C(COEF_CONST(1.3933930045694289), f297);
424     y[12] = f341 + f342;
425     y[19] = f343 - f342;
426     f346 = f303 + f301;
427     f347 = MUL_F(FRAC_CONST(-0.1040360035527077), f303);
428     f348 = MUL_F(FRAC_CONST(0.7572088465064845), f346);
429     f349 = MUL_C(COEF_CONST(1.4103816894602612), f301);
430     y[14] = f347 + f348;
431     y[17] = f349 - f348;
432     f352 = f274 + f272;
433     f353 = MUL_F(FRAC_CONST(0.0347065382144002), f274);
434     f354 = MUL_F(FRAC_CONST(0.6895405447370668), f352);
435     f355 = MUL_C(COEF_CONST(1.4137876276885337), f272);
436     y[16] = f353 + f354;
437     y[15] = f355 - f354;
438     f358 = f278 + f276;
439     f359 = MUL_F(FRAC_CONST(0.1731148370459795), f278);
440     f360 = MUL_F(FRAC_CONST(0.6152315905806268), f358);
441     f361 = MUL_C(COEF_CONST(1.4035780182072330), f276);
442     y[18] = f359 + f360;
443     y[13] = f361 - f360;
444     f364 = f282 + f280;
445     f365 = MUL_F(FRAC_CONST(0.3098559453626100), f282);
446     f366 = MUL_F(FRAC_CONST(0.5349976198870972), f364);
447     f367 = MUL_C(COEF_CONST(1.3798511851368043), f280);
448     y[20] = f365 + f366;
449     y[11] = f367 - f366;
450     f370 = f286 + f284;
451     f371 = MUL_F(FRAC_CONST(0.4436129715409088), f286);
452     f372 = MUL_F(FRAC_CONST(0.4496113296546065), f370);
453     f373 = MUL_C(COEF_CONST(1.3428356308501219), f284);
454     y[22] = f371 + f372;
455     y[9] = f373 - f372;
456     f376 = f290 + f288;
457     f377 = MUL_F(FRAC_CONST(0.5730977622997509), f290);
458     f378 = MUL_F(FRAC_CONST(0.3598950365349881), f376);
459     f379 = MUL_C(COEF_CONST(1.2928878353697271), f288);
460     y[24] = f377 + f378;
461     y[7] = f379 - f378;
462     f382 = f294 + f292;
463     f383 = MUL_F(FRAC_CONST(0.6970633083205415), f294);
464     f384 = MUL_F(FRAC_CONST(0.2667127574748984), f382);
465     f385 = MUL_C(COEF_CONST(1.2304888232703382), f292);
466     y[26] = f383 + f384;
467     y[5] = f385 - f384;
468     f388 = f298 + f296;
469     f389 = MUL_F(FRAC_CONST(0.8143157536286401), f298);
470     f390 = MUL_F(FRAC_CONST(0.1709618887603012), f388);
471     f391 = MUL_C(COEF_CONST(1.1562395311492424), f296);
472     y[28] = f389 + f390;
473     y[3] = f391 - f390;
474     f394 = f302 + f300;
475     f395 = MUL_F(FRAC_CONST(0.9237258930790228), f302);
476     f396 = MUL_F(FRAC_CONST(0.0735645635996674), f394);
477     f397 = MUL_C(COEF_CONST(1.0708550202783576), f300);
478     y[30] = f395 + f396;
479     y[1] = f397 - f396;
480 }
481 
482 #ifdef SBR_LOW_POWER
483 
DCT2_16_unscaled(real_t * y,real_t * x)484 void DCT2_16_unscaled(real_t *y, real_t *x)
485 {
486     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10;
487     real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20;
488     real_t f21, f22, f23, f24, f25, f26, f27, f28, f31, f32;
489     real_t f33, f34, f37, f38, f39, f40, f41, f42, f43, f44;
490     real_t f45, f46, f47, f48, f49, f51, f53, f54, f57, f58;
491     real_t f59, f60, f61, f62, f63, f64, f65, f66, f67, f68;
492     real_t f69, f70, f71, f72, f73, f74, f75, f76, f77, f78;
493     real_t f79, f80, f81, f82, f83, f84, f85, f86, f87, f88;
494     real_t f89, f90, f91, f92, f95, f96, f97, f98, f101, f102;
495     real_t f103, f104, f107, f108, f109, f110;
496 
497     f0 = x[0] - x[15];
498     f1 = x[0] + x[15];
499     f2 = x[1] - x[14];
500     f3 = x[1] + x[14];
501     f4 = x[2] - x[13];
502     f5 = x[2] + x[13];
503     f6 = x[3] - x[12];
504     f7 = x[3] + x[12];
505     f8 = x[4] - x[11];
506     f9 = x[4] + x[11];
507     f10 = x[5] - x[10];
508     f11 = x[5] + x[10];
509     f12 = x[6] - x[9];
510     f13 = x[6] + x[9];
511     f14 = x[7] - x[8];
512     f15 = x[7] + x[8];
513     f16 = f1 - f15;
514     f17 = f1 + f15;
515     f18 = f3 - f13;
516     f19 = f3 + f13;
517     f20 = f5 - f11;
518     f21 = f5 + f11;
519     f22 = f7 - f9;
520     f23 = f7 + f9;
521     f24 = f17 - f23;
522     f25 = f17 + f23;
523     f26 = f19 - f21;
524     f27 = f19 + f21;
525     f28 = f25 - f27;
526     y[0] = f25 + f27;
527     y[8] = MUL_F(f28, FRAC_CONST(0.7071067811865476));
528     f31 = f24 + f26;
529     f32 = MUL_C(f24, COEF_CONST(1.3065629648763766));
530     f33 = MUL_F(f31, FRAC_CONST(-0.9238795325112866));
531     f34 = MUL_F(f26, FRAC_CONST(-0.5411961001461967));
532     y[12] = f32 + f33;
533     y[4] = f34 - f33;
534     f37 = f16 + f22;
535     f38 = MUL_C(f16, COEF_CONST(1.1758756024193588));
536     f39 = MUL_F(f37, FRAC_CONST(-0.9807852804032304));
537     f40 = MUL_F(f22, FRAC_CONST(-0.7856949583871021));
538     f41 = f38 + f39;
539     f42 = f40 - f39;
540     f43 = f18 + f20;
541     f44 = MUL_C(f18, COEF_CONST(1.3870398453221473));
542     f45 = MUL_F(f43, FRAC_CONST(-0.8314696123025455));
543     f46 = MUL_F(f20, FRAC_CONST(-0.2758993792829436));
544     f47 = f44 + f45;
545     f48 = f46 - f45;
546     f49 = f42 - f48;
547     y[2] = f42 + f48;
548     f51 = MUL_F(f49, FRAC_CONST(0.7071067811865476));
549     y[14] = f41 - f47;
550     f53 = f41 + f47;
551     f54 = MUL_F(f53, FRAC_CONST(0.7071067811865476));
552     y[10] = f51 - f54;
553     y[6] = f51 + f54;
554     f57 = f2 - f4;
555     f58 = f2 + f4;
556     f59 = f6 - f8;
557     f60 = f6 + f8;
558     f61 = f10 - f12;
559     f62 = f10 + f12;
560     f63 = MUL_F(f60, FRAC_CONST(0.7071067811865476));
561     f64 = f0 - f63;
562     f65 = f0 + f63;
563     f66 = f58 + f62;
564     f67 = MUL_C(f58, COEF_CONST(1.3065629648763766));
565     f68 = MUL_F(f66, FRAC_CONST(-0.9238795325112866));
566     f69 = MUL_F(f62, FRAC_CONST(-0.5411961001461967));
567     f70 = f67 + f68;
568     f71 = f69 - f68;
569     f72 = f65 - f71;
570     f73 = f65 + f71;
571     f74 = f64 - f70;
572     f75 = f64 + f70;
573     f76 = MUL_F(f59, FRAC_CONST(0.7071067811865476));
574     f77 = f14 - f76;
575     f78 = f14 + f76;
576     f79 = f61 + f57;
577     f80 = MUL_C(f61, COEF_CONST(1.3065629648763766));
578     f81 = MUL_F(f79, FRAC_CONST(-0.9238795325112866));
579     f82 = MUL_F(f57, FRAC_CONST(-0.5411961001461967));
580     f83 = f80 + f81;
581     f84 = f82 - f81;
582     f85 = f78 - f84;
583     f86 = f78 + f84;
584     f87 = f77 - f83;
585     f88 = f77 + f83;
586     f89 = f86 + f73;
587     f90 = MUL_F(f86, FRAC_CONST(-0.8971675863426361));
588     f91 = MUL_F(f89, FRAC_CONST(0.9951847266721968));
589     f92 = MUL_C(f73, COEF_CONST(1.0932018670017576));
590     y[1] = f90 + f91;
591     y[15] = f92 - f91;
592     f95 = f75 - f88;
593     f96 = MUL_F(f88, FRAC_CONST(-0.6666556584777466));
594     f97 = MUL_F(f95, FRAC_CONST(0.9569403357322089));
595     f98 = MUL_C(f75, COEF_CONST(1.2472250129866713));
596     y[3] = f97 - f96;
597     y[13] = f98 - f97;
598     f101 = f87 + f74;
599     f102 = MUL_F(f87, FRAC_CONST(-0.4105245275223571));
600     f103 = MUL_F(f101, FRAC_CONST(0.8819212643483549));
601     f104 = MUL_C(f74, COEF_CONST(1.3533180011743529));
602     y[5] = f102 + f103;
603     y[11] = f104 - f103;
604     f107 = f72 - f85;
605     f108 = MUL_F(f85, FRAC_CONST(-0.1386171691990915));
606     f109 = MUL_F(f107, FRAC_CONST(0.7730104533627370));
607     f110 = MUL_C(f72, COEF_CONST(1.4074037375263826));
608     y[7] = f109 - f108;
609     y[9] = f110 - f109;
610 }
611 
DCT4_16(real_t * y,real_t * x)612 void DCT4_16(real_t *y, real_t *x)
613 {
614     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10;
615     real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20;
616     real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30;
617     real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40;
618     real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50;
619     real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60;
620     real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70;
621     real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80;
622     real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90;
623     real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100;
624     real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110;
625     real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120;
626     real_t f121, f122, f123, f124, f125, f126, f127, f128, f130, f132;
627     real_t f134, f136, f138, f140, f142, f144, f145, f148, f149, f152;
628     real_t f153, f156, f157;
629 
630     f0 = x[0] + x[15];
631     f1 = MUL_C(COEF_CONST(1.0478631305325901), x[0]);
632     f2 = MUL_F(FRAC_CONST(-0.9987954562051724), f0);
633     f3 = MUL_F(FRAC_CONST(-0.9497277818777548), x[15]);
634     f4 = f1 + f2;
635     f5 = f3 - f2;
636     f6 = x[2] + x[13];
637     f7 = MUL_C(COEF_CONST(1.2130114330978077), x[2]);
638     f8 = MUL_F(FRAC_CONST(-0.9700312531945440), f6);
639     f9 = MUL_F(FRAC_CONST(-0.7270510732912803), x[13]);
640     f10 = f7 + f8;
641     f11 = f9 - f8;
642     f12 = x[4] + x[11];
643     f13 = MUL_C(COEF_CONST(1.3315443865537255), x[4]);
644     f14 = MUL_F(FRAC_CONST(-0.9039892931234433), f12);
645     f15 = MUL_F(FRAC_CONST(-0.4764341996931612), x[11]);
646     f16 = f13 + f14;
647     f17 = f15 - f14;
648     f18 = x[6] + x[9];
649     f19 = MUL_C(COEF_CONST(1.3989068359730781), x[6]);
650     f20 = MUL_F(FRAC_CONST(-0.8032075314806453), f18);
651     f21 = MUL_F(FRAC_CONST(-0.2075082269882124), x[9]);
652     f22 = f19 + f20;
653     f23 = f21 - f20;
654     f24 = x[8] + x[7];
655     f25 = MUL_C(COEF_CONST(1.4125100802019777), x[8]);
656     f26 = MUL_F(FRAC_CONST(-0.6715589548470187), f24);
657     f27 = MUL_F(FRAC_CONST(0.0693921705079402), x[7]);
658     f28 = f25 + f26;
659     f29 = f27 - f26;
660     f30 = x[10] + x[5];
661     f31 = MUL_C(COEF_CONST(1.3718313541934939), x[10]);
662     f32 = MUL_F(FRAC_CONST(-0.5141027441932219), f30);
663     f33 = MUL_F(FRAC_CONST(0.3436258658070501), x[5]);
664     f34 = f31 + f32;
665     f35 = f33 - f32;
666     f36 = x[12] + x[3];
667     f37 = MUL_C(COEF_CONST(1.2784339185752409), x[12]);
668     f38 = MUL_F(FRAC_CONST(-0.3368898533922200), f36);
669     f39 = MUL_F(FRAC_CONST(0.6046542117908008), x[3]);
670     f40 = f37 + f38;
671     f41 = f39 - f38;
672     f42 = x[14] + x[1];
673     f43 = MUL_C(COEF_CONST(1.1359069844201433), x[14]);
674     f44 = MUL_F(FRAC_CONST(-0.1467304744553624), f42);
675     f45 = MUL_F(FRAC_CONST(0.8424460355094185), x[1]);
676     f46 = f43 + f44;
677     f47 = f45 - f44;
678     f48 = f5 - f29;
679     f49 = f5 + f29;
680     f50 = f4 - f28;
681     f51 = f4 + f28;
682     f52 = f11 - f35;
683     f53 = f11 + f35;
684     f54 = f10 - f34;
685     f55 = f10 + f34;
686     f56 = f17 - f41;
687     f57 = f17 + f41;
688     f58 = f16 - f40;
689     f59 = f16 + f40;
690     f60 = f23 - f47;
691     f61 = f23 + f47;
692     f62 = f22 - f46;
693     f63 = f22 + f46;
694     f64 = f48 + f50;
695     f65 = MUL_C(COEF_CONST(1.1758756024193588), f48);
696     f66 = MUL_F(FRAC_CONST(-0.9807852804032304), f64);
697     f67 = MUL_F(FRAC_CONST(-0.7856949583871021), f50);
698     f68 = f65 + f66;
699     f69 = f67 - f66;
700     f70 = f52 + f54;
701     f71 = MUL_C(COEF_CONST(1.3870398453221475), f52);
702     f72 = MUL_F(FRAC_CONST(-0.5555702330196022), f70);
703     f73 = MUL_F(FRAC_CONST(0.2758993792829431), f54);
704     f74 = f71 + f72;
705     f75 = f73 - f72;
706     f76 = f56 + f58;
707     f77 = MUL_F(FRAC_CONST(0.7856949583871022), f56);
708     f78 = MUL_F(FRAC_CONST(0.1950903220161283), f76);
709     f79 = MUL_C(COEF_CONST(1.1758756024193586), f58);
710     f80 = f77 + f78;
711     f81 = f79 - f78;
712     f82 = f60 + f62;
713     f83 = MUL_F(FRAC_CONST(-0.2758993792829430), f60);
714     f84 = MUL_F(FRAC_CONST(0.8314696123025452), f82);
715     f85 = MUL_C(COEF_CONST(1.3870398453221475), f62);
716     f86 = f83 + f84;
717     f87 = f85 - f84;
718     f88 = f49 - f57;
719     f89 = f49 + f57;
720     f90 = f51 - f59;
721     f91 = f51 + f59;
722     f92 = f53 - f61;
723     f93 = f53 + f61;
724     f94 = f55 - f63;
725     f95 = f55 + f63;
726     f96 = f69 - f81;
727     f97 = f69 + f81;
728     f98 = f68 - f80;
729     f99 = f68 + f80;
730     f100 = f75 - f87;
731     f101 = f75 + f87;
732     f102 = f74 - f86;
733     f103 = f74 + f86;
734     f104 = f88 + f90;
735     f105 = MUL_C(COEF_CONST(1.3065629648763766), f88);
736     f106 = MUL_F(FRAC_CONST(-0.9238795325112866), f104);
737     f107 = MUL_F(FRAC_CONST(-0.5411961001461967), f90);
738     f108 = f105 + f106;
739     f109 = f107 - f106;
740     f110 = f92 + f94;
741     f111 = MUL_F(FRAC_CONST(0.5411961001461969), f92);
742     f112 = MUL_F(FRAC_CONST(0.3826834323650898), f110);
743     f113 = MUL_C(COEF_CONST(1.3065629648763766), f94);
744     f114 = f111 + f112;
745     f115 = f113 - f112;
746     f116 = f96 + f98;
747     f117 = MUL_C(COEF_CONST(1.3065629648763766), f96);
748     f118 = MUL_F(FRAC_CONST(-0.9238795325112866), f116);
749     f119 = MUL_F(FRAC_CONST(-0.5411961001461967), f98);
750     f120 = f117 + f118;
751     f121 = f119 - f118;
752     f122 = f100 + f102;
753     f123 = MUL_F(FRAC_CONST(0.5411961001461969), f100);
754     f124 = MUL_F(FRAC_CONST(0.3826834323650898), f122);
755     f125 = MUL_C(COEF_CONST(1.3065629648763766), f102);
756     f126 = f123 + f124;
757     f127 = f125 - f124;
758     f128 = f89 - f93;
759     y[0] = f89 + f93;
760     f130 = f91 - f95;
761     y[15] = f91 + f95;
762     f132 = f109 - f115;
763     y[3] = f109 + f115;
764     f134 = f108 - f114;
765     y[12] = f108 + f114;
766     f136 = f97 - f101;
767     y[1] = f97 + f101;
768     f138 = f99 - f103;
769     y[14] = f99 + f103;
770     f140 = f121 - f127;
771     y[2] = f121 + f127;
772     f142 = f120 - f126;
773     y[13] = f120 + f126;
774     f144 = f128 - f130;
775     f145 = f128 + f130;
776     y[8] = MUL_F(FRAC_CONST(0.7071067811865474), f144);
777     y[7] = MUL_F(FRAC_CONST(0.7071067811865474), f145);
778     f148 = f132 - f134;
779     f149 = f132 + f134;
780     y[11] = MUL_F(FRAC_CONST(0.7071067811865474), f148);
781     y[4] = MUL_F(FRAC_CONST(0.7071067811865474), f149);
782     f152 = f136 - f138;
783     f153 = f136 + f138;
784     y[9] = MUL_F(FRAC_CONST(0.7071067811865474), f152);
785     y[6] = MUL_F(FRAC_CONST(0.7071067811865474), f153);
786     f156 = f140 - f142;
787     f157 = f140 + f142;
788     y[10] = MUL_F(FRAC_CONST(0.7071067811865474), f156);
789     y[5] = MUL_F(FRAC_CONST(0.7071067811865474), f157);
790 }
791 
DCT3_32_unscaled(real_t * y,real_t * x)792 void DCT3_32_unscaled(real_t *y, real_t *x)
793 {
794     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10;
795     real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20;
796     real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30;
797     real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40;
798     real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50;
799     real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60;
800     real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70;
801     real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80;
802     real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90;
803     real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100;
804     real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110;
805     real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120;
806     real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130;
807     real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140;
808     real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150;
809     real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160;
810     real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170;
811     real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180;
812     real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190;
813     real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200;
814     real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210;
815     real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220;
816     real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230;
817     real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240;
818     real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250;
819     real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260;
820     real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270;
821     real_t f271, f272;
822 
823     f0 = MUL_F(x[16], FRAC_CONST(0.7071067811865476));
824     f1 = x[0] - f0;
825     f2 = x[0] + f0;
826     f3 = x[8] + x[24];
827     f4 = MUL_C(x[8], COEF_CONST(1.3065629648763766));
828     f5 = MUL_F(f3, FRAC_CONST((-0.9238795325112866)));
829     f6 = MUL_F(x[24], FRAC_CONST((-0.5411961001461967)));
830     f7 = f4 + f5;
831     f8 = f6 - f5;
832     f9 = f2 - f8;
833     f10 = f2 + f8;
834     f11 = f1 - f7;
835     f12 = f1 + f7;
836     f13 = x[4] + x[28];
837     f14 = MUL_C(x[4], COEF_CONST(1.1758756024193588));
838     f15 = MUL_F(f13, FRAC_CONST((-0.9807852804032304)));
839     f16 = MUL_F(x[28], FRAC_CONST((-0.7856949583871021)));
840     f17 = f14 + f15;
841     f18 = f16 - f15;
842     f19 = x[12] + x[20];
843     f20 = MUL_C(x[12], COEF_CONST(1.3870398453221473));
844     f21 = MUL_F(f19, FRAC_CONST((-0.8314696123025455)));
845     f22 = MUL_F(x[20], FRAC_CONST((-0.2758993792829436)));
846     f23 = f20 + f21;
847     f24 = f22 - f21;
848     f25 = f18 - f24;
849     f26 = f18 + f24;
850     f27 = MUL_F(f25, FRAC_CONST(0.7071067811865476));
851     f28 = f17 - f23;
852     f29 = f17 + f23;
853     f30 = MUL_F(f29, FRAC_CONST(0.7071067811865476));
854     f31 = f27 - f30;
855     f32 = f27 + f30;
856     f33 = f10 - f26;
857     f34 = f10 + f26;
858     f35 = f12 - f32;
859     f36 = f12 + f32;
860     f37 = f11 - f31;
861     f38 = f11 + f31;
862     f39 = f9 - f28;
863     f40 = f9 + f28;
864     f41 = x[2] + x[30];
865     f42 = MUL_C(x[2], COEF_CONST(1.0932018670017569));
866     f43 = MUL_F(f41, FRAC_CONST((-0.9951847266721969)));
867     f44 = MUL_F(x[30], FRAC_CONST((-0.8971675863426368)));
868     f45 = f42 + f43;
869     f46 = f44 - f43;
870     f47 = x[6] + x[26];
871     f48 = MUL_C(x[6], COEF_CONST(1.2472250129866711));
872     f49 = MUL_F(f47, FRAC_CONST((-0.9569403357322089)));
873     f50 = MUL_F(x[26], FRAC_CONST((-0.6666556584777469)));
874     f51 = f48 + f49;
875     f52 = f50 - f49;
876     f53 = x[10] + x[22];
877     f54 = MUL_C(x[10], COEF_CONST(1.3533180011743526));
878     f55 = MUL_F(f53, FRAC_CONST((-0.8819212643483551)));
879     f56 = MUL_F(x[22], FRAC_CONST((-0.4105245275223575)));
880     f57 = f54 + f55;
881     f58 = f56 - f55;
882     f59 = x[14] + x[18];
883     f60 = MUL_C(x[14], COEF_CONST(1.4074037375263826));
884     f61 = MUL_F(f59, FRAC_CONST((-0.7730104533627369)));
885     f62 = MUL_F(x[18], FRAC_CONST((-0.1386171691990913)));
886     f63 = f60 + f61;
887     f64 = f62 - f61;
888     f65 = f46 - f64;
889     f66 = f46 + f64;
890     f67 = f52 - f58;
891     f68 = f52 + f58;
892     f69 = f66 - f68;
893     f70 = f66 + f68;
894     f71 = MUL_F(f69, FRAC_CONST(0.7071067811865476));
895     f72 = f65 + f67;
896     f73 = MUL_C(f65, COEF_CONST(1.3065629648763766));
897     f74 = MUL_F(f72, FRAC_CONST((-0.9238795325112866)));
898     f75 = MUL_F(f67, FRAC_CONST((-0.5411961001461967)));
899     f76 = f73 + f74;
900     f77 = f75 - f74;
901     f78 = f45 - f63;
902     f79 = f45 + f63;
903     f80 = f51 - f57;
904     f81 = f51 + f57;
905     f82 = f79 + f81;
906     f83 = MUL_C(f79, COEF_CONST(1.3065629648763770));
907     f84 = MUL_F(f82, FRAC_CONST((-0.3826834323650904)));
908     f85 = MUL_F(f81, FRAC_CONST(0.5411961001461961));
909     f86 = f83 + f84;
910     f87 = f85 - f84;
911     f88 = f78 - f80;
912     f89 = f78 + f80;
913     f90 = MUL_F(f89, FRAC_CONST(0.7071067811865476));
914     f91 = f77 - f87;
915     f92 = f77 + f87;
916     f93 = f71 - f90;
917     f94 = f71 + f90;
918     f95 = f76 - f86;
919     f96 = f76 + f86;
920     f97 = f34 - f70;
921     f98 = f34 + f70;
922     f99 = f36 - f92;
923     f100 = f36 + f92;
924     f101 = f38 - f91;
925     f102 = f38 + f91;
926     f103 = f40 - f94;
927     f104 = f40 + f94;
928     f105 = f39 - f93;
929     f106 = f39 + f93;
930     f107 = f37 - f96;
931     f108 = f37 + f96;
932     f109 = f35 - f95;
933     f110 = f35 + f95;
934     f111 = f33 - f88;
935     f112 = f33 + f88;
936     f113 = x[1] + x[31];
937     f114 = MUL_C(x[1], COEF_CONST(1.0478631305325901));
938     f115 = MUL_F(f113, FRAC_CONST((-0.9987954562051724)));
939     f116 = MUL_F(x[31], FRAC_CONST((-0.9497277818777548)));
940     f117 = f114 + f115;
941     f118 = f116 - f115;
942     f119 = x[5] + x[27];
943     f120 = MUL_C(x[5], COEF_CONST(1.2130114330978077));
944     f121 = MUL_F(f119, FRAC_CONST((-0.9700312531945440)));
945     f122 = MUL_F(x[27], FRAC_CONST((-0.7270510732912803)));
946     f123 = f120 + f121;
947     f124 = f122 - f121;
948     f125 = x[9] + x[23];
949     f126 = MUL_C(x[9], COEF_CONST(1.3315443865537255));
950     f127 = MUL_F(f125, FRAC_CONST((-0.9039892931234433)));
951     f128 = MUL_F(x[23], FRAC_CONST((-0.4764341996931612)));
952     f129 = f126 + f127;
953     f130 = f128 - f127;
954     f131 = x[13] + x[19];
955     f132 = MUL_C(x[13], COEF_CONST(1.3989068359730781));
956     f133 = MUL_F(f131, FRAC_CONST((-0.8032075314806453)));
957     f134 = MUL_F(x[19], FRAC_CONST((-0.2075082269882124)));
958     f135 = f132 + f133;
959     f136 = f134 - f133;
960     f137 = x[17] + x[15];
961     f138 = MUL_C(x[17], COEF_CONST(1.4125100802019777));
962     f139 = MUL_F(f137, FRAC_CONST((-0.6715589548470187)));
963     f140 = MUL_F(x[15], FRAC_CONST(0.0693921705079402));
964     f141 = f138 + f139;
965     f142 = f140 - f139;
966     f143 = x[21] + x[11];
967     f144 = MUL_C(x[21], COEF_CONST(1.3718313541934939));
968     f145 = MUL_F(f143, FRAC_CONST((-0.5141027441932219)));
969     f146 = MUL_F(x[11], FRAC_CONST(0.3436258658070501));
970     f147 = f144 + f145;
971     f148 = f146 - f145;
972     f149 = x[25] + x[7];
973     f150 = MUL_C(x[25], COEF_CONST(1.2784339185752409));
974     f151 = MUL_F(f149, FRAC_CONST((-0.3368898533922200)));
975     f152 = MUL_F(x[7], FRAC_CONST(0.6046542117908008));
976     f153 = f150 + f151;
977     f154 = f152 - f151;
978     f155 = x[29] + x[3];
979     f156 = MUL_C(x[29], COEF_CONST(1.1359069844201433));
980     f157 = MUL_F(f155, FRAC_CONST((-0.1467304744553624)));
981     f158 = MUL_F(x[3], FRAC_CONST(0.8424460355094185));
982     f159 = f156 + f157;
983     f160 = f158 - f157;
984     f161 = f118 - f142;
985     f162 = f118 + f142;
986     f163 = f117 - f141;
987     f164 = f117 + f141;
988     f165 = f124 - f148;
989     f166 = f124 + f148;
990     f167 = f123 - f147;
991     f168 = f123 + f147;
992     f169 = f130 - f154;
993     f170 = f130 + f154;
994     f171 = f129 - f153;
995     f172 = f129 + f153;
996     f173 = f136 - f160;
997     f174 = f136 + f160;
998     f175 = f135 - f159;
999     f176 = f135 + f159;
1000     f177 = f161 + f163;
1001     f178 = MUL_C(f161, COEF_CONST(1.1758756024193588));
1002     f179 = MUL_F(f177, FRAC_CONST((-0.9807852804032304)));
1003     f180 = MUL_F(f163, FRAC_CONST((-0.7856949583871021)));
1004     f181 = f178 + f179;
1005     f182 = f180 - f179;
1006     f183 = f165 + f167;
1007     f184 = MUL_C(f165, COEF_CONST(1.3870398453221475));
1008     f185 = MUL_F(f183, FRAC_CONST((-0.5555702330196022)));
1009     f186 = MUL_F(f167, FRAC_CONST(0.2758993792829431));
1010     f187 = f184 + f185;
1011     f188 = f186 - f185;
1012     f189 = f169 + f171;
1013     f190 = MUL_F(f169, FRAC_CONST(0.7856949583871022));
1014     f191 = MUL_F(f189, FRAC_CONST(0.1950903220161283));
1015     f192 = MUL_C(f171, COEF_CONST(1.1758756024193586));
1016     f193 = f190 + f191;
1017     f194 = f192 - f191;
1018     f195 = f173 + f175;
1019     f196 = MUL_F(f173, FRAC_CONST((-0.2758993792829430)));
1020     f197 = MUL_F(f195, FRAC_CONST(0.8314696123025452));
1021     f198 = MUL_C(f175, COEF_CONST(1.3870398453221475));
1022     f199 = f196 + f197;
1023     f200 = f198 - f197;
1024     f201 = f162 - f170;
1025     f202 = f162 + f170;
1026     f203 = f164 - f172;
1027     f204 = f164 + f172;
1028     f205 = f166 - f174;
1029     f206 = f166 + f174;
1030     f207 = f168 - f176;
1031     f208 = f168 + f176;
1032     f209 = f182 - f194;
1033     f210 = f182 + f194;
1034     f211 = f181 - f193;
1035     f212 = f181 + f193;
1036     f213 = f188 - f200;
1037     f214 = f188 + f200;
1038     f215 = f187 - f199;
1039     f216 = f187 + f199;
1040     f217 = f201 + f203;
1041     f218 = MUL_C(f201, COEF_CONST(1.3065629648763766));
1042     f219 = MUL_F(f217, FRAC_CONST((-0.9238795325112866)));
1043     f220 = MUL_F(f203, FRAC_CONST((-0.5411961001461967)));
1044     f221 = f218 + f219;
1045     f222 = f220 - f219;
1046     f223 = f205 + f207;
1047     f224 = MUL_F(f205, FRAC_CONST(0.5411961001461969));
1048     f225 = MUL_F(f223, FRAC_CONST(0.3826834323650898));
1049     f226 = MUL_C(f207, COEF_CONST(1.3065629648763766));
1050     f227 = f224 + f225;
1051     f228 = f226 - f225;
1052     f229 = f209 + f211;
1053     f230 = MUL_C(f209, COEF_CONST(1.3065629648763766));
1054     f231 = MUL_F(f229, FRAC_CONST((-0.9238795325112866)));
1055     f232 = MUL_F(f211, FRAC_CONST((-0.5411961001461967)));
1056     f233 = f230 + f231;
1057     f234 = f232 - f231;
1058     f235 = f213 + f215;
1059     f236 = MUL_F(f213, FRAC_CONST(0.5411961001461969));
1060     f237 = MUL_F(f235, FRAC_CONST(0.3826834323650898));
1061     f238 = MUL_C(f215, COEF_CONST(1.3065629648763766));
1062     f239 = f236 + f237;
1063     f240 = f238 - f237;
1064     f241 = f202 - f206;
1065     f242 = f202 + f206;
1066     f243 = f204 - f208;
1067     f244 = f204 + f208;
1068     f245 = f222 - f228;
1069     f246 = f222 + f228;
1070     f247 = f221 - f227;
1071     f248 = f221 + f227;
1072     f249 = f210 - f214;
1073     f250 = f210 + f214;
1074     f251 = f212 - f216;
1075     f252 = f212 + f216;
1076     f253 = f234 - f240;
1077     f254 = f234 + f240;
1078     f255 = f233 - f239;
1079     f256 = f233 + f239;
1080     f257 = f241 - f243;
1081     f258 = f241 + f243;
1082     f259 = MUL_F(f257, FRAC_CONST(0.7071067811865474));
1083     f260 = MUL_F(f258, FRAC_CONST(0.7071067811865474));
1084     f261 = f245 - f247;
1085     f262 = f245 + f247;
1086     f263 = MUL_F(f261, FRAC_CONST(0.7071067811865474));
1087     f264 = MUL_F(f262, FRAC_CONST(0.7071067811865474));
1088     f265 = f249 - f251;
1089     f266 = f249 + f251;
1090     f267 = MUL_F(f265, FRAC_CONST(0.7071067811865474));
1091     f268 = MUL_F(f266, FRAC_CONST(0.7071067811865474));
1092     f269 = f253 - f255;
1093     f270 = f253 + f255;
1094     f271 = MUL_F(f269, FRAC_CONST(0.7071067811865474));
1095     f272 = MUL_F(f270, FRAC_CONST(0.7071067811865474));
1096     y[31] = f98 - f242;
1097     y[0] = f98 + f242;
1098     y[30] = f100 - f250;
1099     y[1] = f100 + f250;
1100     y[29] = f102 - f254;
1101     y[2] = f102 + f254;
1102     y[28] = f104 - f246;
1103     y[3] = f104 + f246;
1104     y[27] = f106 - f264;
1105     y[4] = f106 + f264;
1106     y[26] = f108 - f272;
1107     y[5] = f108 + f272;
1108     y[25] = f110 - f268;
1109     y[6] = f110 + f268;
1110     y[24] = f112 - f260;
1111     y[7] = f112 + f260;
1112     y[23] = f111 - f259;
1113     y[8] = f111 + f259;
1114     y[22] = f109 - f267;
1115     y[9] = f109 + f267;
1116     y[21] = f107 - f271;
1117     y[10] = f107 + f271;
1118     y[20] = f105 - f263;
1119     y[11] = f105 + f263;
1120     y[19] = f103 - f248;
1121     y[12] = f103 + f248;
1122     y[18] = f101 - f256;
1123     y[13] = f101 + f256;
1124     y[17] = f99 - f252;
1125     y[14] = f99 + f252;
1126     y[16] = f97 - f244;
1127     y[15] = f97 + f244;
1128 }
1129 
DCT2_32_unscaled(real_t * y,real_t * x)1130 void DCT2_32_unscaled(real_t *y, real_t *x)
1131 {
1132     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10;
1133     real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20;
1134     real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30;
1135     real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40;
1136     real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50;
1137     real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60;
1138     real_t f63, f64, f65, f66, f69, f70, f71, f72, f73, f74;
1139     real_t f75, f76, f77, f78, f79, f80, f81, f83, f85, f86;
1140     real_t f89, f90, f91, f92, f93, f94, f95, f96, f97, f98;
1141     real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108;
1142     real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118;
1143     real_t f119, f120, f121, f122, f123, f124, f127, f128, f129, f130;
1144     real_t f133, f134, f135, f136, f139, f140, f141, f142, f145, f146;
1145     real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156;
1146     real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166;
1147     real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176;
1148     real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186;
1149     real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196;
1150     real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206;
1151     real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216;
1152     real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226;
1153     real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236;
1154     real_t f237, f238, f239, f240, f241, f242, f243, f244, f247, f248;
1155     real_t f249, f250, f253, f254, f255, f256, f259, f260, f261, f262;
1156     real_t f265, f266, f267, f268, f271, f272, f273, f274, f277, f278;
1157     real_t f279, f280, f283, f284, f285, f286;
1158 
1159     f0 = x[0] - x[31];
1160     f1 = x[0] + x[31];
1161     f2 = x[1] - x[30];
1162     f3 = x[1] + x[30];
1163     f4 = x[2] - x[29];
1164     f5 = x[2] + x[29];
1165     f6 = x[3] - x[28];
1166     f7 = x[3] + x[28];
1167     f8 = x[4] - x[27];
1168     f9 = x[4] + x[27];
1169     f10 = x[5] - x[26];
1170     f11 = x[5] + x[26];
1171     f12 = x[6] - x[25];
1172     f13 = x[6] + x[25];
1173     f14 = x[7] - x[24];
1174     f15 = x[7] + x[24];
1175     f16 = x[8] - x[23];
1176     f17 = x[8] + x[23];
1177     f18 = x[9] - x[22];
1178     f19 = x[9] + x[22];
1179     f20 = x[10] - x[21];
1180     f21 = x[10] + x[21];
1181     f22 = x[11] - x[20];
1182     f23 = x[11] + x[20];
1183     f24 = x[12] - x[19];
1184     f25 = x[12] + x[19];
1185     f26 = x[13] - x[18];
1186     f27 = x[13] + x[18];
1187     f28 = x[14] - x[17];
1188     f29 = x[14] + x[17];
1189     f30 = x[15] - x[16];
1190     f31 = x[15] + x[16];
1191     f32 = f1 - f31;
1192     f33 = f1 + f31;
1193     f34 = f3 - f29;
1194     f35 = f3 + f29;
1195     f36 = f5 - f27;
1196     f37 = f5 + f27;
1197     f38 = f7 - f25;
1198     f39 = f7 + f25;
1199     f40 = f9 - f23;
1200     f41 = f9 + f23;
1201     f42 = f11 - f21;
1202     f43 = f11 + f21;
1203     f44 = f13 - f19;
1204     f45 = f13 + f19;
1205     f46 = f15 - f17;
1206     f47 = f15 + f17;
1207     f48 = f33 - f47;
1208     f49 = f33 + f47;
1209     f50 = f35 - f45;
1210     f51 = f35 + f45;
1211     f52 = f37 - f43;
1212     f53 = f37 + f43;
1213     f54 = f39 - f41;
1214     f55 = f39 + f41;
1215     f56 = f49 - f55;
1216     f57 = f49 + f55;
1217     f58 = f51 - f53;
1218     f59 = f51 + f53;
1219     f60 = f57 - f59;
1220     y[0] = f57 + f59;
1221     y[16] = MUL_F(FRAC_CONST(0.7071067811865476), f60);
1222     f63 = f56 + f58;
1223     f64 = MUL_C(COEF_CONST(1.3065629648763766), f56);
1224     f65 = MUL_F(FRAC_CONST(-0.9238795325112866), f63);
1225     f66 = MUL_F(FRAC_CONST(-0.5411961001461967), f58);
1226     y[24] = f64 + f65;
1227     y[8] = f66 - f65;
1228     f69 = f48 + f54;
1229     f70 = MUL_C(COEF_CONST(1.1758756024193588), f48);
1230     f71 = MUL_F(FRAC_CONST(-0.9807852804032304), f69);
1231     f72 = MUL_F(FRAC_CONST(-0.7856949583871021), f54);
1232     f73 = f70 + f71;
1233     f74 = f72 - f71;
1234     f75 = f50 + f52;
1235     f76 = MUL_C(COEF_CONST(1.3870398453221473), f50);
1236     f77 = MUL_F(FRAC_CONST(-0.8314696123025455), f75);
1237     f78 = MUL_F(FRAC_CONST(-0.2758993792829436), f52);
1238     f79 = f76 + f77;
1239     f80 = f78 - f77;
1240     f81 = f74 - f80;
1241     y[4] = f74 + f80;
1242     f83 = MUL_F(FRAC_CONST(0.7071067811865476), f81);
1243     y[28] = f73 - f79;
1244     f85 = f73 + f79;
1245     f86 = MUL_F(FRAC_CONST(0.7071067811865476), f85);
1246     y[20] = f83 - f86;
1247     y[12] = f83 + f86;
1248     f89 = f34 - f36;
1249     f90 = f34 + f36;
1250     f91 = f38 - f40;
1251     f92 = f38 + f40;
1252     f93 = f42 - f44;
1253     f94 = f42 + f44;
1254     f95 = MUL_F(FRAC_CONST(0.7071067811865476), f92);
1255     f96 = f32 - f95;
1256     f97 = f32 + f95;
1257     f98 = f90 + f94;
1258     f99 = MUL_C(COEF_CONST(1.3065629648763766), f90);
1259     f100 = MUL_F(FRAC_CONST(-0.9238795325112866), f98);
1260     f101 = MUL_F(FRAC_CONST(-0.5411961001461967), f94);
1261     f102 = f99 + f100;
1262     f103 = f101 - f100;
1263     f104 = f97 - f103;
1264     f105 = f97 + f103;
1265     f106 = f96 - f102;
1266     f107 = f96 + f102;
1267     f108 = MUL_F(FRAC_CONST(0.7071067811865476), f91);
1268     f109 = f46 - f108;
1269     f110 = f46 + f108;
1270     f111 = f93 + f89;
1271     f112 = MUL_C(COEF_CONST(1.3065629648763766), f93);
1272     f113 = MUL_F(FRAC_CONST(-0.9238795325112866), f111);
1273     f114 = MUL_F(FRAC_CONST(-0.5411961001461967), f89);
1274     f115 = f112 + f113;
1275     f116 = f114 - f113;
1276     f117 = f110 - f116;
1277     f118 = f110 + f116;
1278     f119 = f109 - f115;
1279     f120 = f109 + f115;
1280     f121 = f118 + f105;
1281     f122 = MUL_F(FRAC_CONST(-0.8971675863426361), f118);
1282     f123 = MUL_F(FRAC_CONST(0.9951847266721968), f121);
1283     f124 = MUL_C(COEF_CONST(1.0932018670017576), f105);
1284     y[2] = f122 + f123;
1285     y[30] = f124 - f123;
1286     f127 = f107 - f120;
1287     f128 = MUL_F(FRAC_CONST(-0.6666556584777466), f120);
1288     f129 = MUL_F(FRAC_CONST(0.9569403357322089), f127);
1289     f130 = MUL_C(COEF_CONST(1.2472250129866713), f107);
1290     y[6] = f129 - f128;
1291     y[26] = f130 - f129;
1292     f133 = f119 + f106;
1293     f134 = MUL_F(FRAC_CONST(-0.4105245275223571), f119);
1294     f135 = MUL_F(FRAC_CONST(0.8819212643483549), f133);
1295     f136 = MUL_C(COEF_CONST(1.3533180011743529), f106);
1296     y[10] = f134 + f135;
1297     y[22] = f136 - f135;
1298     f139 = f104 - f117;
1299     f140 = MUL_F(FRAC_CONST(-0.1386171691990915), f117);
1300     f141 = MUL_F(FRAC_CONST(0.7730104533627370), f139);
1301     f142 = MUL_C(COEF_CONST(1.4074037375263826), f104);
1302     y[14] = f141 - f140;
1303     y[18] = f142 - f141;
1304     f145 = f2 - f4;
1305     f146 = f2 + f4;
1306     f147 = f6 - f8;
1307     f148 = f6 + f8;
1308     f149 = f10 - f12;
1309     f150 = f10 + f12;
1310     f151 = f14 - f16;
1311     f152 = f14 + f16;
1312     f153 = f18 - f20;
1313     f154 = f18 + f20;
1314     f155 = f22 - f24;
1315     f156 = f22 + f24;
1316     f157 = f26 - f28;
1317     f158 = f26 + f28;
1318     f159 = MUL_F(FRAC_CONST(0.7071067811865476), f152);
1319     f160 = f0 - f159;
1320     f161 = f0 + f159;
1321     f162 = f148 + f156;
1322     f163 = MUL_C(COEF_CONST(1.3065629648763766), f148);
1323     f164 = MUL_F(FRAC_CONST(-0.9238795325112866), f162);
1324     f165 = MUL_F(FRAC_CONST(-0.5411961001461967), f156);
1325     f166 = f163 + f164;
1326     f167 = f165 - f164;
1327     f168 = f161 - f167;
1328     f169 = f161 + f167;
1329     f170 = f160 - f166;
1330     f171 = f160 + f166;
1331     f172 = f146 + f158;
1332     f173 = MUL_C(COEF_CONST(1.1758756024193588), f146);
1333     f174 = MUL_F(FRAC_CONST(-0.9807852804032304), f172);
1334     f175 = MUL_F(FRAC_CONST(-0.7856949583871021), f158);
1335     f176 = f173 + f174;
1336     f177 = f175 - f174;
1337     f178 = f150 + f154;
1338     f179 = MUL_C(COEF_CONST(1.3870398453221473), f150);
1339     f180 = MUL_F(FRAC_CONST(-0.8314696123025455), f178);
1340     f181 = MUL_F(FRAC_CONST(-0.2758993792829436), f154);
1341     f182 = f179 + f180;
1342     f183 = f181 - f180;
1343     f184 = f177 - f183;
1344     f185 = f177 + f183;
1345     f186 = MUL_F(FRAC_CONST(0.7071067811865476), f184);
1346     f187 = f176 - f182;
1347     f188 = f176 + f182;
1348     f189 = MUL_F(FRAC_CONST(0.7071067811865476), f188);
1349     f190 = f186 - f189;
1350     f191 = f186 + f189;
1351     f192 = f169 - f185;
1352     f193 = f169 + f185;
1353     f194 = f171 - f191;
1354     f195 = f171 + f191;
1355     f196 = f170 - f190;
1356     f197 = f170 + f190;
1357     f198 = f168 - f187;
1358     f199 = f168 + f187;
1359     f200 = MUL_F(FRAC_CONST(0.7071067811865476), f151);
1360     f201 = f30 - f200;
1361     f202 = f30 + f200;
1362     f203 = f155 + f147;
1363     f204 = MUL_C(COEF_CONST(1.3065629648763766), f155);
1364     f205 = MUL_F(FRAC_CONST(-0.9238795325112866), f203);
1365     f206 = MUL_F(FRAC_CONST(-0.5411961001461967), f147);
1366     f207 = f204 + f205;
1367     f208 = f206 - f205;
1368     f209 = f202 - f208;
1369     f210 = f202 + f208;
1370     f211 = f201 - f207;
1371     f212 = f201 + f207;
1372     f213 = f157 + f145;
1373     f214 = MUL_C(COEF_CONST(1.1758756024193588), f157);
1374     f215 = MUL_F(FRAC_CONST(-0.9807852804032304), f213);
1375     f216 = MUL_F(FRAC_CONST(-0.7856949583871021), f145);
1376     f217 = f214 + f215;
1377     f218 = f216 - f215;
1378     f219 = f153 + f149;
1379     f220 = MUL_C(COEF_CONST(1.3870398453221473), f153);
1380     f221 = MUL_F(FRAC_CONST(-0.8314696123025455), f219);
1381     f222 = MUL_F(FRAC_CONST(-0.2758993792829436), f149);
1382     f223 = f220 + f221;
1383     f224 = f222 - f221;
1384     f225 = f218 - f224;
1385     f226 = f218 + f224;
1386     f227 = MUL_F(FRAC_CONST(0.7071067811865476), f225);
1387     f228 = f217 - f223;
1388     f229 = f217 + f223;
1389     f230 = MUL_F(FRAC_CONST(0.7071067811865476), f229);
1390     f231 = f227 - f230;
1391     f232 = f227 + f230;
1392     f233 = f210 - f226;
1393     f234 = f210 + f226;
1394     f235 = f212 - f232;
1395     f236 = f212 + f232;
1396     f237 = f211 - f231;
1397     f238 = f211 + f231;
1398     f239 = f209 - f228;
1399     f240 = f209 + f228;
1400     f241 = f234 + f193;
1401     f242 = MUL_F(FRAC_CONST(-0.9497277818777543), f234);
1402     f243 = MUL_F(FRAC_CONST(0.9987954562051724), f241);
1403     f244 = MUL_C(COEF_CONST(1.0478631305325905), f193);
1404     y[1] = f242 + f243;
1405     y[31] = f244 - f243;
1406     f247 = f195 - f236;
1407     f248 = MUL_F(FRAC_CONST(-0.8424460355094192), f236);
1408     f249 = MUL_F(FRAC_CONST(0.9891765099647810), f247);
1409     f250 = MUL_C(COEF_CONST(1.1359069844201428), f195);
1410     y[3] = f249 - f248;
1411     y[29] = f250 - f249;
1412     f253 = f238 + f197;
1413     f254 = MUL_F(FRAC_CONST(-0.7270510732912801), f238);
1414     f255 = MUL_F(FRAC_CONST(0.9700312531945440), f253);
1415     f256 = MUL_C(COEF_CONST(1.2130114330978079), f197);
1416     y[5] = f254 + f255;
1417     y[27] = f256 - f255;
1418     f259 = f199 - f240;
1419     f260 = MUL_F(FRAC_CONST(-0.6046542117908007), f240);
1420     f261 = MUL_F(FRAC_CONST(0.9415440651830208), f259);
1421     f262 = MUL_C(COEF_CONST(1.2784339185752409), f199);
1422     y[7] = f261 - f260;
1423     y[25] = f262 - f261;
1424     f265 = f239 + f198;
1425     f266 = MUL_F(FRAC_CONST(-0.4764341996931611), f239);
1426     f267 = MUL_F(FRAC_CONST(0.9039892931234433), f265);
1427     f268 = MUL_C(COEF_CONST(1.3315443865537255), f198);
1428     y[9] = f266 + f267;
1429     y[23] = f268 - f267;
1430     f271 = f196 - f237;
1431     f272 = MUL_F(FRAC_CONST(-0.3436258658070505), f237);
1432     f273 = MUL_F(FRAC_CONST(0.8577286100002721), f271);
1433     f274 = MUL_C(COEF_CONST(1.3718313541934939), f196);
1434     y[11] = f273 - f272;
1435     y[21] = f274 - f273;
1436     f277 = f235 + f194;
1437     f278 = MUL_F(FRAC_CONST(-0.2075082269882114), f235);
1438     f279 = MUL_F(FRAC_CONST(0.8032075314806448), f277);
1439     f280 = MUL_C(COEF_CONST(1.3989068359730783), f194);
1440     y[13] = f278 + f279;
1441     y[19] = f280 - f279;
1442     f283 = f192 - f233;
1443     f284 = MUL_F(FRAC_CONST(-0.0693921705079408), f233);
1444     f285 = MUL_F(FRAC_CONST(0.7409511253549591), f283);
1445     f286 = MUL_C(COEF_CONST(1.4125100802019774), f192);
1446     y[15] = f285 - f284;
1447     y[17] = f286 - f285;
1448 }
1449 
1450 #else
1451 
1452 
1453 #define n 32
1454 #define log2n 5
1455 
1456 // w_array_real[i] = cos(2*M_PI*i/32)
1457 static const real_t w_array_real[] = {
1458     FRAC_CONST(1.000000000000000), FRAC_CONST(0.980785279337272),
1459     FRAC_CONST(0.923879528329380), FRAC_CONST(0.831469603195765),
1460     FRAC_CONST(0.707106765732237), FRAC_CONST(0.555570210304169),
1461     FRAC_CONST(0.382683402077046), FRAC_CONST(0.195090284503576),
1462     FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090370246552),
1463     FRAC_CONST(-0.382683482845162), FRAC_CONST(-0.555570282993553),
1464     FRAC_CONST(-0.707106827549476), FRAC_CONST(-0.831469651765257),
1465     FRAC_CONST(-0.923879561784627), FRAC_CONST(-0.980785296392607)
1466 };
1467 
1468 // w_array_imag[i] = sin(-2*M_PI*i/32)
1469 static const real_t w_array_imag[] = {
1470     FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090327375064),
1471     FRAC_CONST(-0.382683442461104), FRAC_CONST(-0.555570246648862),
1472     FRAC_CONST(-0.707106796640858), FRAC_CONST(-0.831469627480512),
1473     FRAC_CONST(-0.923879545057005), FRAC_CONST(-0.980785287864940),
1474     FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.980785270809601),
1475     FRAC_CONST(-0.923879511601754), FRAC_CONST(-0.831469578911016),
1476     FRAC_CONST(-0.707106734823616), FRAC_CONST(-0.555570173959476),
1477     FRAC_CONST(-0.382683361692986), FRAC_CONST(-0.195090241632088)
1478 };
1479 
1480 // FFT decimation in frequency
1481 // 4*16*2+16=128+16=144 multiplications
1482 // 6*16*2+10*8+4*16*2=192+80+128=400 additions
fft_dif(real_t * Real,real_t * Imag)1483 static void fft_dif(real_t * Real, real_t * Imag)
1484 {
1485     real_t w_real, w_imag; // For faster access
1486     real_t point1_real, point1_imag, point2_real, point2_imag; // For faster access
1487     uint32_t j, i, i2, w_index; // Counters
1488 
1489     // First 2 stages of 32 point FFT decimation in frequency
1490     // 4*16*2=64*2=128 multiplications
1491     // 6*16*2=96*2=192 additions
1492 	// Stage 1 of 32 point FFT decimation in frequency
1493     for (i = 0; i < 16; i++)
1494     {
1495         point1_real = Real[i];
1496         point1_imag = Imag[i];
1497         i2 = i+16;
1498         point2_real = Real[i2];
1499         point2_imag = Imag[i2];
1500 
1501         w_real = w_array_real[i];
1502         w_imag = w_array_imag[i];
1503 
1504         // temp1 = x[i] - x[i2]
1505         point1_real -= point2_real;
1506         point1_imag -= point2_imag;
1507 
1508         // x[i1] = x[i] + x[i2]
1509         Real[i] += point2_real;
1510         Imag[i] += point2_imag;
1511 
1512         // x[i2] = (x[i] - x[i2]) * w
1513         Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag));
1514         Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real));
1515      }
1516     // Stage 2 of 32 point FFT decimation in frequency
1517     for (j = 0, w_index = 0; j < 8; j++, w_index += 2)
1518     {
1519         w_real = w_array_real[w_index];
1520         w_imag = w_array_imag[w_index];
1521 
1522     	i = j;
1523         point1_real = Real[i];
1524         point1_imag = Imag[i];
1525         i2 = i+8;
1526         point2_real = Real[i2];
1527         point2_imag = Imag[i2];
1528 
1529         // temp1 = x[i] - x[i2]
1530         point1_real -= point2_real;
1531         point1_imag -= point2_imag;
1532 
1533         // x[i1] = x[i] + x[i2]
1534         Real[i] += point2_real;
1535         Imag[i] += point2_imag;
1536 
1537         // x[i2] = (x[i] - x[i2]) * w
1538         Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag));
1539         Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real));
1540 
1541         i = j+16;
1542         point1_real = Real[i];
1543         point1_imag = Imag[i];
1544         i2 = i+8;
1545         point2_real = Real[i2];
1546         point2_imag = Imag[i2];
1547 
1548         // temp1 = x[i] - x[i2]
1549         point1_real -= point2_real;
1550         point1_imag -= point2_imag;
1551 
1552         // x[i1] = x[i] + x[i2]
1553         Real[i] += point2_real;
1554         Imag[i] += point2_imag;
1555 
1556         // x[i2] = (x[i] - x[i2]) * w
1557         Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag));
1558         Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real));
1559     }
1560 
1561     // Stage 3 of 32 point FFT decimation in frequency
1562     // 2*4*2=16 multiplications
1563     // 4*4*2+6*4*2=10*8=80 additions
1564     for (i = 0; i < n; i += 8)
1565     {
1566         i2 = i+4;
1567         point1_real = Real[i];
1568         point1_imag = Imag[i];
1569 
1570         point2_real = Real[i2];
1571         point2_imag = Imag[i2];
1572 
1573         // out[i1] = point1 + point2
1574         Real[i] += point2_real;
1575         Imag[i] += point2_imag;
1576 
1577         // out[i2] = point1 - point2
1578         Real[i2] = point1_real - point2_real;
1579         Imag[i2] = point1_imag - point2_imag;
1580     }
1581     w_real = w_array_real[4]; // = sqrt(2)/2
1582     // w_imag = -w_real; // = w_array_imag[4]; // = -sqrt(2)/2
1583     for (i = 1; i < n; i += 8)
1584     {
1585         i2 = i+4;
1586         point1_real = Real[i];
1587         point1_imag = Imag[i];
1588 
1589         point2_real = Real[i2];
1590         point2_imag = Imag[i2];
1591 
1592         // temp1 = x[i] - x[i2]
1593         point1_real -= point2_real;
1594         point1_imag -= point2_imag;
1595 
1596         // x[i1] = x[i] + x[i2]
1597         Real[i] += point2_real;
1598         Imag[i] += point2_imag;
1599 
1600         // x[i2] = (x[i] - x[i2]) * w
1601         Real[i2] = MUL_F(point1_real+point1_imag, w_real);
1602         Imag[i2] = MUL_F(point1_imag-point1_real, w_real);
1603     }
1604     for (i = 2; i < n; i += 8)
1605     {
1606         i2 = i+4;
1607         point1_real = Real[i];
1608         point1_imag = Imag[i];
1609 
1610         point2_real = Real[i2];
1611         point2_imag = Imag[i2];
1612 
1613         // x[i] = x[i] + x[i2]
1614         Real[i] += point2_real;
1615         Imag[i] += point2_imag;
1616 
1617         // x[i2] = (x[i] - x[i2]) * (-i)
1618         Real[i2] = point1_imag - point2_imag;
1619         Imag[i2] = point2_real - point1_real;
1620     }
1621     w_real = w_array_real[12]; // = -sqrt(2)/2
1622     // w_imag = w_real; // = w_array_imag[12]; // = -sqrt(2)/2
1623     for (i = 3; i < n; i += 8)
1624     {
1625         i2 = i+4;
1626         point1_real = Real[i];
1627         point1_imag = Imag[i];
1628 
1629         point2_real = Real[i2];
1630         point2_imag = Imag[i2];
1631 
1632         // temp1 = x[i] - x[i2]
1633         point1_real -= point2_real;
1634         point1_imag -= point2_imag;
1635 
1636         // x[i1] = x[i] + x[i2]
1637         Real[i] += point2_real;
1638         Imag[i] += point2_imag;
1639 
1640         // x[i2] = (x[i] - x[i2]) * w
1641         Real[i2] = MUL_F(point1_real-point1_imag, w_real);
1642         Imag[i2] = MUL_F(point1_real+point1_imag, w_real);
1643     }
1644 
1645 
1646     // Stage 4 of 32 point FFT decimation in frequency (no multiplications)
1647     // 16*4=64 additions
1648     for (i = 0; i < n; i += 4)
1649     {
1650         i2 = i+2;
1651         point1_real = Real[i];
1652         point1_imag = Imag[i];
1653 
1654         point2_real = Real[i2];
1655         point2_imag = Imag[i2];
1656 
1657         // x[i1] = x[i] + x[i2]
1658         Real[i] += point2_real;
1659         Imag[i] += point2_imag;
1660 
1661         // x[i2] = x[i] - x[i2]
1662         Real[i2] = point1_real - point2_real;
1663         Imag[i2] = point1_imag - point2_imag;
1664     }
1665     for (i = 1; i < n; i += 4)
1666     {
1667         i2 = i+2;
1668         point1_real = Real[i];
1669         point1_imag = Imag[i];
1670 
1671         point2_real = Real[i2];
1672         point2_imag = Imag[i2];
1673 
1674         // x[i] = x[i] + x[i2]
1675         Real[i] += point2_real;
1676         Imag[i] += point2_imag;
1677 
1678         // x[i2] = (x[i] - x[i2]) * (-i)
1679         Real[i2] = point1_imag - point2_imag;
1680         Imag[i2] = point2_real - point1_real;
1681     }
1682 
1683     // Stage 5 of 32 point FFT decimation in frequency (no multiplications)
1684     // 16*4=64 additions
1685     for (i = 0; i < n; i += 2)
1686     {
1687         i2 = i+1;
1688         point1_real = Real[i];
1689         point1_imag = Imag[i];
1690 
1691         point2_real = Real[i2];
1692         point2_imag = Imag[i2];
1693 
1694         // out[i1] = point1 + point2
1695         Real[i] += point2_real;
1696         Imag[i] += point2_imag;
1697 
1698         // out[i2] = point1 - point2
1699         Real[i2] = point1_real - point2_real;
1700         Imag[i2] = point1_imag - point2_imag;
1701     }
1702 
1703 #ifdef REORDER_IN_FFT
1704     FFTReorder(Real, Imag);
1705 #endif // #ifdef REORDER_IN_FFT
1706 }
1707 #undef n
1708 #undef log2n
1709 
1710 static const real_t dct4_64_tab[] = {
1711     COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507),
1712     COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537),
1713     COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708),
1714     COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462),
1715     COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627),
1716     COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471),
1717     COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592),
1718     COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979),
1719     COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146),
1720     COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291),
1721     COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091),
1722     COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643),
1723     COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127),
1724     COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700),
1725     COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423),
1726     COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828),
1727     COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626),
1728     COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974),
1729     COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658),
1730     COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784),
1731     COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981),
1732     COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980),
1733     COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093),
1734     COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162),
1735     COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640),
1736     COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904),
1737     COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420),
1738     COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944),
1739     COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476),
1740     COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670),
1741     COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128),
1742     COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182),
1743     COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388),
1744     COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101),
1745     COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759),
1746     COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140),
1747     COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596),
1748     COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318),
1749     COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446),
1750     COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152),
1751     COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704),
1752     COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322),
1753     COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238),
1754     COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981),
1755     COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577),
1756     COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592),
1757     COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960),
1758     COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205),
1759     COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734),
1760     COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526),
1761     COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092),
1762     COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721),
1763     COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959),
1764     COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014),
1765     COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227),
1766     COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424),
1767     COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756),
1768     COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734),
1769     COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437),
1770     COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838),
1771     COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899),
1772     COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223),
1773     COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439),
1774     COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320),
1775     COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086),
1776     COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159),
1777     COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605),
1778     COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942),
1779     COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475),
1780     COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740),
1781     COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961),
1782     COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470),
1783     COEF_CONST(0), COEF_CONST(-1.412510156631470),
1784     COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961),
1785     COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740),
1786     COEF_CONST(-1.353317975997925), COEF_CONST(-1.331544399261475),
1787     COEF_CONST(-1.306562900543213), COEF_CONST(-1.278433918952942),
1788     COEF_CONST(-1.247225046157837), COEF_CONST(-1.213011384010315),
1789     COEF_CONST(-1.175875544548035), COEF_CONST(-1.135907053947449),
1790     COEF_CONST(-1.093201875686646), COEF_CONST(-1.047863125801086),
1791     COEF_CONST(-1.000000000000000), COEF_CONST(-0.949727773666382),
1792     COEF_CONST(-0.897167563438416), COEF_CONST(-0.842446029186249),
1793     COEF_CONST(-0.785694956779480), COEF_CONST(-0.727051079273224),
1794     COEF_CONST(-0.666655659675598), COEF_CONST(-0.604654192924500),
1795     COEF_CONST(-0.541196048259735), COEF_CONST(-0.476434230804443),
1796     COEF_CONST(-0.410524487495422), COEF_CONST(-0.343625843524933),
1797     COEF_CONST(-0.275899350643158), COEF_CONST(-0.207508206367493),
1798     COEF_CONST(-0.138617098331451), COEF_CONST(-0.069392144680023),
1799     COEF_CONST(0), COEF_CONST(0.069392263889313),
1800     COEF_CONST(0.138617157936096), COEF_CONST(0.207508206367493),
1801     COEF_CONST(0.275899469852448), COEF_CONST(0.343625962734222),
1802     COEF_CONST(0.410524636507034), COEF_CONST(0.476434201002121),
1803     COEF_CONST(0.541196107864380), COEF_CONST(0.604654192924500),
1804     COEF_CONST(0.666655719280243), COEF_CONST(0.727051138877869),
1805     COEF_CONST(0.785695075988770), COEF_CONST(0.842446029186249),
1806     COEF_CONST(0.897167563438416), COEF_CONST(0.949727773666382)
1807 };
1808 
1809 /* size 64 only! */
dct4_kernel(real_t * in_real,real_t * in_imag,real_t * out_real,real_t * out_imag)1810 void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag)
1811 {
1812     // Tables with bit reverse values for 5 bits, bit reverse of i at i-th position
1813     const uint8_t bit_rev_tab[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 };
1814     uint16_t i, i_rev;
1815 
1816     /* Step 2: modulate */
1817     // 3*32=96 multiplications
1818     // 3*32=96 additions
1819     for (i = 0; i < 32; i++)
1820     {
1821     	real_t x_re, x_im, tmp;
1822     	x_re = in_real[i];
1823     	x_im = in_imag[i];
1824         tmp =        MUL_C(x_re + x_im, dct4_64_tab[i]);
1825         in_real[i] = MUL_C(x_im, dct4_64_tab[i + 64]) + tmp;
1826         in_imag[i] = MUL_C(x_re, dct4_64_tab[i + 32]) + tmp;
1827     }
1828 
1829     /* Step 3: FFT, but with output in bit reverse order */
1830     fft_dif(in_real, in_imag);
1831 
1832     /* Step 4: modulate + bitreverse reordering */
1833     // 3*31+2=95 multiplications
1834     // 3*31+2=95 additions
1835     for (i = 0; i < 16; i++)
1836     {
1837     	real_t x_re, x_im, tmp;
1838     	i_rev = bit_rev_tab[i];
1839     	x_re = in_real[i_rev];
1840     	x_im = in_imag[i_rev];
1841 
1842         tmp =         MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]);
1843         out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp;
1844         out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp;
1845     }
1846     // i = 16, i_rev = 1 = rev(16);
1847     out_imag[16] = MUL_C(in_imag[1] - in_real[1], dct4_64_tab[16 + 3*32]);
1848     out_real[16] = MUL_C(in_real[1] + in_imag[1], dct4_64_tab[16 + 3*32]);
1849     for (i = 17; i < 32; i++)
1850     {
1851     	real_t x_re, x_im, tmp;
1852     	i_rev = bit_rev_tab[i];
1853     	x_re = in_real[i_rev];
1854     	x_im = in_imag[i_rev];
1855         tmp =         MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]);
1856         out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp;
1857         out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp;
1858     }
1859 
1860 }
1861 
DST4_32(real_t * y,real_t * x)1862 void DST4_32(real_t *y, real_t *x)
1863 {
1864     real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9;
1865     real_t f10, f11, f12, f13, f14, f15, f16, f17, f18, f19;
1866     real_t f20, f21, f22, f23, f24, f25, f26, f27, f28, f29;
1867     real_t f30, f31, f32, f33, f34, f35, f36, f37, f38, f39;
1868     real_t f40, f41, f42, f43, f44, f45, f46, f47, f48, f49;
1869     real_t f50, f51, f52, f53, f54, f55, f56, f57, f58, f59;
1870     real_t f60, f61, f62, f63, f64, f65, f66, f67, f68, f69;
1871     real_t f70, f71, f72, f73, f74, f75, f76, f77, f78, f79;
1872     real_t f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
1873     real_t f90, f91, f92, f93, f94, f95, f96, f97, f98, f99;
1874     real_t f100, f101, f102, f103, f104, f105, f106, f107, f108, f109;
1875     real_t f110, f111, f112, f113, f114, f115, f116, f117, f118, f119;
1876     real_t f120, f121, f122, f123, f124, f125, f126, f127, f128, f129;
1877     real_t f130, f131, f132, f133, f134, f135, f136, f137, f138, f139;
1878     real_t f140, f141, f142, f143, f144, f145, f146, f147, f148, f149;
1879     real_t f150, f151, f152, f153, f154, f155, f156, f157, f158, f159;
1880     real_t f160, f161, f162, f163, f164, f165, f166, f167, f168, f169;
1881     real_t f170, f171, f172, f173, f174, f175, f176, f177, f178, f179;
1882     real_t f180, f181, f182, f183, f184, f185, f186, f187, f188, f189;
1883     real_t f190, f191, f192, f193, f194, f195, f196, f197, f198, f199;
1884     real_t f200, f201, f202, f203, f204, f205, f206, f207, f208, f209;
1885     real_t f210, f211, f212, f213, f214, f215, f216, f217, f218, f219;
1886     real_t f220, f221, f222, f223, f224, f225, f226, f227, f228, f229;
1887     real_t f230, f231, f232, f233, f234, f235, f236, f237, f238, f239;
1888     real_t f240, f241, f242, f243, f244, f245, f246, f247, f248, f249;
1889     real_t f250, f251, f252, f253, f254, f255, f256, f257, f258, f259;
1890     real_t f260, f261, f262, f263, f264, f265, f266, f267, f268, f269;
1891     real_t f270, f271, f272, f273, f274, f275, f276, f277, f278, f279;
1892     real_t f280, f281, f282, f283, f284, f285, f286, f287, f288, f289;
1893     real_t f290, f291, f292, f293, f294, f295, f296, f297, f298, f299;
1894     real_t f300, f301, f302, f303, f304, f305, f306, f307, f308, f309;
1895     real_t f310, f311, f312, f313, f314, f315, f316, f317, f318, f319;
1896     real_t f320, f321, f322, f323, f324, f325, f326, f327, f328, f329;
1897     real_t f330, f331, f332, f333, f334, f335;
1898 
1899     f0 = x[0] - x[1];
1900     f1 = x[2] - x[1];
1901     f2 = x[2] - x[3];
1902     f3 = x[4] - x[3];
1903     f4 = x[4] - x[5];
1904     f5 = x[6] - x[5];
1905     f6 = x[6] - x[7];
1906     f7 = x[8] - x[7];
1907     f8 = x[8] - x[9];
1908     f9 = x[10] - x[9];
1909     f10 = x[10] - x[11];
1910     f11 = x[12] - x[11];
1911     f12 = x[12] - x[13];
1912     f13 = x[14] - x[13];
1913     f14 = x[14] - x[15];
1914     f15 = x[16] - x[15];
1915     f16 = x[16] - x[17];
1916     f17 = x[18] - x[17];
1917     f18 = x[18] - x[19];
1918     f19 = x[20] - x[19];
1919     f20 = x[20] - x[21];
1920     f21 = x[22] - x[21];
1921     f22 = x[22] - x[23];
1922     f23 = x[24] - x[23];
1923     f24 = x[24] - x[25];
1924     f25 = x[26] - x[25];
1925     f26 = x[26] - x[27];
1926     f27 = x[28] - x[27];
1927     f28 = x[28] - x[29];
1928     f29 = x[30] - x[29];
1929     f30 = x[30] - x[31];
1930     f31 = MUL_F(FRAC_CONST(0.7071067811865476), f15);
1931     f32 = x[0] - f31;
1932     f33 = x[0] + f31;
1933     f34 = f7 + f23;
1934     f35 = MUL_C(COEF_CONST(1.3065629648763766), f7);
1935     f36 = MUL_F(FRAC_CONST(-0.9238795325112866), f34);
1936     f37 = MUL_F(FRAC_CONST(-0.5411961001461967), f23);
1937     f38 = f35 + f36;
1938     f39 = f37 - f36;
1939     f40 = f33 - f39;
1940     f41 = f33 + f39;
1941     f42 = f32 - f38;
1942     f43 = f32 + f38;
1943     f44 = f11 - f19;
1944     f45 = f11 + f19;
1945     f46 = MUL_F(FRAC_CONST(0.7071067811865476), f45);
1946     f47 = f3 - f46;
1947     f48 = f3 + f46;
1948     f49 = MUL_F(FRAC_CONST(0.7071067811865476), f44);
1949     f50 = f49 - f27;
1950     f51 = f49 + f27;
1951     f52 = f51 + f48;
1952     f53 = MUL_F(FRAC_CONST(-0.7856949583871021), f51);
1953     f54 = MUL_F(FRAC_CONST(0.9807852804032304), f52);
1954     f55 = MUL_C(COEF_CONST(1.1758756024193588), f48);
1955     f56 = f53 + f54;
1956     f57 = f55 - f54;
1957     f58 = f50 + f47;
1958     f59 = MUL_F(FRAC_CONST(-0.2758993792829430), f50);
1959     f60 = MUL_F(FRAC_CONST(0.8314696123025452), f58);
1960     f61 = MUL_C(COEF_CONST(1.3870398453221475), f47);
1961     f62 = f59 + f60;
1962     f63 = f61 - f60;
1963     f64 = f41 - f56;
1964     f65 = f41 + f56;
1965     f66 = f43 - f62;
1966     f67 = f43 + f62;
1967     f68 = f42 - f63;
1968     f69 = f42 + f63;
1969     f70 = f40 - f57;
1970     f71 = f40 + f57;
1971     f72 = f5 - f9;
1972     f73 = f5 + f9;
1973     f74 = f13 - f17;
1974     f75 = f13 + f17;
1975     f76 = f21 - f25;
1976     f77 = f21 + f25;
1977     f78 = MUL_F(FRAC_CONST(0.7071067811865476), f75);
1978     f79 = f1 - f78;
1979     f80 = f1 + f78;
1980     f81 = f73 + f77;
1981     f82 = MUL_C(COEF_CONST(1.3065629648763766), f73);
1982     f83 = MUL_F(FRAC_CONST(-0.9238795325112866), f81);
1983     f84 = MUL_F(FRAC_CONST(-0.5411961001461967), f77);
1984     f85 = f82 + f83;
1985     f86 = f84 - f83;
1986     f87 = f80 - f86;
1987     f88 = f80 + f86;
1988     f89 = f79 - f85;
1989     f90 = f79 + f85;
1990     f91 = MUL_F(FRAC_CONST(0.7071067811865476), f74);
1991     f92 = f29 - f91;
1992     f93 = f29 + f91;
1993     f94 = f76 + f72;
1994     f95 = MUL_C(COEF_CONST(1.3065629648763766), f76);
1995     f96 = MUL_F(FRAC_CONST(-0.9238795325112866), f94);
1996     f97 = MUL_F(FRAC_CONST(-0.5411961001461967), f72);
1997     f98 = f95 + f96;
1998     f99 = f97 - f96;
1999     f100 = f93 - f99;
2000     f101 = f93 + f99;
2001     f102 = f92 - f98;
2002     f103 = f92 + f98;
2003     f104 = f101 + f88;
2004     f105 = MUL_F(FRAC_CONST(-0.8971675863426361), f101);
2005     f106 = MUL_F(FRAC_CONST(0.9951847266721968), f104);
2006     f107 = MUL_C(COEF_CONST(1.0932018670017576), f88);
2007     f108 = f105 + f106;
2008     f109 = f107 - f106;
2009     f110 = f90 - f103;
2010     f111 = MUL_F(FRAC_CONST(-0.6666556584777466), f103);
2011     f112 = MUL_F(FRAC_CONST(0.9569403357322089), f110);
2012     f113 = MUL_C(COEF_CONST(1.2472250129866713), f90);
2013     f114 = f112 - f111;
2014     f115 = f113 - f112;
2015     f116 = f102 + f89;
2016     f117 = MUL_F(FRAC_CONST(-0.4105245275223571), f102);
2017     f118 = MUL_F(FRAC_CONST(0.8819212643483549), f116);
2018     f119 = MUL_C(COEF_CONST(1.3533180011743529), f89);
2019     f120 = f117 + f118;
2020     f121 = f119 - f118;
2021     f122 = f87 - f100;
2022     f123 = MUL_F(FRAC_CONST(-0.1386171691990915), f100);
2023     f124 = MUL_F(FRAC_CONST(0.7730104533627370), f122);
2024     f125 = MUL_C(COEF_CONST(1.4074037375263826), f87);
2025     f126 = f124 - f123;
2026     f127 = f125 - f124;
2027     f128 = f65 - f108;
2028     f129 = f65 + f108;
2029     f130 = f67 - f114;
2030     f131 = f67 + f114;
2031     f132 = f69 - f120;
2032     f133 = f69 + f120;
2033     f134 = f71 - f126;
2034     f135 = f71 + f126;
2035     f136 = f70 - f127;
2036     f137 = f70 + f127;
2037     f138 = f68 - f121;
2038     f139 = f68 + f121;
2039     f140 = f66 - f115;
2040     f141 = f66 + f115;
2041     f142 = f64 - f109;
2042     f143 = f64 + f109;
2043     f144 = f0 + f30;
2044     f145 = MUL_C(COEF_CONST(1.0478631305325901), f0);
2045     f146 = MUL_F(FRAC_CONST(-0.9987954562051724), f144);
2046     f147 = MUL_F(FRAC_CONST(-0.9497277818777548), f30);
2047     f148 = f145 + f146;
2048     f149 = f147 - f146;
2049     f150 = f4 + f26;
2050     f151 = MUL_F(FRAC_CONST(1.2130114330978077), f4);
2051     f152 = MUL_F(FRAC_CONST(-0.9700312531945440), f150);
2052     f153 = MUL_F(FRAC_CONST(-0.7270510732912803), f26);
2053     f154 = f151 + f152;
2054     f155 = f153 - f152;
2055     f156 = f8 + f22;
2056     f157 = MUL_C(COEF_CONST(1.3315443865537255), f8);
2057     f158 = MUL_F(FRAC_CONST(-0.9039892931234433), f156);
2058     f159 = MUL_F(FRAC_CONST(-0.4764341996931612), f22);
2059     f160 = f157 + f158;
2060     f161 = f159 - f158;
2061     f162 = f12 + f18;
2062     f163 = MUL_C(COEF_CONST(1.3989068359730781), f12);
2063     f164 = MUL_F(FRAC_CONST(-0.8032075314806453), f162);
2064     f165 = MUL_F(FRAC_CONST(-0.2075082269882124), f18);
2065     f166 = f163 + f164;
2066     f167 = f165 - f164;
2067     f168 = f16 + f14;
2068     f169 = MUL_C(COEF_CONST(1.4125100802019777), f16);
2069     f170 = MUL_F(FRAC_CONST(-0.6715589548470187), f168);
2070     f171 = MUL_F(FRAC_CONST(0.0693921705079402), f14);
2071     f172 = f169 + f170;
2072     f173 = f171 - f170;
2073     f174 = f20 + f10;
2074     f175 = MUL_C(COEF_CONST(1.3718313541934939), f20);
2075     f176 = MUL_F(FRAC_CONST(-0.5141027441932219), f174);
2076     f177 = MUL_F(FRAC_CONST(0.3436258658070501), f10);
2077     f178 = f175 + f176;
2078     f179 = f177 - f176;
2079     f180 = f24 + f6;
2080     f181 = MUL_C(COEF_CONST(1.2784339185752409), f24);
2081     f182 = MUL_F(FRAC_CONST(-0.3368898533922200), f180);
2082     f183 = MUL_F(FRAC_CONST(0.6046542117908008), f6);
2083     f184 = f181 + f182;
2084     f185 = f183 - f182;
2085     f186 = f28 + f2;
2086     f187 = MUL_C(COEF_CONST(1.1359069844201433), f28);
2087     f188 = MUL_F(FRAC_CONST(-0.1467304744553624), f186);
2088     f189 = MUL_F(FRAC_CONST(0.8424460355094185), f2);
2089     f190 = f187 + f188;
2090     f191 = f189 - f188;
2091     f192 = f149 - f173;
2092     f193 = f149 + f173;
2093     f194 = f148 - f172;
2094     f195 = f148 + f172;
2095     f196 = f155 - f179;
2096     f197 = f155 + f179;
2097     f198 = f154 - f178;
2098     f199 = f154 + f178;
2099     f200 = f161 - f185;
2100     f201 = f161 + f185;
2101     f202 = f160 - f184;
2102     f203 = f160 + f184;
2103     f204 = f167 - f191;
2104     f205 = f167 + f191;
2105     f206 = f166 - f190;
2106     f207 = f166 + f190;
2107     f208 = f192 + f194;
2108     f209 = MUL_C(COEF_CONST(1.1758756024193588), f192);
2109     f210 = MUL_F(FRAC_CONST(-0.9807852804032304), f208);
2110     f211 = MUL_F(FRAC_CONST(-0.7856949583871021), f194);
2111     f212 = f209 + f210;
2112     f213 = f211 - f210;
2113     f214 = f196 + f198;
2114     f215 = MUL_C(COEF_CONST(1.3870398453221475), f196);
2115     f216 = MUL_F(FRAC_CONST(-0.5555702330196022), f214);
2116     f217 = MUL_F(FRAC_CONST(0.2758993792829431), f198);
2117     f218 = f215 + f216;
2118     f219 = f217 - f216;
2119     f220 = f200 + f202;
2120     f221 = MUL_F(FRAC_CONST(0.7856949583871022), f200);
2121     f222 = MUL_F(FRAC_CONST(0.1950903220161283), f220);
2122     f223 = MUL_C(COEF_CONST(1.1758756024193586), f202);
2123     f224 = f221 + f222;
2124     f225 = f223 - f222;
2125     f226 = f204 + f206;
2126     f227 = MUL_F(FRAC_CONST(-0.2758993792829430), f204);
2127     f228 = MUL_F(FRAC_CONST(0.8314696123025452), f226);
2128     f229 = MUL_C(COEF_CONST(1.3870398453221475), f206);
2129     f230 = f227 + f228;
2130     f231 = f229 - f228;
2131     f232 = f193 - f201;
2132     f233 = f193 + f201;
2133     f234 = f195 - f203;
2134     f235 = f195 + f203;
2135     f236 = f197 - f205;
2136     f237 = f197 + f205;
2137     f238 = f199 - f207;
2138     f239 = f199 + f207;
2139     f240 = f213 - f225;
2140     f241 = f213 + f225;
2141     f242 = f212 - f224;
2142     f243 = f212 + f224;
2143     f244 = f219 - f231;
2144     f245 = f219 + f231;
2145     f246 = f218 - f230;
2146     f247 = f218 + f230;
2147     f248 = f232 + f234;
2148     f249 = MUL_C(COEF_CONST(1.3065629648763766), f232);
2149     f250 = MUL_F(FRAC_CONST(-0.9238795325112866), f248);
2150     f251 = MUL_F(FRAC_CONST(-0.5411961001461967), f234);
2151     f252 = f249 + f250;
2152     f253 = f251 - f250;
2153     f254 = f236 + f238;
2154     f255 = MUL_F(FRAC_CONST(0.5411961001461969), f236);
2155     f256 = MUL_F(FRAC_CONST(0.3826834323650898), f254);
2156     f257 = MUL_C(COEF_CONST(1.3065629648763766), f238);
2157     f258 = f255 + f256;
2158     f259 = f257 - f256;
2159     f260 = f240 + f242;
2160     f261 = MUL_C(COEF_CONST(1.3065629648763766), f240);
2161     f262 = MUL_F(FRAC_CONST(-0.9238795325112866), f260);
2162     f263 = MUL_F(FRAC_CONST(-0.5411961001461967), f242);
2163     f264 = f261 + f262;
2164     f265 = f263 - f262;
2165     f266 = f244 + f246;
2166     f267 = MUL_F(FRAC_CONST(0.5411961001461969), f244);
2167     f268 = MUL_F(FRAC_CONST(0.3826834323650898), f266);
2168     f269 = MUL_C(COEF_CONST(1.3065629648763766), f246);
2169     f270 = f267 + f268;
2170     f271 = f269 - f268;
2171     f272 = f233 - f237;
2172     f273 = f233 + f237;
2173     f274 = f235 - f239;
2174     f275 = f235 + f239;
2175     f276 = f253 - f259;
2176     f277 = f253 + f259;
2177     f278 = f252 - f258;
2178     f279 = f252 + f258;
2179     f280 = f241 - f245;
2180     f281 = f241 + f245;
2181     f282 = f243 - f247;
2182     f283 = f243 + f247;
2183     f284 = f265 - f271;
2184     f285 = f265 + f271;
2185     f286 = f264 - f270;
2186     f287 = f264 + f270;
2187     f288 = f272 - f274;
2188     f289 = f272 + f274;
2189     f290 = MUL_F(FRAC_CONST(0.7071067811865474), f288);
2190     f291 = MUL_F(FRAC_CONST(0.7071067811865474), f289);
2191     f292 = f276 - f278;
2192     f293 = f276 + f278;
2193     f294 = MUL_F(FRAC_CONST(0.7071067811865474), f292);
2194     f295 = MUL_F(FRAC_CONST(0.7071067811865474), f293);
2195     f296 = f280 - f282;
2196     f297 = f280 + f282;
2197     f298 = MUL_F(FRAC_CONST(0.7071067811865474), f296);
2198     f299 = MUL_F(FRAC_CONST(0.7071067811865474), f297);
2199     f300 = f284 - f286;
2200     f301 = f284 + f286;
2201     f302 = MUL_F(FRAC_CONST(0.7071067811865474), f300);
2202     f303 = MUL_F(FRAC_CONST(0.7071067811865474), f301);
2203     f304 = f129 - f273;
2204     f305 = f129 + f273;
2205     f306 = f131 - f281;
2206     f307 = f131 + f281;
2207     f308 = f133 - f285;
2208     f309 = f133 + f285;
2209     f310 = f135 - f277;
2210     f311 = f135 + f277;
2211     f312 = f137 - f295;
2212     f313 = f137 + f295;
2213     f314 = f139 - f303;
2214     f315 = f139 + f303;
2215     f316 = f141 - f299;
2216     f317 = f141 + f299;
2217     f318 = f143 - f291;
2218     f319 = f143 + f291;
2219     f320 = f142 - f290;
2220     f321 = f142 + f290;
2221     f322 = f140 - f298;
2222     f323 = f140 + f298;
2223     f324 = f138 - f302;
2224     f325 = f138 + f302;
2225     f326 = f136 - f294;
2226     f327 = f136 + f294;
2227     f328 = f134 - f279;
2228     f329 = f134 + f279;
2229     f330 = f132 - f287;
2230     f331 = f132 + f287;
2231     f332 = f130 - f283;
2232     f333 = f130 + f283;
2233     f334 = f128 - f275;
2234     f335 = f128 + f275;
2235     y[31] = MUL_F(FRAC_CONST(0.5001506360206510), f305);
2236     y[30] = MUL_F(FRAC_CONST(0.5013584524464084), f307);
2237     y[29] = MUL_F(FRAC_CONST(0.5037887256810443), f309);
2238     y[28] = MUL_F(FRAC_CONST(0.5074711720725553), f311);
2239     y[27] = MUL_F(FRAC_CONST(0.5124514794082247), f313);
2240     y[26] = MUL_F(FRAC_CONST(0.5187927131053328), f315);
2241     y[25] = MUL_F(FRAC_CONST(0.5265773151542700), f317);
2242     y[24] = MUL_F(FRAC_CONST(0.5359098169079920), f319);
2243     y[23] = MUL_F(FRAC_CONST(0.5469204379855088), f321);
2244     y[22] = MUL_F(FRAC_CONST(0.5597698129470802), f323);
2245     y[21] = MUL_F(FRAC_CONST(0.5746551840326600), f325);
2246     y[20] = MUL_F(FRAC_CONST(0.5918185358574165), f327);
2247     y[19] = MUL_F(FRAC_CONST(0.6115573478825099), f329);
2248     y[18] = MUL_F(FRAC_CONST(0.6342389366884031), f331);
2249     y[17] = MUL_F(FRAC_CONST(0.6603198078137061), f333);
2250     y[16] = MUL_F(FRAC_CONST(0.6903721282002123), f335);
2251     y[15] = MUL_F(FRAC_CONST(0.7251205223771985), f334);
2252     y[14] = MUL_F(FRAC_CONST(0.7654941649730891), f332);
2253     y[13] = MUL_F(FRAC_CONST(0.8127020908144905), f330);
2254     y[12] = MUL_F(FRAC_CONST(0.8683447152233481), f328);
2255     y[11] = MUL_F(FRAC_CONST(0.9345835970364075), f326);
2256     y[10] = MUL_C(COEF_CONST(1.0144082649970547), f324);
2257     y[9] = MUL_C(COEF_CONST(1.1120716205797176), f322);
2258     y[8] = MUL_C(COEF_CONST(1.2338327379765710), f320);
2259     y[7] = MUL_C(COEF_CONST(1.3892939586328277), f318);
2260     y[6] = MUL_C(COEF_CONST(1.5939722833856311), f316);
2261     y[5] = MUL_C(COEF_CONST(1.8746759800084078), f314);
2262     y[4] = MUL_C(COEF_CONST(2.2820500680051619), f312);
2263     y[3] = MUL_C(COEF_CONST(2.9246284281582162), f310);
2264     y[2] = MUL_C(COEF_CONST(4.0846110781292477), f308);
2265     y[1] = MUL_C(COEF_CONST(6.7967507116736332), f306);
2266     y[0] = MUL_R(REAL_CONST(20.3738781672314530), f304);
2267 }
2268 
2269 #endif
2270 
2271 #endif
2272