/*
* Copyright (C) 2011 in-somnia
*
* This file is part of JAAD.
*
* JAAD is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* JAAD is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
* If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.jaad.aac.sbr;
/**
* Quadrature mirror filter for analysis
* @author in-somnia
*/
class QMFSynthesis implements FilterbankTables {
private static final float SCALE = 1.0f/64.0f;
private final Filterbank filterBank;
private final float[] v;
private final float[][] x, tmpIn1, tmpOut1, tmpIn2, tmpOut2;
private int vIndex;
private final float[] buf; //buffer for DCT
QMFSynthesis(Filterbank filterBank, int channels) {
this.filterBank = filterBank;
v = new float[40*channels];
x = new float[2][32]; //reverse complex to pass 1D-array to DCT and DST
tmpIn1 = new float[32][2];
tmpOut1 = new float[32][2];
tmpIn2 = new float[32][2];
tmpOut2 = new float[32][2];
vIndex = 0;
buf = new float[398];
}
void performSynthesis32(float[][][] in, float[] out, int len) {
int n, k, off = 0;
float d;
for(int l = 0; l<len; l++) {
//calculate 64 samples
//complex pre-twiddle
for(k = 0; k<32; k++) {
x[0][k] = (in[l][k][0]*QMF32_PRE_TWIDDLE[k][0])-(in[l][k][1]*QMF32_PRE_TWIDDLE[k][1]);
x[1][k] = (in[l][k][1]*QMF32_PRE_TWIDDLE[k][0])+(in[l][k][0]*QMF32_PRE_TWIDDLE[k][1]);
x[0][k] *= SCALE;
x[1][k] *= SCALE;
}
//transform
computeDCT(x[0]);
computeDST(x[1]);
for(n = 0; n<32; n++) {
d = -x[0][n]+x[1][n];
v[vIndex+n] = d;
v[vIndex+640+n] = d;
d = x[0][n]+x[1][n];
v[vIndex+63-n] = d;
v[vIndex+640+63-n] = d;
}
//calculate 32 output samples and window
for(k = 0; k<32; k++) {
out[off++] = (v[vIndex+k]*QMF_C[2*k])
+(v[vIndex+96+k]*QMF_C[64+2*k])
+(v[vIndex+128+k]*QMF_C[128+2*k])
+(v[vIndex+224+k]*QMF_C[192+2*k])
+(v[vIndex+256+k]*QMF_C[256+2*k])
+(v[vIndex+352+k]*QMF_C[320+2*k])
+(v[vIndex+384+k]*QMF_C[384+2*k])
+(v[vIndex+480+k]*QMF_C[448+2*k])
+(v[vIndex+512+k]*QMF_C[512+2*k])
+(v[vIndex+608+k]*QMF_C[576+2*k]);
}
//update ringbuffer index
vIndex -= 64;
if(vIndex<0) vIndex = (640-64);
}
}
void performSynthesis64(float[][][] in, float[] out, int len) {
float[][] pX;
int buf1, buf2;
int n, k, off = 0;
for(int l = 0; l<len; l++) {
//calculate 128 samples
pX = in[l];
tmpIn1[31][1] = SCALE*pX[1][0];
tmpIn1[0][0] = SCALE*pX[0][0];
tmpIn2[31][1] = SCALE*pX[63-1][1];
tmpIn2[0][0] = SCALE*pX[63-0][1];
for(k = 1; k<31; k++) {
tmpIn1[31-k][1] = SCALE*pX[2*k+1][0];
tmpIn1[k][0] = SCALE*pX[2*k][0];
tmpIn2[31-k][1] = SCALE*pX[63-(2*k+1)][1];
tmpIn2[k][0] = SCALE*pX[63-(2*k)][1];
}
tmpIn1[0][1] = SCALE*pX[63][0];
tmpIn1[31][0] = SCALE*pX[62][0];
tmpIn2[0][1] = SCALE*pX[63-63][1];
tmpIn2[31][0] = SCALE*pX[63-62][1];
filterBank.computeDCT4Kernel(tmpIn1, tmpOut1);
filterBank.computeDCT4Kernel(tmpIn2, tmpOut2);
buf1 = vIndex;
buf2 = vIndex+1280;
for(n = 0; n<32; n++) {
v[buf1+2*n] = v[buf2+2*n] = tmpOut2[n][0]-tmpOut1[n][0];
v[buf1+127-2*n] = v[buf2+127-2*n] = tmpOut2[n][0]+tmpOut1[n][0];
v[buf1+2*n+1] = v[buf2+2*n+1] = tmpOut2[31-n][1]+tmpOut1[31-n][1];
v[buf1+127-(2*n+1)] = v[buf2+127-(2*n+1)] = tmpOut2[31-n][1]-tmpOut1[31-n][1];
}
buf1 = vIndex;
//calculate 64 output samples and window
for(k = 0; k<64; k++) {
out[off++] = (v[buf1+k+0]*QMF_C[k+0])
+(v[buf1+k+192]*QMF_C[k+64])
+(v[buf1+k+256]*QMF_C[k+128])
+(v[buf1+k+(256+192)]*QMF_C[k+192])
+(v[buf1+k+512]*QMF_C[k+256])
+(v[buf1+k+(512+192)]*QMF_C[k+320])
+(v[buf1+k+768]*QMF_C[k+384])
+(v[buf1+k+(768+192)]*QMF_C[k+448])
+(v[buf1+k+1024]*QMF_C[k+512])
+(v[buf1+k+(1024+192)]*QMF_C[k+576]);
}
//update ringbuffer index
vIndex -= 128;
if(vIndex<0) vIndex = (1280-128);
}
}
//real DCT-IV of length 32, inplace
private void computeDCT(float[] in) {
buf[0] = in[15]-in[16];
buf[1] = in[15]+in[16];
buf[2] = DCT_TABLE[0]*buf[1];
buf[3] = DCT_TABLE[1]*buf[0];
buf[4] = in[8]-in[23];
buf[5] = in[8]+in[23];
buf[6] = DCT_TABLE[2]*buf[5];
buf[7] = DCT_TABLE[3]*buf[4];
buf[8] = in[12]-in[19];
buf[9] = in[12]+in[19];
buf[10] = DCT_TABLE[4]*buf[9];
buf[11] = DCT_TABLE[5]*buf[8];
buf[12] = in[11]-in[20];
buf[13] = in[11]+in[20];
buf[14] = DCT_TABLE[6]*buf[13];
buf[15] = DCT_TABLE[7]*buf[12];
buf[16] = in[14]-in[17];
buf[17] = in[14]+in[17];
buf[18] = DCT_TABLE[8]*buf[17];
buf[19] = DCT_TABLE[9]*buf[16];
buf[20] = in[9]-in[22];
buf[21] = in[9]+in[22];
buf[22] = DCT_TABLE[10]*buf[21];
buf[23] = DCT_TABLE[11]*buf[20];
buf[24] = in[13]-in[18];
buf[25] = in[13]+in[18];
buf[26] = DCT_TABLE[12]*buf[25];
buf[27] = DCT_TABLE[13]*buf[24];
buf[28] = in[10]-in[21];
buf[29] = in[10]+in[21];
buf[30] = DCT_TABLE[14]*buf[29];
buf[31] = DCT_TABLE[15]*buf[28];
buf[32] = in[0]-buf[2];
buf[33] = in[0]+buf[2];
buf[34] = in[31]-buf[3];
buf[35] = in[31]+buf[3];
buf[36] = in[7]-buf[6];
buf[37] = in[7]+buf[6];
buf[38] = in[24]-buf[7];
buf[39] = in[24]+buf[7];
buf[40] = in[3]-buf[10];
buf[41] = in[3]+buf[10];
buf[42] = in[28]-buf[11];
buf[43] = in[28]+buf[11];
buf[44] = in[4]-buf[14];
buf[45] = in[4]+buf[14];
buf[46] = in[27]-buf[15];
buf[47] = in[27]+buf[15];
buf[48] = in[1]-buf[18];
buf[49] = in[1]+buf[18];
buf[50] = in[30]-buf[19];
buf[51] = in[30]+buf[19];
buf[52] = in[6]-buf[22];
buf[53] = in[6]+buf[22];
buf[54] = in[25]-buf[23];
buf[55] = in[25]+buf[23];
buf[56] = in[2]-buf[26];
buf[57] = in[2]+buf[26];
buf[58] = in[29]-buf[27];
buf[59] = in[29]+buf[27];
buf[60] = in[5]-buf[30];
buf[61] = in[5]+buf[30];
buf[62] = in[26]-buf[31];
buf[63] = in[26]+buf[31];
buf[64] = buf[39]+buf[37];
buf[65] = DCT_TABLE[16]*buf[39];
buf[66] = DCT_TABLE[17]*buf[64];
buf[67] = DCT_TABLE[18]*buf[37];
buf[68] = buf[65]+buf[66];
buf[69] = buf[67]-buf[66];
buf[70] = buf[38]+buf[36];
buf[71] = DCT_TABLE[19]*buf[38];
buf[72] = DCT_TABLE[20]*buf[70];
buf[73] = DCT_TABLE[21]*buf[36];
buf[74] = buf[71]+buf[72];
buf[75] = buf[73]-buf[72];
buf[76] = buf[47]+buf[45];
buf[77] = DCT_TABLE[22]*buf[47];
buf[78] = DCT_TABLE[23]*buf[76];
buf[79] = DCT_TABLE[24]*buf[45];
buf[80] = buf[77]+buf[78];
buf[81] = buf[79]-buf[78];
buf[82] = buf[46]+buf[44];
buf[83] = DCT_TABLE[25]*buf[46];
buf[84] = DCT_TABLE[26]*buf[82];
buf[85] = DCT_TABLE[27]*buf[44];
buf[86] = buf[83]+buf[84];
buf[87] = buf[85]-buf[84];
buf[88] = buf[55]+buf[53];
buf[89] = DCT_TABLE[28]*buf[55];
buf[90] = DCT_TABLE[29]*buf[88];
buf[91] = DCT_TABLE[30]*buf[53];
buf[92] = buf[89]+buf[90];
buf[93] = buf[91]-buf[90];
buf[94] = buf[54]+buf[52];
buf[95] = DCT_TABLE[31]*buf[54];
buf[96] = DCT_TABLE[32]*buf[94];
buf[97] = DCT_TABLE[33]*buf[52];
buf[98] = buf[95]+buf[96];
buf[99] = buf[97]-buf[96];
buf[100] = buf[63]+buf[61];
buf[101] = DCT_TABLE[34]*buf[63];
buf[102] = DCT_TABLE[35]*buf[100];
buf[103] = DCT_TABLE[36]*buf[61];
buf[104] = buf[101]+buf[102];
buf[105] = buf[103]-buf[102];
buf[106] = buf[62]+buf[60];
buf[107] = DCT_TABLE[37]*buf[62];
buf[108] = DCT_TABLE[38]*buf[106];
buf[109] = DCT_TABLE[39]*buf[60];
buf[110] = buf[107]+buf[108];
buf[111] = buf[109]-buf[108];
buf[112] = buf[33]-buf[68];
buf[113] = buf[33]+buf[68];
buf[114] = buf[35]-buf[69];
buf[115] = buf[35]+buf[69];
buf[116] = buf[32]-buf[74];
buf[117] = buf[32]+buf[74];
buf[118] = buf[34]-buf[75];
buf[119] = buf[34]+buf[75];
buf[120] = buf[41]-buf[80];
buf[121] = buf[41]+buf[80];
buf[122] = buf[43]-buf[81];
buf[123] = buf[43]+buf[81];
buf[124] = buf[40]-buf[86];
buf[125] = buf[40]+buf[86];
buf[126] = buf[42]-buf[87];
buf[127] = buf[42]+buf[87];
buf[128] = buf[49]-buf[92];
buf[129] = buf[49]+buf[92];
buf[130] = buf[51]-buf[93];
buf[131] = buf[51]+buf[93];
buf[132] = buf[48]-buf[98];
buf[133] = buf[48]+buf[98];
buf[134] = buf[50]-buf[99];
buf[135] = buf[50]+buf[99];
buf[136] = buf[57]-buf[104];
buf[137] = buf[57]+buf[104];
buf[138] = buf[59]-buf[105];
buf[139] = buf[59]+buf[105];
buf[140] = buf[56]-buf[110];
buf[141] = buf[56]+buf[110];
buf[142] = buf[58]-buf[111];
buf[143] = buf[58]+buf[111];
buf[144] = buf[123]+buf[121];
buf[145] = DCT_TABLE[40]*buf[123];
buf[146] = DCT_TABLE[41]*buf[144];
buf[147] = DCT_TABLE[42]*buf[121];
buf[148] = buf[145]+buf[146];
buf[149] = buf[147]-buf[146];
buf[150] = buf[127]+buf[125];
buf[151] = DCT_TABLE[43]*buf[127];
buf[152] = DCT_TABLE[44]*buf[150];
buf[153] = DCT_TABLE[45]*buf[125];
buf[154] = buf[151]+buf[152];
buf[155] = buf[153]-buf[152];
buf[156] = buf[122]+buf[120];
buf[157] = DCT_TABLE[46]*buf[122];
buf[158] = DCT_TABLE[47]*buf[156];
buf[159] = DCT_TABLE[48]*buf[120];
buf[160] = buf[157]+buf[158];
buf[161] = buf[159]-buf[158];
buf[162] = buf[126]+buf[124];
buf[163] = DCT_TABLE[49]*buf[126];
buf[164] = DCT_TABLE[50]*buf[162];
buf[165] = DCT_TABLE[51]*buf[124];
buf[166] = buf[163]+buf[164];
buf[167] = buf[165]-buf[164];
buf[168] = buf[139]+buf[137];
buf[169] = DCT_TABLE[52]*buf[139];
buf[170] = DCT_TABLE[53]*buf[168];
buf[171] = DCT_TABLE[54]*buf[137];
buf[172] = buf[169]+buf[170];
buf[173] = buf[171]-buf[170];
buf[174] = buf[143]+buf[141];
buf[175] = DCT_TABLE[55]*buf[143];
buf[176] = DCT_TABLE[56]*buf[174];
buf[177] = DCT_TABLE[57]*buf[141];
buf[178] = buf[175]+buf[176];
buf[179] = buf[177]-buf[176];
buf[180] = buf[138]+buf[136];
buf[181] = DCT_TABLE[58]*buf[138];
buf[182] = DCT_TABLE[59]*buf[180];
buf[183] = DCT_TABLE[60]*buf[136];
buf[184] = buf[181]+buf[182];
buf[185] = buf[183]-buf[182];
buf[186] = buf[142]+buf[140];
buf[187] = DCT_TABLE[61]*buf[142];
buf[188] = DCT_TABLE[62]*buf[186];
buf[189] = DCT_TABLE[63]*buf[140];
buf[190] = buf[187]+buf[188];
buf[191] = buf[189]-buf[188];
buf[192] = buf[113]-buf[148];
buf[193] = buf[113]+buf[148];
buf[194] = buf[115]-buf[149];
buf[195] = buf[115]+buf[149];
buf[196] = buf[117]-buf[154];
buf[197] = buf[117]+buf[154];
buf[198] = buf[119]-buf[155];
buf[199] = buf[119]+buf[155];
buf[200] = buf[112]-buf[160];
buf[201] = buf[112]+buf[160];
buf[202] = buf[114]-buf[161];
buf[203] = buf[114]+buf[161];
buf[204] = buf[116]-buf[166];
buf[205] = buf[116]+buf[166];
buf[206] = buf[118]-buf[167];
buf[207] = buf[118]+buf[167];
buf[208] = buf[129]-buf[172];
buf[209] = buf[129]+buf[172];
buf[210] = buf[131]-buf[173];
buf[211] = buf[131]+buf[173];
buf[212] = buf[133]-buf[178];
buf[213] = buf[133]+buf[178];
buf[214] = buf[135]-buf[179];
buf[215] = buf[135]+buf[179];
buf[216] = buf[128]-buf[184];
buf[217] = buf[128]+buf[184];
buf[218] = buf[130]-buf[185];
buf[219] = buf[130]+buf[185];
buf[220] = buf[132]-buf[190];
buf[221] = buf[132]+buf[190];
buf[222] = buf[134]-buf[191];
buf[223] = buf[134]+buf[191];
buf[224] = buf[211]+buf[209];
buf[225] = DCT_TABLE[64]*buf[211];
buf[226] = DCT_TABLE[65]*buf[224];
buf[227] = DCT_TABLE[66]*buf[209];
buf[228] = buf[225]+buf[226];
buf[229] = buf[227]-buf[226];
buf[230] = buf[215]+buf[213];
buf[231] = DCT_TABLE[67]*buf[215];
buf[232] = DCT_TABLE[68]*buf[230];
buf[233] = DCT_TABLE[69]*buf[213];
buf[234] = buf[231]+buf[232];
buf[235] = buf[233]-buf[232];
buf[236] = buf[219]+buf[217];
buf[237] = DCT_TABLE[70]*buf[219];
buf[238] = DCT_TABLE[71]*buf[236];
buf[239] = DCT_TABLE[72]*buf[217];
buf[240] = buf[237]+buf[238];
buf[241] = buf[239]-buf[238];
buf[242] = buf[223]+buf[221];
buf[243] = DCT_TABLE[73]*buf[223];
buf[244] = DCT_TABLE[74]*buf[242];
buf[245] = DCT_TABLE[75]*buf[221];
buf[246] = buf[243]+buf[244];
buf[247] = buf[245]-buf[244];
buf[248] = buf[210]+buf[208];
buf[249] = DCT_TABLE[76]*buf[210];
buf[250] = DCT_TABLE[77]*buf[248];
buf[251] = DCT_TABLE[78]*buf[208];
buf[252] = buf[249]+buf[250];
buf[253] = buf[251]-buf[250];
buf[254] = buf[214]+buf[212];
buf[255] = DCT_TABLE[79]*buf[214];
buf[256] = DCT_TABLE[80]*buf[254];
buf[257] = DCT_TABLE[81]*buf[212];
buf[258] = buf[255]+buf[256];
buf[259] = buf[257]-buf[256];
buf[260] = buf[218]+buf[216];
buf[261] = DCT_TABLE[82]*buf[218];
buf[262] = DCT_TABLE[83]*buf[260];
buf[263] = DCT_TABLE[84]*buf[216];
buf[264] = buf[261]+buf[262];
buf[265] = buf[263]-buf[262];
buf[266] = buf[222]+buf[220];
buf[267] = DCT_TABLE[85]*buf[222];
buf[268] = DCT_TABLE[86]*buf[266];
buf[269] = DCT_TABLE[87]*buf[220];
buf[270] = buf[267]+buf[268];
buf[271] = buf[269]-buf[268];
buf[272] = buf[193]-buf[228];
buf[273] = buf[193]+buf[228];
buf[274] = buf[195]-buf[229];
buf[275] = buf[195]+buf[229];
buf[276] = buf[197]-buf[234];
buf[277] = buf[197]+buf[234];
buf[278] = buf[199]-buf[235];
buf[279] = buf[199]+buf[235];
buf[280] = buf[201]-buf[240];
buf[281] = buf[201]+buf[240];
buf[282] = buf[203]-buf[241];
buf[283] = buf[203]+buf[241];
buf[284] = buf[205]-buf[246];
buf[285] = buf[205]+buf[246];
buf[286] = buf[207]-buf[247];
buf[287] = buf[207]+buf[247];
buf[288] = buf[192]-buf[252];
buf[289] = buf[192]+buf[252];
buf[290] = buf[194]-buf[253];
buf[291] = buf[194]+buf[253];
buf[292] = buf[196]-buf[258];
buf[293] = buf[196]+buf[258];
buf[294] = buf[198]-buf[259];
buf[295] = buf[198]+buf[259];
buf[296] = buf[200]-buf[264];
buf[297] = buf[200]+buf[264];
buf[298] = buf[202]-buf[265];
buf[299] = buf[202]+buf[265];
buf[300] = buf[204]-buf[270];
buf[301] = buf[204]+buf[270];
buf[302] = buf[206]-buf[271];
buf[303] = buf[206]+buf[271];
buf[304] = buf[275]+buf[273];
buf[305] = DCT_TABLE[88]*buf[275];
buf[306] = DCT_TABLE[89]*buf[304];
buf[307] = DCT_TABLE[90]*buf[273];
in[0] = buf[305]+buf[306];
in[31] = buf[307]-buf[306];
buf[310] = buf[279]+buf[277];
buf[311] = DCT_TABLE[91]*buf[279];
buf[312] = DCT_TABLE[92]*buf[310];
buf[313] = DCT_TABLE[93]*buf[277];
in[2] = buf[311]+buf[312];
in[29] = buf[313]-buf[312];
buf[316] = buf[283]+buf[281];
buf[317] = DCT_TABLE[94]*buf[283];
buf[318] = DCT_TABLE[95]*buf[316];
buf[319] = DCT_TABLE[96]*buf[281];
in[4] = buf[317]+buf[318];
in[27] = buf[319]-buf[318];
buf[322] = buf[287]+buf[285];
buf[323] = DCT_TABLE[97]*buf[287];
buf[324] = DCT_TABLE[98]*buf[322];
buf[325] = DCT_TABLE[99]*buf[285];
in[6] = buf[323]+buf[324];
in[25] = buf[325]-buf[324];
buf[328] = buf[291]+buf[289];
buf[329] = DCT_TABLE[100]*buf[291];
buf[330] = DCT_TABLE[101]*buf[328];
buf[331] = DCT_TABLE[102]*buf[289];
in[8] = buf[329]+buf[330];
in[23] = buf[331]-buf[330];
buf[334] = buf[295]+buf[293];
buf[335] = DCT_TABLE[103]*buf[295];
buf[336] = DCT_TABLE[104]*buf[334];
buf[337] = DCT_TABLE[105]*buf[293];
in[10] = buf[335]+buf[336];
in[21] = buf[337]-buf[336];
buf[340] = buf[299]+buf[297];
buf[341] = DCT_TABLE[106]*buf[299];
buf[342] = DCT_TABLE[107]*buf[340];
buf[343] = DCT_TABLE[108]*buf[297];
in[12] = buf[341]+buf[342];
in[19] = buf[343]-buf[342];
buf[346] = buf[303]+buf[301];
buf[347] = DCT_TABLE[109]*buf[303];
buf[348] = DCT_TABLE[110]*buf[346];
buf[349] = DCT_TABLE[111]*buf[301];
in[14] = buf[347]+buf[348];
in[17] = buf[349]-buf[348];
buf[352] = buf[274]+buf[272];
buf[353] = DCT_TABLE[112]*buf[274];
buf[354] = DCT_TABLE[113]*buf[352];
buf[355] = DCT_TABLE[114]*buf[272];
in[16] = buf[353]+buf[354];
in[15] = buf[355]-buf[354];
buf[358] = buf[278]+buf[276];
buf[359] = DCT_TABLE[115]*buf[278];
buf[360] = DCT_TABLE[116]*buf[358];
buf[361] = DCT_TABLE[117]*buf[276];
in[18] = buf[359]+buf[360];
in[13] = buf[361]-buf[360];
buf[364] = buf[282]+buf[280];
buf[365] = DCT_TABLE[118]*buf[282];
buf[366] = DCT_TABLE[119]*buf[364];
buf[367] = DCT_TABLE[120]*buf[280];
in[20] = buf[365]+buf[366];
in[11] = buf[367]-buf[366];
buf[370] = buf[286]+buf[284];
buf[371] = DCT_TABLE[121]*buf[286];
buf[372] = DCT_TABLE[122]*buf[370];
buf[373] = DCT_TABLE[123]*buf[284];
in[22] = buf[371]+buf[372];
in[9] = buf[373]-buf[372];
buf[376] = buf[290]+buf[288];
buf[377] = DCT_TABLE[124]*buf[290];
buf[378] = DCT_TABLE[125]*buf[376];
buf[379] = DCT_TABLE[126]*buf[288];
in[24] = buf[377]+buf[378];
in[7] = buf[379]-buf[378];
buf[382] = buf[294]+buf[292];
buf[383] = DCT_TABLE[127]*buf[294];
buf[384] = DCT_TABLE[128]*buf[382];
buf[385] = DCT_TABLE[129]*buf[292];
in[26] = buf[383]+buf[384];
in[5] = buf[385]-buf[384];
buf[388] = buf[298]+buf[296];
buf[389] = DCT_TABLE[130]*buf[298];
buf[390] = DCT_TABLE[131]*buf[388];
buf[391] = DCT_TABLE[132]*buf[296];
in[28] = buf[389]+buf[390];
in[3] = buf[391]-buf[390];
buf[394] = buf[302]+buf[300];
buf[395] = DCT_TABLE[133]*buf[302];
buf[396] = DCT_TABLE[134]*buf[394];
buf[397] = DCT_TABLE[135]*buf[300];
in[30] = buf[395]+buf[396];
in[1] = buf[397]-buf[396];
}
//real DST-IV of length 32, inplace
private void computeDST(float[] in) {
buf[0] = in[0]-in[1];
buf[1] = in[2]-in[1];
buf[2] = in[2]-in[3];
buf[3] = in[4]-in[3];
buf[4] = in[4]-in[5];
buf[5] = in[6]-in[5];
buf[6] = in[6]-in[7];
buf[7] = in[8]-in[7];
buf[8] = in[8]-in[9];
buf[9] = in[10]-in[9];
buf[10] = in[10]-in[11];
buf[11] = in[12]-in[11];
buf[12] = in[12]-in[13];
buf[13] = in[14]-in[13];
buf[14] = in[14]-in[15];
buf[15] = in[16]-in[15];
buf[16] = in[16]-in[17];
buf[17] = in[18]-in[17];
buf[18] = in[18]-in[19];
buf[19] = in[20]-in[19];
buf[20] = in[20]-in[21];
buf[21] = in[22]-in[21];
buf[22] = in[22]-in[23];
buf[23] = in[24]-in[23];
buf[24] = in[24]-in[25];
buf[25] = in[26]-in[25];
buf[26] = in[26]-in[27];
buf[27] = in[28]-in[27];
buf[28] = in[28]-in[29];
buf[29] = in[30]-in[29];
buf[30] = in[30]-in[31];
buf[31] = DST_TABLE[0]*buf[15];
buf[32] = in[0]-buf[31];
buf[33] = in[0]+buf[31];
buf[34] = buf[7]+buf[23];
buf[35] = DST_TABLE[1]*buf[7];
buf[36] = DST_TABLE[2]*buf[34];
buf[37] = DST_TABLE[3]*buf[23];
buf[38] = buf[35]+buf[36];
buf[39] = buf[37]-buf[36];
buf[40] = buf[33]-buf[39];
buf[41] = buf[33]+buf[39];
buf[42] = buf[32]-buf[38];
buf[43] = buf[32]+buf[38];
buf[44] = buf[11]-buf[19];
buf[45] = buf[11]+buf[19];
buf[46] = DST_TABLE[4]*buf[45];
buf[47] = buf[3]-buf[46];
buf[48] = buf[3]+buf[46];
buf[49] = DST_TABLE[5]*buf[44];
buf[50] = buf[49]-buf[27];
buf[51] = buf[49]+buf[27];
buf[52] = buf[51]+buf[48];
buf[53] = DST_TABLE[6]*buf[51];
buf[54] = DST_TABLE[7]*buf[52];
buf[55] = DST_TABLE[8]*buf[48];
buf[56] = buf[53]+buf[54];
buf[57] = buf[55]-buf[54];
buf[58] = buf[50]+buf[47];
buf[59] = DST_TABLE[9]*buf[50];
buf[60] = DST_TABLE[10]*buf[58];
buf[61] = DST_TABLE[11]*buf[47];
buf[62] = buf[59]+buf[60];
buf[63] = buf[61]-buf[60];
buf[64] = buf[41]-buf[56];
buf[65] = buf[41]+buf[56];
buf[66] = buf[43]-buf[62];
buf[67] = buf[43]+buf[62];
buf[68] = buf[42]-buf[63];
buf[69] = buf[42]+buf[63];
buf[70] = buf[40]-buf[57];
buf[71] = buf[40]+buf[57];
buf[72] = buf[5]-buf[9];
buf[73] = buf[5]+buf[9];
buf[74] = buf[13]-buf[17];
buf[75] = buf[13]+buf[17];
buf[76] = buf[21]-buf[25];
buf[77] = buf[21]+buf[25];
buf[78] = DST_TABLE[12]*buf[75];
buf[79] = buf[1]-buf[78];
buf[80] = buf[1]+buf[78];
buf[81] = buf[73]+buf[77];
buf[82] = DST_TABLE[13]*buf[73];
buf[83] = DST_TABLE[14]*buf[81];
buf[84] = DST_TABLE[15]*buf[77];
buf[85] = buf[82]+buf[83];
buf[86] = buf[84]-buf[83];
buf[87] = buf[80]-buf[86];
buf[88] = buf[80]+buf[86];
buf[89] = buf[79]-buf[85];
buf[90] = buf[79]+buf[85];
buf[91] = DST_TABLE[16]*buf[74];
buf[92] = buf[29]-buf[91];
buf[93] = buf[29]+buf[91];
buf[94] = buf[76]+buf[72];
buf[95] = DST_TABLE[17]*buf[76];
buf[96] = DST_TABLE[18]*buf[94];
buf[97] = DST_TABLE[19]*buf[72];
buf[98] = buf[95]+buf[96];
buf[99] = buf[97]-buf[96];
buf[100] = buf[93]-buf[99];
buf[101] = buf[93]+buf[99];
buf[102] = buf[92]-buf[98];
buf[103] = buf[92]+buf[98];
buf[104] = buf[101]+buf[88];
buf[105] = DST_TABLE[20]*buf[101];
buf[106] = DST_TABLE[21]*buf[104];
buf[107] = DST_TABLE[22]*buf[88];
buf[108] = buf[105]+buf[106];
buf[109] = buf[107]-buf[106];
buf[110] = buf[90]-buf[103];
buf[111] = DST_TABLE[23]*buf[103];
buf[112] = DST_TABLE[24]*buf[110];
buf[113] = DST_TABLE[25]*buf[90];
buf[114] = buf[112]-buf[111];
buf[115] = buf[113]-buf[112];
buf[116] = buf[102]+buf[89];
buf[117] = DST_TABLE[26]*buf[102];
buf[118] = DST_TABLE[27]*buf[116];
buf[119] = DST_TABLE[28]*buf[89];
buf[120] = buf[117]+buf[118];
buf[121] = buf[119]-buf[118];
buf[122] = buf[87]-buf[100];
buf[123] = DST_TABLE[29]*buf[100];
buf[124] = DST_TABLE[30]*buf[122];
buf[125] = DST_TABLE[31]*buf[87];
buf[126] = buf[124]-buf[123];
buf[127] = buf[125]-buf[124];
buf[128] = buf[65]-buf[108];
buf[129] = buf[65]+buf[108];
buf[130] = buf[67]-buf[114];
buf[131] = buf[67]+buf[114];
buf[132] = buf[69]-buf[120];
buf[133] = buf[69]+buf[120];
buf[134] = buf[71]-buf[126];
buf[135] = buf[71]+buf[126];
buf[136] = buf[70]-buf[127];
buf[137] = buf[70]+buf[127];
buf[138] = buf[68]-buf[121];
buf[139] = buf[68]+buf[121];
buf[140] = buf[66]-buf[115];
buf[141] = buf[66]+buf[115];
buf[142] = buf[64]-buf[109];
buf[143] = buf[64]+buf[109];
buf[144] = buf[0]+buf[30];
buf[145] = DST_TABLE[32]*buf[0];
buf[146] = DST_TABLE[33]*buf[144];
buf[147] = DST_TABLE[34]*buf[30];
buf[148] = buf[145]+buf[146];
buf[149] = buf[147]-buf[146];
buf[150] = buf[4]+buf[26];
buf[151] = DST_TABLE[35]*buf[4];
buf[152] = DST_TABLE[36]*buf[150];
buf[153] = DST_TABLE[37]*buf[26];
buf[154] = buf[151]+buf[152];
buf[155] = buf[153]-buf[152];
buf[156] = buf[8]+buf[22];
buf[157] = DST_TABLE[38]*buf[8];
buf[158] = DST_TABLE[39]*buf[156];
buf[159] = DST_TABLE[40]*buf[22];
buf[160] = buf[157]+buf[158];
buf[161] = buf[159]-buf[158];
buf[162] = buf[12]+buf[18];
buf[163] = DST_TABLE[41]*buf[12];
buf[164] = DST_TABLE[42]*buf[162];
buf[165] = DST_TABLE[43]*buf[18];
buf[166] = buf[163]+buf[164];
buf[167] = buf[165]-buf[164];
buf[168] = buf[16]+buf[14];
buf[169] = DST_TABLE[44]*buf[16];
buf[170] = DST_TABLE[45]*buf[168];
buf[171] = DST_TABLE[46]*buf[14];
buf[172] = buf[169]+buf[170];
buf[173] = buf[171]-buf[170];
buf[174] = buf[20]+buf[10];
buf[175] = DST_TABLE[47]*buf[20];
buf[176] = DST_TABLE[48]*buf[174];
buf[177] = DST_TABLE[49]*buf[10];
buf[178] = buf[175]+buf[176];
buf[179] = buf[177]-buf[176];
buf[180] = buf[24]+buf[6];
buf[181] = DST_TABLE[50]*buf[24];
buf[182] = DST_TABLE[51]*buf[180];
buf[183] = DST_TABLE[52]*buf[6];
buf[184] = buf[181]+buf[182];
buf[185] = buf[183]-buf[182];
buf[186] = buf[28]+buf[2];
buf[187] = DST_TABLE[53]*buf[28];
buf[188] = DST_TABLE[54]*buf[186];
buf[189] = DST_TABLE[55]*buf[2];
buf[190] = buf[187]+buf[188];
buf[191] = buf[189]-buf[188];
buf[192] = buf[149]-buf[173];
buf[193] = buf[149]+buf[173];
buf[194] = buf[148]-buf[172];
buf[195] = buf[148]+buf[172];
buf[196] = buf[155]-buf[179];
buf[197] = buf[155]+buf[179];
buf[198] = buf[154]-buf[178];
buf[199] = buf[154]+buf[178];
buf[200] = buf[161]-buf[185];
buf[201] = buf[161]+buf[185];
buf[202] = buf[160]-buf[184];
buf[203] = buf[160]+buf[184];
buf[204] = buf[167]-buf[191];
buf[205] = buf[167]+buf[191];
buf[206] = buf[166]-buf[190];
buf[207] = buf[166]+buf[190];
buf[208] = buf[192]+buf[194];
buf[209] = DST_TABLE[56]*buf[192];
buf[210] = DST_TABLE[57]*buf[208];
buf[211] = DST_TABLE[58]*buf[194];
buf[212] = buf[209]+buf[210];
buf[213] = buf[211]-buf[210];
buf[214] = buf[196]+buf[198];
buf[215] = DST_TABLE[59]*buf[196];
buf[216] = DST_TABLE[60]*buf[214];
buf[217] = DST_TABLE[61]*buf[198];
buf[218] = buf[215]+buf[216];
buf[219] = buf[217]-buf[216];
buf[220] = buf[200]+buf[202];
buf[221] = DST_TABLE[62]*buf[200];
buf[222] = DST_TABLE[63]*buf[220];
buf[223] = DST_TABLE[64]*buf[202];
buf[224] = buf[221]+buf[222];
buf[225] = buf[223]-buf[222];
buf[226] = buf[204]+buf[206];
buf[227] = DST_TABLE[65]*buf[204];
buf[228] = DST_TABLE[66]*buf[226];
buf[229] = DST_TABLE[67]*buf[206];
buf[230] = buf[227]+buf[228];
buf[231] = buf[229]-buf[228];
buf[232] = buf[193]-buf[201];
buf[233] = buf[193]+buf[201];
buf[234] = buf[195]-buf[203];
buf[235] = buf[195]+buf[203];
buf[236] = buf[197]-buf[205];
buf[237] = buf[197]+buf[205];
buf[238] = buf[199]-buf[207];
buf[239] = buf[199]+buf[207];
buf[240] = buf[213]-buf[225];
buf[241] = buf[213]+buf[225];
buf[242] = buf[212]-buf[224];
buf[243] = buf[212]+buf[224];
buf[244] = buf[219]-buf[231];
buf[245] = buf[219]+buf[231];
buf[246] = buf[218]-buf[230];
buf[247] = buf[218]+buf[230];
buf[248] = buf[232]+buf[234];
buf[249] = DST_TABLE[68]*buf[232];
buf[250] = DST_TABLE[69]*buf[248];
buf[251] = DST_TABLE[70]*buf[234];
buf[252] = buf[249]+buf[250];
buf[253] = buf[251]-buf[250];
buf[254] = buf[236]+buf[238];
buf[255] = DST_TABLE[71]*buf[236];
buf[256] = DST_TABLE[72]*buf[254];
buf[257] = DST_TABLE[73]*buf[238];
buf[258] = buf[255]+buf[256];
buf[259] = buf[257]-buf[256];
buf[260] = buf[240]+buf[242];
buf[261] = DST_TABLE[74]*buf[240];
buf[262] = DST_TABLE[75]*buf[260];
buf[263] = DST_TABLE[76]*buf[242];
buf[264] = buf[261]+buf[262];
buf[265] = buf[263]-buf[262];
buf[266] = buf[244]+buf[246];
buf[267] = DST_TABLE[77]*buf[244];
buf[268] = DST_TABLE[78]*buf[266];
buf[269] = DST_TABLE[79]*buf[246];
buf[270] = buf[267]+buf[268];
buf[271] = buf[269]-buf[268];
buf[272] = buf[233]-buf[237];
buf[273] = buf[233]+buf[237];
buf[274] = buf[235]-buf[239];
buf[275] = buf[235]+buf[239];
buf[276] = buf[253]-buf[259];
buf[277] = buf[253]+buf[259];
buf[278] = buf[252]-buf[258];
buf[279] = buf[252]+buf[258];
buf[280] = buf[241]-buf[245];
buf[281] = buf[241]+buf[245];
buf[282] = buf[243]-buf[247];
buf[283] = buf[243]+buf[247];
buf[284] = buf[265]-buf[271];
buf[285] = buf[265]+buf[271];
buf[286] = buf[264]-buf[270];
buf[287] = buf[264]+buf[270];
buf[288] = buf[272]-buf[274];
buf[289] = buf[272]+buf[274];
buf[290] = DST_TABLE[80]*buf[288];
buf[291] = DST_TABLE[81]*buf[289];
buf[292] = buf[276]-buf[278];
buf[293] = buf[276]+buf[278];
buf[294] = DST_TABLE[82]*buf[292];
buf[295] = DST_TABLE[83]*buf[293];
buf[296] = buf[280]-buf[282];
buf[297] = buf[280]+buf[282];
buf[298] = DST_TABLE[84]*buf[296];
buf[299] = DST_TABLE[85]*buf[297];
buf[300] = buf[284]-buf[286];
buf[301] = buf[284]+buf[286];
buf[302] = DST_TABLE[86]*buf[300];
buf[303] = DST_TABLE[87]*buf[301];
buf[304] = buf[129]-buf[273];
buf[305] = buf[129]+buf[273];
buf[306] = buf[131]-buf[281];
buf[307] = buf[131]+buf[281];
buf[308] = buf[133]-buf[285];
buf[309] = buf[133]+buf[285];
buf[310] = buf[135]-buf[277];
buf[311] = buf[135]+buf[277];
buf[312] = buf[137]-buf[295];
buf[313] = buf[137]+buf[295];
buf[314] = buf[139]-buf[303];
buf[315] = buf[139]+buf[303];
buf[316] = buf[141]-buf[299];
buf[317] = buf[141]+buf[299];
buf[318] = buf[143]-buf[291];
buf[319] = buf[143]+buf[291];
buf[320] = buf[142]-buf[290];
buf[321] = buf[142]+buf[290];
buf[322] = buf[140]-buf[298];
buf[323] = buf[140]+buf[298];
buf[324] = buf[138]-buf[302];
buf[325] = buf[138]+buf[302];
buf[326] = buf[136]-buf[294];
buf[327] = buf[136]+buf[294];
buf[328] = buf[134]-buf[279];
buf[329] = buf[134]+buf[279];
buf[330] = buf[132]-buf[287];
buf[331] = buf[132]+buf[287];
buf[332] = buf[130]-buf[283];
buf[333] = buf[130]+buf[283];
buf[334] = buf[128]-buf[275];
buf[335] = buf[128]+buf[275];
in[31] = DST_TABLE[88]*buf[305];
in[30] = DST_TABLE[89]*buf[307];
in[29] = DST_TABLE[90]*buf[309];
in[28] = DST_TABLE[91]*buf[311];
in[27] = DST_TABLE[92]*buf[313];
in[26] = DST_TABLE[93]*buf[315];
in[25] = DST_TABLE[94]*buf[317];
in[24] = DST_TABLE[95]*buf[319];
in[23] = DST_TABLE[96]*buf[321];
in[22] = DST_TABLE[97]*buf[323];
in[21] = DST_TABLE[98]*buf[325];
in[20] = DST_TABLE[99]*buf[327];
in[19] = DST_TABLE[100]*buf[329];
in[18] = DST_TABLE[101]*buf[331];
in[17] = DST_TABLE[102]*buf[333];
in[16] = DST_TABLE[103]*buf[335];
in[15] = DST_TABLE[104]*buf[334];
in[14] = DST_TABLE[105]*buf[332];
in[13] = DST_TABLE[106]*buf[330];
in[12] = DST_TABLE[107]*buf[328];
in[11] = DST_TABLE[108]*buf[326];
in[10] = DST_TABLE[109]*buf[324];
in[9] = DST_TABLE[110]*buf[322];
in[8] = DST_TABLE[111]*buf[320];
in[7] = DST_TABLE[112]*buf[318];
in[6] = DST_TABLE[113]*buf[316];
in[5] = DST_TABLE[114]*buf[314];
in[4] = DST_TABLE[115]*buf[312];
in[3] = DST_TABLE[116]*buf[310];
in[2] = DST_TABLE[117]*buf[308];
in[1] = DST_TABLE[118]*buf[306];
in[0] = DST_TABLE[119]*buf[304];
}
}