package net.sourceforge.jaad.aac.sbr; import java.util.Arrays; /** * This class is part of JAAD ( jaadec.sourceforge.net ) that is distributed * under the Public Domain license. Code changes provided by the JCodec project * are distributed under FreeBSD license. * * @author in-somnia */ class SynthesisFilterbank implements FilterbankTable { private static final float[][] qmf32_pre_twiddle = { {0.999924701839145f, -0.012271538285720f}, {0.999322384588350f, -0.036807222941359f}, {0.998118112900149f, -0.061320736302209f}, {0.996312612182778f, -0.085797312344440f}, {0.993906970002356f, -0.110222207293883f}, {0.990902635427780f, -0.134580708507126f}, {0.987301418157858f, -0.158858143333861f}, {0.983105487431216f, -0.183039887955141f}, {0.978317370719628f, -0.207111376192219f}, {0.972939952205560f, -0.231058108280671f}, {0.966976471044852f, -0.254865659604515f}, {0.960430519415566f, -0.278519689385053f}, {0.953306040354194f, -0.302005949319228f}, {0.945607325380521f, -0.325310292162263f}, {0.937339011912575f, -0.348418680249435f}, {0.928506080473216f, -0.371317193951838f}, {0.919113851690058f, -0.393992040061048f}, {0.909167983090522f, -0.416429560097637f}, {0.898674465693954f, -0.438616238538528f}, {0.887639620402854f, -0.460538710958240f}, {0.876070094195407f, -0.482183772079123f}, {0.863972856121587f, -0.503538383725718f}, {0.851355193105265f, -0.524589682678469f}, {0.838224705554838f, -0.545324988422046f}, {0.824589302785025f, -0.565731810783613f}, {0.810457198252595f, -0.585797857456439f}, {0.795836904608884f, -0.605511041404326f}, {0.780737228572094f, -0.624859488142386f}, {0.765167265622459f, -0.643831542889791f}, {0.749136394523459f, -0.662415777590172f}, {0.732654271672413f, -0.680600997795453f}, {0.715730825283819f, -0.698376249408973f} }; private float[] v; //double ringbuffer private int v_index; //ringbuffer index private final int channels; public SynthesisFilterbank(int channels) { this.channels = channels; v = new float[2*channels*20]; v_index = 0; } public void reset() { Arrays.fill(v, 0); } void sbr_qmf_synthesis_32(SBR sbr, float[][][] X, float[] output) { float[] x1 = new float[32], x2 = new float[32]; float scale = 1.f/64.f; int n, k, out = 0; int l; /* qmf subsample l */ for(l = 0; l<sbr.numTimeSlotsRate; l++) { /* shift buffer v */ /* buffer is not shifted, we are using a ringbuffer */ //memmove(qmfs.v + 64, qmfs.v, (640-64)*sizeof(real_t)); /* calculate 64 samples */ /* complex pre-twiddle */ for(k = 0; k<32; k++) { x1[k] = (X[l][k][0]*qmf32_pre_twiddle[k][0])-(X[l][k][1]*qmf32_pre_twiddle[k][1]); x2[k] = (X[l][k][1]*qmf32_pre_twiddle[k][0])+(X[l][k][0]*qmf32_pre_twiddle[k][1]); x1[k] *= scale; x2[k] *= scale; } /* transform */ DCT4_32(x1, x1); DST4_32(x2, x2); for(n = 0; n<32; n++) { this.v[this.v_index+n] = this.v[this.v_index+640+n] = -x1[n]+x2[n]; this.v[this.v_index+63-n] = this.v[this.v_index+640+63-n] = x1[n]+x2[n]; } /* calculate 32 output samples and window */ for(k = 0; k<32; k++) { output[out++] = (this.v[this.v_index+k]*qmf_c[2*k]) +(this.v[this.v_index+96+k]*qmf_c[64+2*k]) +(this.v[this.v_index+128+k]*qmf_c[128+2*k]) +(this.v[this.v_index+224+k]*qmf_c[192+2*k]) +(this.v[this.v_index+256+k]*qmf_c[256+2*k]) +(this.v[this.v_index+352+k]*qmf_c[320+2*k]) +(this.v[this.v_index+384+k]*qmf_c[384+2*k]) +(this.v[this.v_index+480+k]*qmf_c[448+2*k]) +(this.v[this.v_index+512+k]*qmf_c[512+2*k]) +(this.v[this.v_index+608+k]*qmf_c[576+2*k]); } /* update ringbuffer index */ this.v_index -= 64; if(this.v_index<0) this.v_index = (640-64); } } void sbr_qmf_synthesis_64(SBR sbr, float[][][] X, float[] output) { float[] in_real1 = new float[32], in_imag1 = new float[32], out_real1 = new float[32], out_imag1 = new float[32]; float[] in_real2 = new float[32], in_imag2 = new float[32], out_real2 = new float[32], out_imag2 = new float[32]; float[][] pX; float scale = 1.f/64.f; int n, k, out = 0; int l; /* qmf subsample l */ for(l = 0; l<sbr.numTimeSlotsRate; l++) { /* shift buffer v */ /* buffer is not shifted, we use double ringbuffer */ //memmove(qmfs.v + 128, qmfs.v, (1280-128)*sizeof(real_t)); /* calculate 128 samples */ pX = X[l]; in_imag1[31] = scale*pX[1][0]; in_real1[0] = scale*pX[0][0]; in_imag2[31] = scale*pX[63-1][1]; in_real2[0] = scale*pX[63-0][1]; for(k = 1; k<31; k++) { in_imag1[31-k] = scale*pX[2*k+1][0]; in_real1[ k] = scale*pX[2*k][0]; in_imag2[31-k] = scale*pX[63-(2*k+1)][1]; in_real2[ k] = scale*pX[63-(2*k)][1]; } in_imag1[0] = scale*pX[63][0]; in_real1[31] = scale*pX[62][0]; in_imag2[0] = scale*pX[63-63][1]; in_real2[31] = scale*pX[63-62][1]; // dct4_kernel is DCT_IV without reordering which is done before and after FFT DCT.dct4_kernel(in_real1, in_imag1, out_real1, out_imag1); DCT.dct4_kernel(in_real2, in_imag2, out_real2, out_imag2); int pring_buffer_1 = v_index; //*v int pring_buffer_3 = pring_buffer_1+1280; // ptemp_1 = x1; // ptemp_2 = x2; for(n = 0; n<32; n++) { // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer v[pring_buffer_1+2*n] = v[pring_buffer_3+2*n] = out_real2[n]-out_real1[n]; v[pring_buffer_1+127-2*n] = v[pring_buffer_3+127-2*n] = out_real2[n]+out_real1[n]; v[pring_buffer_1+2*n+1] = v[pring_buffer_3+2*n+1] = out_imag2[31-n]+out_imag1[31-n]; v[pring_buffer_1+127-(2*n+1)] = v[pring_buffer_3+127-(2*n+1)] = out_imag2[31-n]-out_imag1[31-n]; } pring_buffer_1 = v_index; //*v /* calculate 64 output samples and window */ for(k = 0; k<64; k++) { output[out++] = (v[pring_buffer_1+k+0]*qmf_c[k+0]) +(v[pring_buffer_1+k+192]*qmf_c[k+64]) +(v[pring_buffer_1+k+256]*qmf_c[k+128]) +(v[pring_buffer_1+k+(256+192)]*qmf_c[k+192]) +(v[pring_buffer_1+k+512]*qmf_c[k+256]) +(v[pring_buffer_1+k+(512+192)]*qmf_c[k+320]) +(v[pring_buffer_1+k+768]*qmf_c[k+384]) +(v[pring_buffer_1+k+(768+192)]*qmf_c[k+448]) +(v[pring_buffer_1+k+1024]*qmf_c[k+512]) +(v[pring_buffer_1+k+(1024+192)]*qmf_c[k+576]); } /* update ringbuffer index */ this.v_index -= 128; if(this.v_index<0) this.v_index = (1280-128); } } private void DCT4_32(float[] y, float[] x) { float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; float f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; float f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; float f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; float f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; float f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; float f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; float f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; float f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; float f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; float f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; float f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; float f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; float f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; float f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; float f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; float f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; float f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; float f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; float f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; float f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; float f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; float f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; float f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; float f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; float f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; float f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; float f271, f272, f273, f274, f275, f276, f277, f278, f279, f280; float f281, f282, f283, f284, f285, f286, f287, f288, f289, f290; float f291, f292, f293, f294, f295, f296, f297, f298, f299, f300; float f301, f302, f303, f304, f305, f306, f307, f310, f311, f312; float f313, f316, f317, f318, f319, f322, f323, f324, f325, f328; float f329, f330, f331, f334, f335, f336, f337, f340, f341, f342; float f343, f346, f347, f348, f349, f352, f353, f354, f355, f358; float f359, f360, f361, f364, f365, f366, f367, f370, f371, f372; float f373, f376, f377, f378, f379, f382, f383, f384, f385, f388; float f389, f390, f391, f394, f395, f396, f397; f0 = x[15]-x[16]; f1 = x[15]+x[16]; f2 = (0.7071067811865476f*f1); f3 = (0.7071067811865476f*f0); f4 = x[8]-x[23]; f5 = x[8]+x[23]; f6 = (0.7071067811865476f*f5); f7 = (0.7071067811865476f*f4); f8 = x[12]-x[19]; f9 = x[12]+x[19]; f10 = (0.7071067811865476f*f9); f11 = (0.7071067811865476f*f8); f12 = x[11]-x[20]; f13 = x[11]+x[20]; f14 = (0.7071067811865476f*f13); f15 = (0.7071067811865476f*f12); f16 = x[14]-x[17]; f17 = x[14]+x[17]; f18 = (0.7071067811865476f*f17); f19 = (0.7071067811865476f*f16); f20 = x[9]-x[22]; f21 = x[9]+x[22]; f22 = (0.7071067811865476f*f21); f23 = (0.7071067811865476f*f20); f24 = x[13]-x[18]; f25 = x[13]+x[18]; f26 = (0.7071067811865476f*f25); f27 = (0.7071067811865476f*f24); f28 = x[10]-x[21]; f29 = x[10]+x[21]; f30 = (0.7071067811865476f*f29); f31 = (0.7071067811865476f*f28); f32 = x[0]-f2; f33 = x[0]+f2; f34 = x[31]-f3; f35 = x[31]+f3; f36 = x[7]-f6; f37 = x[7]+f6; f38 = x[24]-f7; f39 = x[24]+f7; f40 = x[3]-f10; f41 = x[3]+f10; f42 = x[28]-f11; f43 = x[28]+f11; f44 = x[4]-f14; f45 = x[4]+f14; f46 = x[27]-f15; f47 = x[27]+f15; f48 = x[1]-f18; f49 = x[1]+f18; f50 = x[30]-f19; f51 = x[30]+f19; f52 = x[6]-f22; f53 = x[6]+f22; f54 = x[25]-f23; f55 = x[25]+f23; f56 = x[2]-f26; f57 = x[2]+f26; f58 = x[29]-f27; f59 = x[29]+f27; f60 = x[5]-f30; f61 = x[5]+f30; f62 = x[26]-f31; f63 = x[26]+f31; f64 = f39+f37; f65 = (-0.5411961001461969f*f39); f66 = (0.9238795325112867f*f64); f67 = (1.3065629648763766f*f37); f68 = f65+f66; f69 = f67-f66; f70 = f38+f36; f71 = (1.3065629648763770f*f38); f72 = (-0.3826834323650904f*f70); f73 = (0.5411961001461961f*f36); f74 = f71+f72; f75 = f73-f72; f76 = f47+f45; f77 = (-0.5411961001461969f*f47); f78 = (0.9238795325112867f*f76); f79 = (1.3065629648763766f*f45); f80 = f77+f78; f81 = f79-f78; f82 = f46+f44; f83 = (1.3065629648763770f*f46); f84 = (-0.3826834323650904f*f82); f85 = (0.5411961001461961f*f44); f86 = f83+f84; f87 = f85-f84; f88 = f55+f53; f89 = (-0.5411961001461969f*f55); f90 = (0.9238795325112867f*f88); f91 = (1.3065629648763766f*f53); f92 = f89+f90; f93 = f91-f90; f94 = f54+f52; f95 = (1.3065629648763770f*f54); f96 = (-0.3826834323650904f*f94); f97 = (0.5411961001461961f*f52); f98 = f95+f96; f99 = f97-f96; f100 = f63+f61; f101 = (-0.5411961001461969f*f63); f102 = (0.9238795325112867f*f100); f103 = (1.3065629648763766f*f61); f104 = f101+f102; f105 = f103-f102; f106 = f62+f60; f107 = (1.3065629648763770f*f62); f108 = (-0.3826834323650904f*f106); f109 = (0.5411961001461961f*f60); f110 = f107+f108; f111 = f109-f108; f112 = f33-f68; f113 = f33+f68; f114 = f35-f69; f115 = f35+f69; f116 = f32-f74; f117 = f32+f74; f118 = f34-f75; f119 = f34+f75; f120 = f41-f80; f121 = f41+f80; f122 = f43-f81; f123 = f43+f81; f124 = f40-f86; f125 = f40+f86; f126 = f42-f87; f127 = f42+f87; f128 = f49-f92; f129 = f49+f92; f130 = f51-f93; f131 = f51+f93; f132 = f48-f98; f133 = f48+f98; f134 = f50-f99; f135 = f50+f99; f136 = f57-f104; f137 = f57+f104; f138 = f59-f105; f139 = f59+f105; f140 = f56-f110; f141 = f56+f110; f142 = f58-f111; f143 = f58+f111; f144 = f123+f121; f145 = (-0.7856949583871021f*f123); f146 = (0.9807852804032304f*f144); f147 = (1.1758756024193588f*f121); f148 = f145+f146; f149 = f147-f146; f150 = f127+f125; f151 = (0.2758993792829431f*f127); f152 = (0.5555702330196022f*f150); f153 = (1.3870398453221475f*f125); f154 = f151+f152; f155 = f153-f152; f156 = f122+f120; f157 = (1.1758756024193591f*f122); f158 = (-0.1950903220161287f*f156); f159 = (0.7856949583871016f*f120); f160 = f157+f158; f161 = f159-f158; f162 = f126+f124; f163 = (1.3870398453221473f*f126); f164 = (-0.8314696123025455f*f162); f165 = (-0.2758993792829436f*f124); f166 = f163+f164; f167 = f165-f164; f168 = f139+f137; f169 = (-0.7856949583871021f*f139); f170 = (0.9807852804032304f*f168); f171 = (1.1758756024193588f*f137); f172 = f169+f170; f173 = f171-f170; f174 = f143+f141; f175 = (0.2758993792829431f*f143); f176 = (0.5555702330196022f*f174); f177 = (1.3870398453221475f*f141); f178 = f175+f176; f179 = f177-f176; f180 = f138+f136; f181 = (1.1758756024193591f*f138); f182 = (-0.1950903220161287f*f180); f183 = (0.7856949583871016f*f136); f184 = f181+f182; f185 = f183-f182; f186 = f142+f140; f187 = (1.3870398453221473f*f142); f188 = (-0.8314696123025455f*f186); f189 = (-0.2758993792829436f*f140); f190 = f187+f188; f191 = f189-f188; f192 = f113-f148; f193 = f113+f148; f194 = f115-f149; f195 = f115+f149; f196 = f117-f154; f197 = f117+f154; f198 = f119-f155; f199 = f119+f155; f200 = f112-f160; f201 = f112+f160; f202 = f114-f161; f203 = f114+f161; f204 = f116-f166; f205 = f116+f166; f206 = f118-f167; f207 = f118+f167; f208 = f129-f172; f209 = f129+f172; f210 = f131-f173; f211 = f131+f173; f212 = f133-f178; f213 = f133+f178; f214 = f135-f179; f215 = f135+f179; f216 = f128-f184; f217 = f128+f184; f218 = f130-f185; f219 = f130+f185; f220 = f132-f190; f221 = f132+f190; f222 = f134-f191; f223 = f134+f191; f224 = f211+f209; f225 = (-0.8971675863426361f*f211); f226 = (0.9951847266721968f*f224); f227 = (1.0932018670017576f*f209); f228 = f225+f226; f229 = f227-f226; f230 = f215+f213; f231 = (-0.4105245275223571f*f215); f232 = (0.8819212643483549f*f230); f233 = (1.3533180011743529f*f213); f234 = f231+f232; f235 = f233-f232; f236 = f219+f217; f237 = (0.1386171691990915f*f219); f238 = (0.6343932841636455f*f236); f239 = (1.4074037375263826f*f217); f240 = f237+f238; f241 = f239-f238; f242 = f223+f221; f243 = (0.6666556584777466f*f223); f244 = (0.2902846772544623f*f242); f245 = (1.2472250129866711f*f221); f246 = f243+f244; f247 = f245-f244; f248 = f210+f208; f249 = (1.0932018670017574f*f210); f250 = (-0.0980171403295605f*f248); f251 = (0.8971675863426364f*f208); f252 = f249+f250; f253 = f251-f250; f254 = f214+f212; f255 = (1.3533180011743529f*f214); f256 = (-0.4713967368259979f*f254); f257 = (0.4105245275223569f*f212); f258 = f255+f256; f259 = f257-f256; f260 = f218+f216; f261 = (1.4074037375263826f*f218); f262 = (-0.7730104533627369f*f260); f263 = (-0.1386171691990913f*f216); f264 = f261+f262; f265 = f263-f262; f266 = f222+f220; f267 = (1.2472250129866711f*f222); f268 = (-0.9569403357322089f*f266); f269 = (-0.6666556584777469f*f220); f270 = f267+f268; f271 = f269-f268; f272 = f193-f228; f273 = f193+f228; f274 = f195-f229; f275 = f195+f229; f276 = f197-f234; f277 = f197+f234; f278 = f199-f235; f279 = f199+f235; f280 = f201-f240; f281 = f201+f240; f282 = f203-f241; f283 = f203+f241; f284 = f205-f246; f285 = f205+f246; f286 = f207-f247; f287 = f207+f247; f288 = f192-f252; f289 = f192+f252; f290 = f194-f253; f291 = f194+f253; f292 = f196-f258; f293 = f196+f258; f294 = f198-f259; f295 = f198+f259; f296 = f200-f264; f297 = f200+f264; f298 = f202-f265; f299 = f202+f265; f300 = f204-f270; f301 = f204+f270; f302 = f206-f271; f303 = f206+f271; f304 = f275+f273; f305 = (-0.9751575901732920f*f275); f306 = (0.9996988186962043f*f304); f307 = (1.0242400472191164f*f273); y[0] = f305+f306; y[31] = f307-f306; f310 = f279+f277; f311 = (-0.8700688593994936f*f279); f312 = (0.9924795345987100f*f310); f313 = (1.1148902097979263f*f277); y[2] = f311+f312; y[29] = f313-f312; f316 = f283+f281; f317 = (-0.7566008898816587f*f283); f318 = (0.9757021300385286f*f316); f319 = (1.1948033701953984f*f281); y[4] = f317+f318; y[27] = f319-f318; f322 = f287+f285; f323 = (-0.6358464401941451f*f287); f324 = (0.9495281805930367f*f322); f325 = (1.2632099209919283f*f285); y[6] = f323+f324; y[25] = f325-f324; f328 = f291+f289; f329 = (-0.5089684416985408f*f291); f330 = (0.9142097557035307f*f328); f331 = (1.3194510697085207f*f289); y[8] = f329+f330; y[23] = f331-f330; f334 = f295+f293; f335 = (-0.3771887988789273f*f295); f336 = (0.8700869911087114f*f334); f337 = (1.3629851833384954f*f293); y[10] = f335+f336; y[21] = f337-f336; f340 = f299+f297; f341 = (-0.2417766217337384f*f299); f342 = (0.8175848131515837f*f340); f343 = (1.3933930045694289f*f297); y[12] = f341+f342; y[19] = f343-f342; f346 = f303+f301; f347 = (-0.1040360035527077f*f303); f348 = (0.7572088465064845f*f346); f349 = (1.4103816894602612f*f301); y[14] = f347+f348; y[17] = f349-f348; f352 = f274+f272; f353 = (0.0347065382144002f*f274); f354 = (0.6895405447370668f*f352); f355 = (1.4137876276885337f*f272); y[16] = f353+f354; y[15] = f355-f354; f358 = f278+f276; f359 = (0.1731148370459795f*f278); f360 = (0.6152315905806268f*f358); f361 = (1.4035780182072330f*f276); y[18] = f359+f360; y[13] = f361-f360; f364 = f282+f280; f365 = (0.3098559453626100f*f282); f366 = (0.5349976198870972f*f364); f367 = (1.3798511851368043f*f280); y[20] = f365+f366; y[11] = f367-f366; f370 = f286+f284; f371 = (0.4436129715409088f*f286); f372 = (0.4496113296546065f*f370); f373 = (1.3428356308501219f*f284); y[22] = f371+f372; y[9] = f373-f372; f376 = f290+f288; f377 = (0.5730977622997509f*f290); f378 = (0.3598950365349881f*f376); f379 = (1.2928878353697271f*f288); y[24] = f377+f378; y[7] = f379-f378; f382 = f294+f292; f383 = (0.6970633083205415f*f294); f384 = (0.2667127574748984f*f382); f385 = (1.2304888232703382f*f292); y[26] = f383+f384; y[5] = f385-f384; f388 = f298+f296; f389 = (0.8143157536286401f*f298); f390 = (0.1709618887603012f*f388); f391 = (1.1562395311492424f*f296); y[28] = f389+f390; y[3] = f391-f390; f394 = f302+f300; f395 = (0.9237258930790228f*f302); f396 = (0.0735645635996674f*f394); f397 = (1.0708550202783576f*f300); y[30] = f395+f396; y[1] = f397-f396; } private void DST4_32(float[] y, float[] x) { float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9; float f10, f11, f12, f13, f14, f15, f16, f17, f18, f19; float f20, f21, f22, f23, f24, f25, f26, f27, f28, f29; float f30, f31, f32, f33, f34, f35, f36, f37, f38, f39; float f40, f41, f42, f43, f44, f45, f46, f47, f48, f49; float f50, f51, f52, f53, f54, f55, f56, f57, f58, f59; float f60, f61, f62, f63, f64, f65, f66, f67, f68, f69; float f70, f71, f72, f73, f74, f75, f76, f77, f78, f79; float f80, f81, f82, f83, f84, f85, f86, f87, f88, f89; float f90, f91, f92, f93, f94, f95, f96, f97, f98, f99; float f100, f101, f102, f103, f104, f105, f106, f107, f108, f109; float f110, f111, f112, f113, f114, f115, f116, f117, f118, f119; float f120, f121, f122, f123, f124, f125, f126, f127, f128, f129; float f130, f131, f132, f133, f134, f135, f136, f137, f138, f139; float f140, f141, f142, f143, f144, f145, f146, f147, f148, f149; float f150, f151, f152, f153, f154, f155, f156, f157, f158, f159; float f160, f161, f162, f163, f164, f165, f166, f167, f168, f169; float f170, f171, f172, f173, f174, f175, f176, f177, f178, f179; float f180, f181, f182, f183, f184, f185, f186, f187, f188, f189; float f190, f191, f192, f193, f194, f195, f196, f197, f198, f199; float f200, f201, f202, f203, f204, f205, f206, f207, f208, f209; float f210, f211, f212, f213, f214, f215, f216, f217, f218, f219; float f220, f221, f222, f223, f224, f225, f226, f227, f228, f229; float f230, f231, f232, f233, f234, f235, f236, f237, f238, f239; float f240, f241, f242, f243, f244, f245, f246, f247, f248, f249; float f250, f251, f252, f253, f254, f255, f256, f257, f258, f259; float f260, f261, f262, f263, f264, f265, f266, f267, f268, f269; float f270, f271, f272, f273, f274, f275, f276, f277, f278, f279; float f280, f281, f282, f283, f284, f285, f286, f287, f288, f289; float f290, f291, f292, f293, f294, f295, f296, f297, f298, f299; float f300, f301, f302, f303, f304, f305, f306, f307, f308, f309; float f310, f311, f312, f313, f314, f315, f316, f317, f318, f319; float f320, f321, f322, f323, f324, f325, f326, f327, f328, f329; float f330, f331, f332, f333, f334, f335; f0 = x[0]-x[1]; f1 = x[2]-x[1]; f2 = x[2]-x[3]; f3 = x[4]-x[3]; f4 = x[4]-x[5]; f5 = x[6]-x[5]; f6 = x[6]-x[7]; f7 = x[8]-x[7]; f8 = x[8]-x[9]; f9 = x[10]-x[9]; f10 = x[10]-x[11]; f11 = x[12]-x[11]; f12 = x[12]-x[13]; f13 = x[14]-x[13]; f14 = x[14]-x[15]; f15 = x[16]-x[15]; f16 = x[16]-x[17]; f17 = x[18]-x[17]; f18 = x[18]-x[19]; f19 = x[20]-x[19]; f20 = x[20]-x[21]; f21 = x[22]-x[21]; f22 = x[22]-x[23]; f23 = x[24]-x[23]; f24 = x[24]-x[25]; f25 = x[26]-x[25]; f26 = x[26]-x[27]; f27 = x[28]-x[27]; f28 = x[28]-x[29]; f29 = x[30]-x[29]; f30 = x[30]-x[31]; f31 = (0.7071067811865476f*f15); f32 = x[0]-f31; f33 = x[0]+f31; f34 = f7+f23; f35 = (1.3065629648763766f*f7); f36 = (-0.9238795325112866f*f34); f37 = (-0.5411961001461967f*f23); f38 = f35+f36; f39 = f37-f36; f40 = f33-f39; f41 = f33+f39; f42 = f32-f38; f43 = f32+f38; f44 = f11-f19; f45 = f11+f19; f46 = (0.7071067811865476f*f45); f47 = f3-f46; f48 = f3+f46; f49 = (0.7071067811865476f*f44); f50 = f49-f27; f51 = f49+f27; f52 = f51+f48; f53 = (-0.7856949583871021f*f51); f54 = (0.9807852804032304f*f52); f55 = (1.1758756024193588f*f48); f56 = f53+f54; f57 = f55-f54; f58 = f50+f47; f59 = (-0.2758993792829430f*f50); f60 = (0.8314696123025452f*f58); f61 = (1.3870398453221475f*f47); f62 = f59+f60; f63 = f61-f60; f64 = f41-f56; f65 = f41+f56; f66 = f43-f62; f67 = f43+f62; f68 = f42-f63; f69 = f42+f63; f70 = f40-f57; f71 = f40+f57; f72 = f5-f9; f73 = f5+f9; f74 = f13-f17; f75 = f13+f17; f76 = f21-f25; f77 = f21+f25; f78 = (0.7071067811865476f*f75); f79 = f1-f78; f80 = f1+f78; f81 = f73+f77; f82 = (1.3065629648763766f*f73); f83 = (-0.9238795325112866f*f81); f84 = (-0.5411961001461967f*f77); f85 = f82+f83; f86 = f84-f83; f87 = f80-f86; f88 = f80+f86; f89 = f79-f85; f90 = f79+f85; f91 = (0.7071067811865476f*f74); f92 = f29-f91; f93 = f29+f91; f94 = f76+f72; f95 = (1.3065629648763766f*f76); f96 = (-0.9238795325112866f*f94); f97 = (-0.5411961001461967f*f72); f98 = f95+f96; f99 = f97-f96; f100 = f93-f99; f101 = f93+f99; f102 = f92-f98; f103 = f92+f98; f104 = f101+f88; f105 = (-0.8971675863426361f*f101); f106 = (0.9951847266721968f*f104); f107 = (1.0932018670017576f*f88); f108 = f105+f106; f109 = f107-f106; f110 = f90-f103; f111 = (-0.6666556584777466f*f103); f112 = (0.9569403357322089f*f110); f113 = (1.2472250129866713f*f90); f114 = f112-f111; f115 = f113-f112; f116 = f102+f89; f117 = (-0.4105245275223571f*f102); f118 = (0.8819212643483549f*f116); f119 = (1.3533180011743529f*f89); f120 = f117+f118; f121 = f119-f118; f122 = f87-f100; f123 = (-0.1386171691990915f*f100); f124 = (0.7730104533627370f*f122); f125 = (1.4074037375263826f*f87); f126 = f124-f123; f127 = f125-f124; f128 = f65-f108; f129 = f65+f108; f130 = f67-f114; f131 = f67+f114; f132 = f69-f120; f133 = f69+f120; f134 = f71-f126; f135 = f71+f126; f136 = f70-f127; f137 = f70+f127; f138 = f68-f121; f139 = f68+f121; f140 = f66-f115; f141 = f66+f115; f142 = f64-f109; f143 = f64+f109; f144 = f0+f30; f145 = (1.0478631305325901f*f0); f146 = (-0.9987954562051724f*f144); f147 = (-0.9497277818777548f*f30); f148 = f145+f146; f149 = f147-f146; f150 = f4+f26; f151 = (1.2130114330978077f*f4); f152 = (-0.9700312531945440f*f150); f153 = (-0.7270510732912803f*f26); f154 = f151+f152; f155 = f153-f152; f156 = f8+f22; f157 = (1.3315443865537255f*f8); f158 = (-0.9039892931234433f*f156); f159 = (-0.4764341996931612f*f22); f160 = f157+f158; f161 = f159-f158; f162 = f12+f18; f163 = (1.3989068359730781f*f12); f164 = (-0.8032075314806453f*f162); f165 = (-0.2075082269882124f*f18); f166 = f163+f164; f167 = f165-f164; f168 = f16+f14; f169 = (1.4125100802019777f*f16); f170 = (-0.6715589548470187f*f168); f171 = (0.0693921705079402f*f14); f172 = f169+f170; f173 = f171-f170; f174 = f20+f10; f175 = (1.3718313541934939f*f20); f176 = (-0.5141027441932219f*f174); f177 = (0.3436258658070501f*f10); f178 = f175+f176; f179 = f177-f176; f180 = f24+f6; f181 = (1.2784339185752409f*f24); f182 = (-0.3368898533922200f*f180); f183 = (0.6046542117908008f*f6); f184 = f181+f182; f185 = f183-f182; f186 = f28+f2; f187 = (1.1359069844201433f*f28); f188 = (-0.1467304744553624f*f186); f189 = (0.8424460355094185f*f2); f190 = f187+f188; f191 = f189-f188; f192 = f149-f173; f193 = f149+f173; f194 = f148-f172; f195 = f148+f172; f196 = f155-f179; f197 = f155+f179; f198 = f154-f178; f199 = f154+f178; f200 = f161-f185; f201 = f161+f185; f202 = f160-f184; f203 = f160+f184; f204 = f167-f191; f205 = f167+f191; f206 = f166-f190; f207 = f166+f190; f208 = f192+f194; f209 = (1.1758756024193588f*f192); f210 = (-0.9807852804032304f*f208); f211 = (-0.7856949583871021f*f194); f212 = f209+f210; f213 = f211-f210; f214 = f196+f198; f215 = (1.3870398453221475f*f196); f216 = (-0.5555702330196022f*f214); f217 = (0.2758993792829431f*f198); f218 = f215+f216; f219 = f217-f216; f220 = f200+f202; f221 = (0.7856949583871022f*f200); f222 = (0.1950903220161283f*f220); f223 = (1.1758756024193586f*f202); f224 = f221+f222; f225 = f223-f222; f226 = f204+f206; f227 = (-0.2758993792829430f*f204); f228 = (0.8314696123025452f*f226); f229 = (1.3870398453221475f*f206); f230 = f227+f228; f231 = f229-f228; f232 = f193-f201; f233 = f193+f201; f234 = f195-f203; f235 = f195+f203; f236 = f197-f205; f237 = f197+f205; f238 = f199-f207; f239 = f199+f207; f240 = f213-f225; f241 = f213+f225; f242 = f212-f224; f243 = f212+f224; f244 = f219-f231; f245 = f219+f231; f246 = f218-f230; f247 = f218+f230; f248 = f232+f234; f249 = (1.3065629648763766f*f232); f250 = (-0.9238795325112866f*f248); f251 = (-0.5411961001461967f*f234); f252 = f249+f250; f253 = f251-f250; f254 = f236+f238; f255 = (0.5411961001461969f*f236); f256 = (0.3826834323650898f*f254); f257 = (1.3065629648763766f*f238); f258 = f255+f256; f259 = f257-f256; f260 = f240+f242; f261 = (1.3065629648763766f*f240); f262 = (-0.9238795325112866f*f260); f263 = (-0.5411961001461967f*f242); f264 = f261+f262; f265 = f263-f262; f266 = f244+f246; f267 = (0.5411961001461969f*f244); f268 = (0.3826834323650898f*f266); f269 = (1.3065629648763766f*f246); f270 = f267+f268; f271 = f269-f268; f272 = f233-f237; f273 = f233+f237; f274 = f235-f239; f275 = f235+f239; f276 = f253-f259; f277 = f253+f259; f278 = f252-f258; f279 = f252+f258; f280 = f241-f245; f281 = f241+f245; f282 = f243-f247; f283 = f243+f247; f284 = f265-f271; f285 = f265+f271; f286 = f264-f270; f287 = f264+f270; f288 = f272-f274; f289 = f272+f274; f290 = (0.7071067811865474f*f288); f291 = (0.7071067811865474f*f289); f292 = f276-f278; f293 = f276+f278; f294 = (0.7071067811865474f*f292); f295 = (0.7071067811865474f*f293); f296 = f280-f282; f297 = f280+f282; f298 = (0.7071067811865474f*f296); f299 = (0.7071067811865474f*f297); f300 = f284-f286; f301 = f284+f286; f302 = (0.7071067811865474f*f300); f303 = (0.7071067811865474f*f301); f304 = f129-f273; f305 = f129+f273; f306 = f131-f281; f307 = f131+f281; f308 = f133-f285; f309 = f133+f285; f310 = f135-f277; f311 = f135+f277; f312 = f137-f295; f313 = f137+f295; f314 = f139-f303; f315 = f139+f303; f316 = f141-f299; f317 = f141+f299; f318 = f143-f291; f319 = f143+f291; f320 = f142-f290; f321 = f142+f290; f322 = f140-f298; f323 = f140+f298; f324 = f138-f302; f325 = f138+f302; f326 = f136-f294; f327 = f136+f294; f328 = f134-f279; f329 = f134+f279; f330 = f132-f287; f331 = f132+f287; f332 = f130-f283; f333 = f130+f283; f334 = f128-f275; f335 = f128+f275; y[31] = (0.5001506360206510f*f305); y[30] = (0.5013584524464084f*f307); y[29] = (0.5037887256810443f*f309); y[28] = (0.5074711720725553f*f311); y[27] = (0.5124514794082247f*f313); y[26] = (0.5187927131053328f*f315); y[25] = (0.5265773151542700f*f317); y[24] = (0.5359098169079920f*f319); y[23] = (0.5469204379855088f*f321); y[22] = (0.5597698129470802f*f323); y[21] = (0.5746551840326600f*f325); y[20] = (0.5918185358574165f*f327); y[19] = (0.6115573478825099f*f329); y[18] = (0.6342389366884031f*f331); y[17] = (0.6603198078137061f*f333); y[16] = (0.6903721282002123f*f335); y[15] = (0.7251205223771985f*f334); y[14] = (0.7654941649730891f*f332); y[13] = (0.8127020908144905f*f330); y[12] = (0.8683447152233481f*f328); y[11] = (0.9345835970364075f*f326); y[10] = (1.0144082649970547f*f324); y[9] = (1.1120716205797176f*f322); y[8] = (1.2338327379765710f*f320); y[7] = (1.3892939586328277f*f318); y[6] = (1.5939722833856311f*f316); y[5] = (1.8746759800084078f*f314); y[4] = (2.2820500680051619f*f312); y[3] = (2.9246284281582162f*f310); y[2] = (4.0846110781292477f*f308); y[1] = (6.7967507116736332f*f306); y[0] = (20.3738781672314530f*f304); } }