internal void backward(float[] fin, float[] fout)
{
if(_x.Length < n/2){_x=new float[n/2];}
if(_w.Length < n/2){_w=new float[n/2];}
float[] x=_x;
float[] w=_w;
int n2=(int)((uint)n >> 1);
int n4=(int)((uint)n >> 2);
int n8=(int)((uint)n >> 3);
// rotate + step 1
{
int inO=1;
int xO=0;
int A=n2;
int i;
for(i=0;i<n8;i++)
{
A-=2;
x[xO++]=-fin[inO+2]*trig[A+1] - fin[inO]*trig[A];
x[xO++]= fin[inO]*trig[A+1] - fin[inO+2]*trig[A];
inO+=4;
}
inO=n2-4;
for(i=0;i<n8;i++)
{
A-=2;
x[xO++]=fin[inO]*trig[A+1] + fin[inO+2]*trig[A];
x[xO++]=fin[inO]*trig[A] - fin[inO+2]*trig[A+1];
inO-=4;
}
}
float[] xxx=mdct_kernel(x,w,n,n2,n4,n8);
int xx=0;
// step 8
{
int B=n2;
int o1=n4,o2=o1-1;
int o3=n4+n2,o4=o3-1;
for(int i=0;i<n4;i++)
{
float temp1= (xxx[xx] * trig[B+1] - xxx[xx+1] * trig[B]);
float temp2=-(xxx[xx] * trig[B] + xxx[xx+1] * trig[B+1]);
fout[o1]=-temp1;
fout[o2]= temp1;
fout[o3]= temp2;
fout[o4]= temp2;
o1++;
o2--;
o3++;
o4--;
xx+=2;
B+=2;
}
}
}