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