float->float filter Antialias { float[8] cs, ca; init { cs [0] = 0.857492925712; cs [1] = 0.881741997318; cs [2] = 0.949628649103; cs [3] = 0.983314592492; cs [4] = 0.995517816065; cs [5] = 0.999160558175; cs [6] = 0.999899195243; cs [7] = 0.999993155067; ca [0] = -0.5144957554270; ca [1] = -0.4717319685650; ca [2] = -0.3133774542040; ca [3] = -0.1819131996110; ca [4] = -0.0945741925262; ca [5] = -0.0409655828852; ca [6] = -0.0141985685725; ca [7] = -0.00369997467375; } work push (18+1)*32 pop (18+1)*32 + 1 { float[(18+1)*32] data; float type = pop(); int sb18lim=0; if (type == 0.0) { sb18lim = 0; } else if (type == 1.0) { sb18lim = 18 + 1; } else if (type == 2) { sb18lim = (18 + 1) * 31; } else { } for (int i=0;i<(18+1)*32;i++) data [i] = pop(); for (int sb18 = 0; sb18 < sb18lim; sb18 += (18 + 1)) { for (int ss = 0; ss < 8; ss++) { int src_indx1 = sb18 + 17 + 1 - ss; int src_indx2 = sb18 + 18 + 2 + ss; float bu = data [src_indx1]; float bd = data [src_indx2]; data[src_indx1] = (bu * cs[ss]) - (bd * ca[ss]); data[src_indx2] = (bd * cs[ss]) + (bu * ca[ss]); } } for(int i=0;i<(18+1)*32;i++) push(data[i]); } } float->int pipeline FilterBank() { add Antialias(); add IMDCT(); add float->float filter { work push 18 pop 36 peek 36+1152 { float future1, future2; for(int i = 0; i < 18; i++) { future1 = peek(1152); future2 = peek(18); push(future1 + future2); pop(); } for(int i = 0; i < 18; i++) pop(); } }; // frequency inversion add float->float splitjoin { split roundrobin(); for (int x = 0; x < 18; x++) { if (x % 2 == 0) add Identity; else { add float->float pipeline { add float->float splitjoin { split roundrobin(); add Identity; add float->float filter { work push 1 pop 1 { push(0.0-pop()); } } join roundrobin(); } } } } // join the 18 producers and put them in entire 32-sample // subband pieces join roundrobin( 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32); } // polyphase synthesis add PCMSynthesis(); } float->int pipeline PCMSynthesis() { add float->float filter { work push 64 pop 32 { for (int i = 0; i < 64; i++) { float sum = 0.0; for (int j = 0; j < 32; j++) { sum += cos(((16 + i) * (2 * j + 1)) * pi/ 64.0)* peek(j); } push(sum); } for(int i = 0; i < 32; i++) pop(); } } // build u add float->float filter { work push 512 pop 64 peek 1024 { // remember that here // the youngest data is at the highest index! int peekIndex; for(int i = 0; i < 16; i++) { for(int j = 0; j < 32; j++) { peekIndex = ((15 - i) * 2 + (i & 1)) * 32 + j; push(peek(peekIndex)); } } for (int i = 0; i < 64; i++) pop(); } } // multiply u by d add float->float filter { float[512] d; init { d[0] = 0.000000000; d[1] = -0.000015259; d[2] = -0.000015259; d[3] = -0.000015259; d[4] = -0.000015259; d[5] = -0.000015259; d[6] = -0.000015259; d[7] = -0.000030518; d[8] = -0.000030518; d[9] = -0.000030518; d[10] = -0.000030518; d[11] = -0.000045776; d[12] = -0.000045776; d[13] = -0.000061035; d[14] = -0.000061035; d[15] = -0.000076294; d[16] = -0.000076294; d[17] = -0.000091553; d[18] = -0.000106812; d[19] = -0.000106812; d[20] = -0.000122070; d[21] = -0.000137329; d[22] = -0.000152588; d[23] = -0.000167847; d[24] = -0.000198364; d[25] = -0.000213623; d[26] = -0.000244141; d[27] = -0.000259399; d[28] = -0.000289917; d[29] = -0.000320435; d[30] = -0.000366211; d[31] = -0.000396729; d[32] = -0.000442505; d[33] = -0.000473022; d[34] = -0.000534058; d[35] = -0.000579834; d[36] = -0.000625610; d[37] = -0.000686646; d[38] = -0.000747681; d[39] = -0.000808716; d[40] = -0.000885010; d[41] = -0.000961304; d[42] = -0.001037598; d[43] = -0.001113892; d[44] = -0.001205444; d[45] = -0.001296997; d[46] = -0.001388550; d[47] = -0.001480103; d[48] = -0.001586914; d[49] = -0.001693726; d[50] = -0.001785278; d[51] = -0.001907349; d[52] = -0.002014160; d[53] = -0.002120972; d[54] = -0.002243042; d[55] = -0.002349854; d[56] = -0.002456665; d[57] = -0.002578735; d[58] = -0.002685547; d[59] = -0.002792358; d[60] = -0.002899170; d[61] = -0.002990723; d[62] = -0.003082275; d[63] = -0.003173828; d[64] = 0.003250122; d[65] = 0.003326416; d[66] = 0.003387451; d[67] = 0.003433228; d[68] = 0.003463745; d[69] = 0.003479004; d[70] = 0.003479004; d[71] = 0.003463745; d[72] = 0.003417969; d[73] = 0.003372192; d[74] = 0.003280640; d[75] = 0.003173828; d[76] = 0.003051758; d[77] = 0.002883911; d[78] = 0.002700806; d[79] = 0.002487183; d[80] = 0.002227783; d[81] = 0.001937866; d[82] = 0.001617432; d[83] = 0.001266479; d[84] = 0.000869751; d[85] = 0.000442505; d[86] = -0.000030518; d[87] = -0.000549316; d[88] = -0.001098633; d[89] = -0.001693726; d[90] = -0.002334595; d[91] = -0.003005981; d[92] = -0.003723145; d[93] = -0.004486084; d[94] = -0.005294800; d[95] = -0.006118774; d[96] = -0.007003784; d[97] = -0.007919312; d[98] = -0.008865356; d[99] = -0.009841919; d[100] = -0.010848999; d[101] = -0.011886597; d[102] = -0.012939453; d[103] = -0.014022827; d[104] = -0.015121460; d[105] = -0.016235352; d[106] = -0.017349243; d[107] = -0.018463135; d[108] = -0.019577026; d[109] = -0.020690918; d[110] = -0.021789551; d[111] = -0.022857666; d[112] = -0.023910522; d[113] = -0.024932861; d[114] = -0.025909424; d[115] = -0.026840210; d[116] = -0.027725220; d[117] = -0.028533936; d[118] = -0.029281616; d[119] = -0.029937744; d[120] = -0.030532837; d[121] = -0.031005859; d[122] = -0.031387329; d[123] = -0.031661987; d[124] = -0.031814575; d[125] = -0.031845093; d[126] = -0.031738281; d[127] = -0.031478882; d[128] = 0.031082153; d[129] = 0.030517578; d[130] = 0.029785156; d[131] = 0.028884888; d[132] = 0.027801514; d[133] = 0.026535034; d[134] = 0.025085449; d[135] = 0.023422241; d[136] = 0.021575928; d[137] = 0.019531250; d[138] = 0.017257690; d[139] = 0.014801025; d[140] = 0.012115479; d[141] = 0.009231567; d[142] = 0.006134033; d[143] = 0.002822876; d[144] = -0.000686646; d[145] = -0.004394531; d[146] = -0.008316040; d[147] = -0.012420654; d[148] = -0.016708374; d[149] = -0.021179199; d[150] = -0.025817871; d[151] = -0.030609131; d[152] = -0.035552979; d[153] = -0.040634155; d[154] = -0.045837402; d[155] = -0.051132202; d[156] = -0.056533813; d[157] = -0.061996460; d[158] = -0.067520142; d[159] = -0.073059082; d[160] = -0.078628540; d[161] = -0.084182739; d[162] = -0.089706421; d[163] = -0.095169067; d[164] = -0.100540161; d[165] = -0.105819702; d[166] = -0.110946655; d[167] = -0.115921021; d[168] = -0.120697021; d[169] = -0.125259399; d[170] = -0.129562378; d[171] = -0.133590698; d[172] = -0.137298584; d[173] = -0.140670776; d[174] = -0.143676758; d[175] = -0.146255493; d[176] = -0.148422241; d[177] = -0.150115967; d[178] = -0.151306152; d[179] = -0.151962280; d[180] = -0.152069092; d[181] = -0.151596069; d[182] = -0.150497437; d[183] = -0.148773193; d[184] = -0.146362305; d[185] = -0.143264771; d[186] = -0.139450073; d[187] = -0.134887695; d[188] = -0.129577637; d[189] = -0.123474121; d[190] = -0.116577148; d[191] = -0.108856201; d[192] = 0.100311279; d[193] = 0.090927124; d[194] = 0.080688477; d[195] = 0.069595337; d[196] = 0.057617187; d[197] = 0.044784546; d[198] = 0.031082153; d[199] = 0.016510010; d[200] = 0.001068115; d[201] = -0.015228271; d[202] = -0.032379150; d[203] = -0.050354004; d[204] = -0.069168091; d[205] = -0.088775635; d[206] = -0.109161377; d[207] = -0.130310059; d[208] = -0.152206421; d[209] = -0.174789429; d[210] = -0.198059082; d[211] = -0.221984863; d[212] = -0.246505737; d[213] = -0.271591187; d[214] = -0.297210693; d[215] = -0.323318481; d[216] = -0.349868774; d[217] = -0.376800537; d[218] = -0.404083252; d[219] = -0.431655884; d[220] = -0.459472656; d[221] = -0.487472534; d[222] = -0.515609741; d[223] = -0.543823242; d[224] = -0.572036743; d[225] = -0.600219727; d[226] = -0.628295898; d[227] = -0.656219482; d[228] = -0.683914185; d[229] = -0.711318970; d[230] = -0.738372803; d[231] = -0.765029907; d[232] = -0.791213989; d[233] = -0.816864014; d[234] = -0.841949463; d[235] = -0.866363525; d[236] = -0.890090942; d[237] = -0.913055420; d[238] = -0.935195923; d[239] = -0.956481934; d[240] = -0.976852417; d[241] = -0.996246338; d[242] = -1.014617920; d[243] = -1.031936646; d[244] = -1.048156738; d[245] = -1.063217163; d[246] = -1.077117920; d[247] = -1.089782715; d[248] = -1.101211548; d[249] = -1.111373901; d[250] = -1.120223999; d[251] = -1.127746582; d[252] = -1.133926392; d[253] = -1.138763428; d[254] = -1.142211914; d[255] = -1.144287109; d[256] = 1.144989014; d[257] = 1.144287109; d[258] = 1.142211914; d[259] = 1.138763428; d[260] = 1.133926392; d[261] = 1.127746582; d[262] = 1.120223999; d[263] = 1.111373901; d[264] = 1.101211548; d[265] = 1.089782715; d[266] = 1.077117920; d[267] = 1.063217163; d[268] = 1.048156738; d[269] = 1.031936646; d[270] = 1.014617920; d[271] = 0.996246338; d[272] = 0.976852417; d[273] = 0.956481934; d[274] = 0.935195923; d[275] = 0.913055420; d[276] = 0.890090942; d[277] = 0.866363525; d[278] = 0.841949463; d[279] = 0.816864014; d[280] = 0.791213989; d[281] = 0.765029907; d[282] = 0.738372803; d[283] = 0.711318970; d[284] = 0.683914185; d[285] = 0.656219482; d[286] = 0.628295898; d[287] = 0.600219727; d[288] = 0.572036743; d[289] = 0.543823242; d[290] = 0.515609741; d[291] = 0.487472534; d[292] = 0.459472656; d[293] = 0.431655884; d[294] = 0.404083252; d[295] = 0.376800537; d[296] = 0.349868774; d[297] = 0.323318481; d[298] = 0.297210693; d[299] = 0.271591187; d[300] = 0.246505737; d[301] = 0.221984863; d[302] = 0.198059082; d[303] = 0.174789429; d[304] = 0.152206421; d[305] = 0.130310059; d[306] = 0.109161377; d[307] = 0.088775635; d[308] = 0.069168091; d[309] = 0.050354004; d[310] = 0.032379150; d[311] = 0.015228271; d[312] = -0.001068115; d[313] = -0.016510010; d[314] = -0.031082153; d[315] = -0.044784546; d[316] = -0.057617187; d[317] = -0.069595337; d[318] = -0.080688477; d[319] = -0.090927124; d[320] = 0.100311279; d[321] = 0.108856201; d[322] = 0.116577148; d[323] = 0.123474121; d[324] = 0.129577637; d[325] = 0.134887695; d[326] = 0.139450073; d[327] = 0.143264771; d[328] = 0.146362305; d[329] = 0.148773193; d[330] = 0.150497437; d[331] = 0.151596069; d[332] = 0.152069092; d[333] = 0.151962280; d[334] = 0.151306152; d[335] = 0.150115967; d[336] = 0.148422241; d[337] = 0.146255493; d[338] = 0.143676758; d[339] = 0.140670776; d[340] = 0.137298584; d[341] = 0.133590698; d[342] = 0.129562378; d[343] = 0.125259399; d[344] = 0.120697021; d[345] = 0.115921021; d[346] = 0.110946655; d[347] = 0.105819702; d[348] = 0.100540161; d[349] = 0.095169067; d[350] = 0.089706421; d[351] = 0.084182739; d[352] = 0.078628540; d[353] = 0.073059082; d[354] = 0.067520142; d[355] = 0.061996460; d[356] = 0.056533813; d[357] = 0.051132202; d[358] = 0.045837402; d[359] = 0.040634155; d[360] = 0.035552979; d[361] = 0.030609131; d[362] = 0.025817871; d[363] = 0.021179199; d[364] = 0.016708374; d[365] = 0.012420654; d[366] = 0.008316040; d[367] = 0.004394531; d[368] = 0.000686646; d[369] = -0.002822876; d[370] = -0.006134033; d[371] = -0.009231567; d[372] = -0.012115479; d[373] = -0.014801025; d[374] = -0.017257690; d[375] = -0.019531250; d[376] = -0.021575928; d[377] = -0.023422241; d[378] = -0.025085449; d[379] = -0.026535034; d[380] = -0.027801514; d[381] = -0.028884888; d[382] = -0.029785156; d[383] = -0.030517578; d[384] = 0.031082153; d[385] = 0.031478882; d[386] = 0.031738281; d[387] = 0.031845093; d[388] = 0.031814575; d[389] = 0.031661987; d[390] = 0.031387329; d[391] = 0.031005859; d[392] = 0.030532837; d[393] = 0.029937744; d[394] = 0.029281616; d[395] = 0.028533936; d[396] = 0.027725220; d[397] = 0.026840210; d[398] = 0.025909424; d[399] = 0.024932861; d[400] = 0.023910522; d[401] = 0.022857666; d[402] = 0.021789551; d[403] = 0.020690918; d[404] = 0.019577026; d[405] = 0.018463135; d[406] = 0.017349243; d[407] = 0.016235352; d[408] = 0.015121460; d[409] = 0.014022827; d[410] = 0.012939453; d[411] = 0.011886597; d[412] = 0.010848999; d[413] = 0.009841919; d[414] = 0.008865356; d[415] = 0.007919312; d[416] = 0.007003784; d[417] = 0.006118774; d[418] = 0.005294800; d[419] = 0.004486084; d[420] = 0.003723145; d[421] = 0.003005981; d[422] = 0.002334595; d[423] = 0.001693726; d[424] = 0.001098633; d[425] = 0.000549316; d[426] = 0.000030518; d[427] = -0.000442505; d[428] = -0.000869751; d[429] = -0.001266479; d[430] = -0.001617432; d[431] = -0.001937866; d[432] = -0.002227783; d[433] = -0.002487183; d[434] = -0.002700806; d[435] = -0.002883911; d[436] = -0.003051758; d[437] = -0.003173828; d[438] = -0.003280640; d[439] = -0.003372192; d[440] = -0.003417969; d[441] = -0.003463745; d[442] = -0.003479004; d[443] = -0.003479004; d[444] = -0.003463745; d[445] = -0.003433228; d[446] = -0.003387451; d[447] = -0.003326416; d[448] = 0.003250122; d[449] = 0.003173828; d[450] = 0.003082275; d[451] = 0.002990723; d[452] = 0.002899170; d[453] = 0.002792358; d[454] = 0.002685547; d[455] = 0.002578735; d[456] = 0.002456665; d[457] = 0.002349854; d[458] = 0.002243042; d[459] = 0.002120972; d[460] = 0.002014160; d[461] = 0.001907349; d[462] = 0.001785278; d[463] = 0.001693726; d[464] = 0.001586914; d[465] = 0.001480103; d[466] = 0.001388550; d[467] = 0.001296997; d[468] = 0.001205444; d[469] = 0.001113892; d[470] = 0.001037598; d[471] = 0.000961304; d[472] = 0.000885010; d[473] = 0.000808716; d[474] = 0.000747681; d[475] = 0.000686646; d[476] = 0.000625610; d[477] = 0.000579834; d[478] = 0.000534058; d[479] = 0.000473022; d[480] = 0.000442505; d[481] = 0.000396729; d[482] = 0.000366211; d[483] = 0.000320435; d[484] = 0.000289917; d[485] = 0.000259399; d[486] = 0.000244141; d[487] = 0.000213623; d[488] = 0.000198364; d[489] = 0.000167847; d[490] = 0.000152588; d[491] = 0.000137329; d[492] = 0.000122070; d[493] = 0.000106812; d[494] = 0.000106812; d[495] = 0.000091553; d[496] = 0.000076294; d[497] = 0.000076294; d[498] = 0.000061035; d[499] = 0.000061035; d[500] = 0.000045776; d[501] = 0.000045776; d[502] = 0.000030518; d[503] = 0.000030518; d[504] = 0.000030518; d[505] = 0.000030518; d[506] = 0.000015259; d[507] = 0.000015259; d[508] = 0.000015259; d[509] = 0.000015259; d[510] = 0.000015259; d[511] = 0.000015259; } work push 512 pop 512 { for(int i=0; i<512; i++) push(pop()*d[i]); } } // properly calculate the samples add float->float splitjoin { split roundrobin(); for (int i = 0; i < 32; i++) { add float->float filter { work push 1 pop 16 { float sum = 0; for (int j = 0; j < 16; j++) sum += pop(); push(sum); } } } join roundrobin(); } // convert to "short" add float->int filter { work push 1 pop 1 { int s; float fs = pop()*32767.0; fs = (fs > 32767.0 ? 32767.0 : (fs < -32767.0 ? -32767.0 : fs)); s = (int)fs; push(s); } } } float->float filter IMDCT { float[36*4] win; init { win [ 0 + 0] = -1.6141214951E-02; win [ 0 + 1] = -5.3603178919E-02; win [ 0 + 2] = -1.0070713296E-01; win [ 0 + 3] = -1.6280817573E-01; win [ 0 + 4] = -4.9999999679E-01; win [ 0 + 5] = -3.8388735032E-01; win [ 0 + 6] = -6.2061144372E-01; win [ 0 + 7] = -1.1659756083E+00; win [ 0 + 8] = -3.8720752656E+00; win [ 0 + 9] = -4.2256286556E+00; win [ 0 + 10] = -1.5195289984E+00; win [ 0 + 11] = -9.7416483388E-01; win [ 0 + 12] = -7.3744074053E-01; win [ 0 + 13] = -1.2071067773E+00; win [ 0 + 14] = -5.1636156596E-01; win [ 0 + 15] = -4.5426052317E-01; win [ 0 + 16] = -4.0715656898E-01; win [ 0 + 17] = -3.6969460527E-01; win [ 0 + 18] = -3.3876269197E-01; win [ 0 + 19] = -3.1242222492E-01; win [ 0 + 20] = -2.8939587111E-01; win [ 0 + 21] = -2.6880081906E-01; win [ 0 + 22] = -5.0000000266E-01; win [ 0 + 23] = -2.3251417468E-01; win [ 0 + 24] = -2.1596714708E-01; win [ 0 + 25] = -2.0004979098E-01; win [ 0 + 26] = -1.8449493497E-01; win [ 0 + 27] = -1.6905846094E-01; win [ 0 + 28] = -1.5350360518E-01; win [ 0 + 29] = -1.3758624925E-01; win [ 0 + 30] = -1.2103922149E-01; win [ 0 + 31] = -2.0710679058E-01; win [ 0 + 32] = -8.4752577594E-02; win [ 0 + 33] = -6.4157525656E-02; win [ 0 + 34] = -4.1131172614E-02; win [ 0 + 35] = -1.4790705759E-02; win [36 + 0] = -1.6141214951E-02; win [36 + 1] = -5.3603178919E-02; win [36 + 2] = -1.0070713296E-01; win [36 + 3] = -1.6280817573E-01; win [36 + 4] = -4.9999999679E-01; win [36 + 5] = -3.8388735032E-01; win [36 + 6] = -6.2061144372E-01; win [36 + 7] = -1.1659756083E+00; win [36 + 8] = -3.8720752656E+00; win [36 + 9] = -4.2256286556E+00; win [36 + 10] = -1.5195289984E+00; win [36 + 11] = -9.7416483388E-01; win [36 + 12] = -7.3744074053E-01; win [36 + 13] = -1.2071067773E+00; win [36 + 14] = -5.1636156596E-01; win [36 + 15] = -4.5426052317E-01; win [36 + 16] = -4.0715656898E-01; win [36 + 17] = -3.6969460527E-01; win [36 + 18] = -3.3908542600E-01; win [36 + 19] = -3.1511810350E-01; win [36 + 20] = -2.9642226150E-01; win [36 + 21] = -2.8184548650E-01; win [36 + 22] = -5.4119610000E-01; win [36 + 23] = -2.6213228100E-01; win [36 + 24] = -2.5387916537E-01; win [36 + 25] = -2.3296291359E-01; win [36 + 26] = -1.9852728987E-01; win [36 + 27] = -1.5233534808E-01; win [36 + 28] = -9.6496400054E-02; win [36 + 29] = -3.3423828516E-02; win [36 + 30] = 0.0000000000E+00; win [36 + 31] = 0.0000000000E+00; win [36 + 32] = 0.0000000000E+00; win [36 + 33] = 0.0000000000E+00; win [36 + 34] = 0.0000000000E+00; win [36 + 35] = 0.0000000000E+00; win [72 + 0] = -4.8300800645E-02; win [72 + 1] = -1.5715656932E-01; win [72 + 2] = -2.8325045177E-01; win [72 + 3] = -4.2953747763E-01; win [72 + 4] = -1.2071067795E+00; win [72 + 5] = -8.2426483178E-01; win [72 + 6] = -1.1451749106E+00; win [72 + 7] = -1.7695290101E+00; win [72 + 8] = -4.5470225061E+00; win [72 + 9] = -3.4890531002E+00; win [72 + 10] = -7.3296292804E-01; win [72 + 11] = -1.5076514758E-01; win [72 + 12] = 0.0000000000E+00; win [72 + 13] = 0.0000000000E+00; win [72 + 14] = 0.0000000000E+00; win [72 + 15] = 0.0000000000E+00; win [72 + 16] = 0.0000000000E+00; win [72 + 17] = 0.0000000000E+00; win [72 + 18] = 0.0000000000E+00; win [72 + 19] = 0.0000000000E+00; win [72 + 20] = 0.0000000000E+00; win [72 + 21] = 0.0000000000E+00; win [72 + 22] = 0.0000000000E+00; win [72 + 23] = 0.0000000000E+00; win [72 + 24] = 0.0000000000E+00; win [72 + 25] = 0.0000000000E+00; win [72 + 26] = 0.0000000000E+00; win [72 + 27] = 0.0000000000E+00; win [72 + 28] = 0.0000000000E+00; win [72 + 29] = 0.0000000000E+00; win [72 + 30] = 0.0000000000E+00; win [72 + 31] = 0.0000000000E+00; win [72 + 32] = 0.0000000000E+00; win [72 + 33] = 0.0000000000E+00; win [72 + 34] = 0.0000000000E+00; win [72 + 35] = 0.0000000000E+00; win [108+ 0] = 0.0000000000E+00; win [108+ 1] = 0.0000000000E+00; win [108+ 2] = 0.0000000000E+00; win [108+ 3] = 0.0000000000E+00; win [108+ 4] = 0.0000000000E+00; win [108+ 5] = 0.0000000000E+00; win [108+ 6] = -1.5076513660E-01; win [108+ 7] = -7.3296291107E-01; win [108+ 8] = -3.4890530566E+00; win [108+ 9] = -4.5470224727E+00; win [108+ 10] = -1.7695290031E+00; win [108+ 11] = -1.1451749092E+00; win [108+ 12] = -8.3137738100E-01; win [108+ 13] = -1.3065629650E+00; win [108+ 14] = -5.4142014250E-01; win [108+ 15] = -4.6528974900E-01; win [108+ 16] = -4.1066990750E-01; win [108+ 17] = -3.7004680800E-01; win [108+ 18] = -3.3876269197E-01; win [108+ 19] = -3.1242222492E-01; win [108+ 20] = -2.8939587111E-01; win [108+ 21] = -2.6880081906E-01; win [108+ 22] = -5.0000000266E-01; win [108+ 23] = -2.3251417468E-01; win [108+ 24] = -2.1596714708E-01; win [108+ 25] = -2.0004979098E-01; win [108+ 26] = -1.8449493497E-01; win [108+ 27] = -1.6905846094E-01; win [108+ 28] = -1.5350360518E-01; win [108+ 29] = -1.3758624925E-01; win [108+ 30] = -1.2103922149E-01; win [108+ 31] = -2.0710679058E-01; win [108+ 32] = -8.4752577594E-02; win [108+ 33] = -6.4157525656E-02; win [108+ 34] = -4.1131172614E-02; win [108+ 35] = -1.4790705759E-02; } work push 36 pop 18+1 { float[18] in; float[36] out; int type = (int)pop(); for(int i=0; i<18; i++) in[i] = pop(); inv_mdct(in,out,type); for(int i=0; i<36; i++) push(out[i]); } void inv_mdct(float[18] in, float[36] out, int block_type) { int win_bt; int i; float tmpf_0, tmpf_1, tmpf_2, tmpf_3, tmpf_4, tmpf_5, tmpf_6, tmpf_7, tmpf_8, tmpf_9; float tmpf_10, tmpf_11, tmpf_12, tmpf_13, tmpf_14, tmpf_15, tmpf_16, tmpf_17; tmpf_0 = 0.0; tmpf_1 = 0.0; tmpf_2 = 0.0; tmpf_3 = 0.0; tmpf_4 = 0.0; tmpf_5 = 0.0; tmpf_6 = 0.0; tmpf_7 = 0.0; tmpf_8 = 0.0; tmpf_9 = 0.0; tmpf_10 = 0.0; tmpf_11 = 0.0; tmpf_12 = 0.0; tmpf_13 = 0.0; tmpf_14 = 0.0; tmpf_15 = 0.0; tmpf_16 = 0.0; tmpf_17 = 0.0; if(block_type == 2) { int six_i = 0; // Under MicrosoftVM 2922, This causes a GPF, or // At best, an ArrayIndexOutOfBoundsExceptin. // for(int p=0;p<36;p+=9) // { // out[p] = out[p+1] = out[p+2] = out[p+3] = // out[p+4] = out[p+5] = out[p+6] = out[p+7] = // out[p+8] = 0.0; // } out[0] = 0.0; out[1] = 0.0; out[2] = 0.0; out[3] = 0.0; out[4] = 0.0; out[5] = 0.0; out[6] = 0.0; out[7] = 0.0; out[8] = 0.0; out[9] = 0.0; out[10] = 0.0; out[11] = 0.0; out[12] = 0.0; out[13] = 0.0; out[14] = 0.0; out[15] = 0.0; out[16] = 0.0; out[17] = 0.0; out[18] = 0.0; out[19] = 0.0; out[20] = 0.0; out[21] = 0.0; out[22] = 0.0; out[23] = 0.0; out[24] = 0.0; out[25] = 0.0; out[26] = 0.0; out[27] = 0.0; out[28] = 0.0; out[29] = 0.0; out[30] = 0.0; out[31] = 0.0; out[32] = 0.0; out[33] = 0.0; out[34] = 0.0; out[35] = 0.0; for (i = 0; i < 3; i++) { float pp1, pp2, sum; float save; // 12 point IMDCT // Begin 12 point IDCT // Input aliasing for 12 pt IDCT in[15 + i] += in[12 + i]; in[12 + i] += in[9 + i]; in[9 + i] += in[6 + i]; in[6 + i] += in[3 + i]; in[3 + i] += in[0 + i]; // Input aliasing on odd indices (for 6 point IDCT) in[15 + i] += in[9 + i]; in[9 + i] += in[3 + i]; // 3 point IDCT on even indices pp2 = in[12 + i] * 0.500000000; pp1 = in[6 + i] * 0.866025403; sum = in[0 + i] + pp2; tmpf_1 = in[0 + i] - in[12 + i]; tmpf_0 = sum + pp1; tmpf_2 = sum - pp1; // End 3 point IDCT on even indices // 3 point IDCT on odd indices (for 6 point IDCT) pp2 = in[15 + i] * 0.500000000; pp1 = in[9 + i] * 0.866025403; sum = in[3 + i] + pp2; tmpf_4 = in[3 + i] - in[15 + i]; tmpf_5 = sum + pp1; tmpf_3 = sum - pp1; // End 3 point IDCT on odd indices // Twiddle factors on odd indices (for 6 point IDCT) tmpf_3 *= 1.931851653; tmpf_4 *= 0.707106781; tmpf_5 *= 0.517638090; // Output butterflies on 2 3 point IDCT's (for 6 point IDCT) save = tmpf_0; tmpf_0 += tmpf_5; tmpf_5 = save - tmpf_5; save = tmpf_1; tmpf_1 += tmpf_4; tmpf_4 = save - tmpf_4; save = tmpf_2; tmpf_2 += tmpf_3; tmpf_3 = save - tmpf_3; // End 6 point IDCT // Twiddle factors on indices (for 12 point IDCT) tmpf_0 *= 0.504314480; tmpf_1 *= 0.541196100; tmpf_2 *= 0.630236207; tmpf_3 *= 0.821339815; tmpf_4 *= 1.306562965; tmpf_5 *= 3.830648788; // End 12 point IDCT // Shift to 12 point modified IDCT, multiply by window type 2 tmpf_8 = -tmpf_0 * 0.793353340; tmpf_9 = -tmpf_0 * 0.608761429; tmpf_7 = -tmpf_1 * 0.923879532; tmpf_10 = -tmpf_1 * 0.382683432; tmpf_6 = -tmpf_2 * 0.991444861; tmpf_11 = -tmpf_2 * 0.130526192; tmpf_0 = tmpf_3; tmpf_1 = tmpf_4 * 0.382683432; tmpf_2 = tmpf_5 * 0.608761429; tmpf_3 = -tmpf_5 * 0.793353340; tmpf_4 = -tmpf_4 * 0.923879532; tmpf_5 = -tmpf_0 * 0.991444861; tmpf_0 *= 0.130526192; out[six_i + 6] += tmpf_0; out[six_i + 7] += tmpf_1; out[six_i + 8] += tmpf_2; out[six_i + 9] += tmpf_3; out[six_i + 10] += tmpf_4; out[six_i + 11] += tmpf_5; out[six_i + 12] += tmpf_6; out[six_i + 13] += tmpf_7; out[six_i + 14] += tmpf_8; out[six_i + 15] += tmpf_9; out[six_i + 16] += tmpf_10; out[six_i + 17] += tmpf_11; six_i += 6; } } else { float tmp0, tmp1, tmp2, tmp3, tmp4, tmp0_, tmp1_, tmp2_, tmp3_; float tmp0o, tmp1o, tmp2o, tmp3o, tmp4o, tmp0_o, tmp1_o, tmp2_o, tmp3_o; float i00; float iip12; float i66_; float i0; float i0p12; float i6_; float e, o; // 36 point IDCT // input aliasing for 36 point IDCT in[17] += in[16]; in[16] += in[15]; in[15] += in[14]; in[14] += in[13]; in[13] += in[12]; in[12] += in[11]; in[11] += in[10]; in[10] += in[9]; in[9] += in[8]; in[8] += in[7]; in[7] += in[6]; in[6] += in[5]; in[5] += in[4]; in[4] += in[3]; in[3] += in[2]; in[2] += in[1]; in[1] += in[0]; // 18 point IDCT for odd indices // input aliasing for 18 point IDCT in[17] += in[15]; in[15] += in[13]; in[13] += in[11]; in[11] += in[9]; in[9] += in[7]; in[7] += in[5]; in[5] += in[3]; in[3] += in[1]; // Fast 9 Point Inverse Discrete Cosine Transform // // By Francois-Raymond Boyer // mailto:boyerf@iro.umontreal.ca // http://www.iro.umontreal.ca/~boyerf // // The code has been optimized for Intel processors // (takes a lot of time to convert float to and from iternal FPU representation) // // It is a simple "factorization" of the IDCT matrix. // 9 point IDCT on even indices // 5 points on odd indices (not realy an IDCT) i00 = in[0] + in[0]; iip12 = i00 + in[12]; tmp0 = iip12 + in[4] * 1.8793852415718 + in[8] * 1.532088886238 + in[16] * 0.34729635533386; tmp1 = i00 + in[4] - in[8] - in[12] - in[12] - in[16]; tmp2 = iip12 - in[4] * 0.34729635533386 - in[8] * 1.8793852415718 + in[16] * 1.532088886238; tmp3 = iip12 - in[4] * 1.532088886238 + in[8] * 0.34729635533386 - in[16] * 1.8793852415718; tmp4 = in[0] - in[4] + in[8] - in[12] + in[16]; // 4 points on even indices i66_ = in[6] * 1.732050808; // Sqrt[3] tmp0_ = in[2] * 1.9696155060244 + i66_ + in[10] * 1.2855752193731 + in[14] * 0.68404028665134; tmp1_ = (in[2] - in[10] - in[14]) * 1.732050808; tmp2_ = in[2] * 1.2855752193731 - i66_ - in[10] * 0.68404028665134 + in[14] * 1.9696155060244; tmp3_ = in[2] * 0.68404028665134 - i66_ + in[10] * 1.9696155060244 - in[14] * 1.2855752193731; // 9 point IDCT on odd indices // 5 points on odd indices (not realy an IDCT) i0 = in[0 + 1] + in[0 + 1]; i0p12 = i0 + in[12 + 1]; tmp0o = i0p12 + in[4 + 1] * 1.8793852415718 + in[8 + 1] * 1.532088886238 + in[16 + 1] * 0.34729635533386; tmp1o = i0 + in[4 + 1] - in[8 + 1] - in[12 + 1] - in[12 + 1] - in[16 + 1]; tmp2o = i0p12 - in[4 + 1] * 0.34729635533386 - in[8 + 1] * 1.8793852415718 + in[16 + 1] * 1.532088886238; tmp3o = i0p12 - in[4 + 1] * 1.532088886238 + in[8 + 1] * 0.34729635533386 - in[16 + 1] * 1.8793852415718; tmp4o = (in[0 + 1] - in[4 + 1] + in[8 + 1] - in[12 + 1] + in[16 + 1]) * 0.707106781; // Twiddled // 4 points on even indices i6_ = in[6 + 1] * 1.732050808; // Sqrt[3] tmp0_o = in[2 + 1] * 1.9696155060244 + i6_ + in[10 + 1] * 1.2855752193731 + in[14 + 1] * 0.68404028665134; tmp1_o = (in[2 + 1] - in[10 + 1] - in[14 + 1]) * 1.732050808; tmp2_o = in[2 + 1] * 1.2855752193731 - i6_ - in[10 + 1] * 0.68404028665134 + in[14 + 1] * 1.9696155060244; tmp3_o = in[2 + 1] * 0.68404028665134 - i6_ + in[10 + 1] * 1.9696155060244 - in[14 + 1] * 1.2855752193731; // Twiddle factors on odd indices // and // Butterflies on 9 point IDCT's // and // twiddle factors for 36 point IDCT e = tmp0 + tmp0_; o = (tmp0o + tmp0_o) * 0.501909918; tmpf_0 = e + o; tmpf_17 = e - o; e = tmp1 + tmp1_; o = (tmp1o + tmp1_o) * 0.517638090; tmpf_1 = e + o; tmpf_16 = e - o; e = tmp2 + tmp2_; o = (tmp2o + tmp2_o) * 0.551688959; tmpf_2 = e + o; tmpf_15 = e - o; e = tmp3 + tmp3_; o = (tmp3o + tmp3_o) * 0.610387294; tmpf_3 = e + o; tmpf_14 = e - o; tmpf_4 = tmp4 + tmp4o; tmpf_13 = tmp4 - tmp4o; e = tmp3 - tmp3_; o = (tmp3o - tmp3_o) * 0.871723397; tmpf_5 = e + o; tmpf_12 = e - o; e = tmp2 - tmp2_; o = (tmp2o - tmp2_o) * 1.183100792; tmpf_6 = e + o; tmpf_11 = e - o; e = tmp1 - tmp1_; o = (tmp1o - tmp1_o) * 1.931851653; tmpf_7 = e + o; tmpf_10 = e - o; e = tmp0 - tmp0_; o = (tmp0o - tmp0_o) * 5.736856623; tmpf_8 = e + o; tmpf_9 = e - o; // end 36 point IDCT // shift to modified IDCT win_bt = block_type * 36; out[0] = -tmpf_9 * win [win_bt+0]; out[1] = -tmpf_10 * win [win_bt+1]; out[2] = -tmpf_11 * win [win_bt+2]; out[3] = -tmpf_12 * win [win_bt+3]; out[4] = -tmpf_13 * win [win_bt+4]; out[5] = -tmpf_14 * win [win_bt+5]; out[6] = -tmpf_15 * win [win_bt+6]; out[7] = -tmpf_16 * win [win_bt+7]; out[8] = -tmpf_17 * win [win_bt+8]; out[9] = tmpf_17 * win [win_bt+9]; out[10] = tmpf_16 * win [win_bt+10]; out[11] = tmpf_15 * win [win_bt+11]; out[12] = tmpf_14 * win [win_bt+12]; out[13] = tmpf_13 * win [win_bt+13]; out[14] = tmpf_12 * win [win_bt+14]; out[15] = tmpf_11 * win [win_bt+15]; out[16] = tmpf_10 * win [win_bt+16]; out[17] = tmpf_9 * win [win_bt+17]; out[18] = tmpf_8 * win [win_bt+18]; out[19] = tmpf_7 * win [win_bt+19]; out[20] = tmpf_6 * win [win_bt+20]; out[21] = tmpf_5 * win [win_bt+21]; out[22] = tmpf_4 * win [win_bt+22]; out[23] = tmpf_3 * win [win_bt+23]; out[24] = tmpf_2 * win [win_bt+24]; out[25] = tmpf_1 * win [win_bt+25]; out[26] = tmpf_0 * win [win_bt+26]; out[27] = tmpf_0 * win [win_bt+27]; out[28] = tmpf_1 * win [win_bt+28]; out[29] = tmpf_2 * win [win_bt+29]; out[30] = tmpf_3 * win [win_bt+30]; out[31] = tmpf_4 * win [win_bt+31]; out[32] = tmpf_5 * win [win_bt+32]; out[33] = tmpf_6 * win [win_bt+33]; out[34] = tmpf_7 * win [win_bt+34]; out[35] = tmpf_8 * win [win_bt+35]; } } } float->int pipeline MultiChannelPCMSynthesis(int n) { add MultiChannelPCMSynthesisInterval(n); } float->int splitjoin MultiChannelPCMSynthesisInterval(int n) { int granuleInputSize = 1; split roundrobin((18+1)*32+1); for(int ch=0; chvoid pipeline MP3() { // Input file is enough for -i 100. Full file is not in distribution // due to length: /home/streamit/compiler-static/mp3/Blur.float.raw add FileReader("./Blur.float.raw.portion"); add MultiChannelPCMSynthesis(2); add output_int(); } int->void filter output_int { work push 0 pop 1 peek 1 { println(pop()); } }