/************************************************************************* Internal subroutine. Never call it directly! -- ALGLIB -- Copyright 01.06.2009 by Bochkanov Sergey *************************************************************************/ public static void fftr1dinvinternaleven(ref double[] a, int n, ref double[] buf, ftbase.ftplan plan) { double x = 0; double y = 0; double t = 0; int i = 0; int n2 = 0; ap.assert(n>0 & n%2==0, "FFTR1DInvInternalEven: incorrect N!"); // // Special cases: // * N=2 // // After this block we assume that N is strictly greater than 2 // if( n==2 ) { x = 0.5*(a[0]+a[1]); y = 0.5*(a[0]-a[1]); a[0] = x; a[1] = y; return; } // // inverse real FFT is reduced to the inverse real FHT, // which is reduced to the forward real FHT, // which is reduced to the forward real FFT. // // Don't worry, it is really compact and efficient reduction :) // n2 = n/2; buf[0] = a[0]; for(i=1; i<=n2-1; i++) { x = a[2*i+0]; y = a[2*i+1]; buf[i] = x-y; buf[n-i] = x+y; } buf[n2] = a[1]; fftr1dinternaleven(ref buf, n, ref a, plan); a[0] = buf[0]/n; t = (double)1/(double)n; for(i=1; i<=n2-1; i++) { x = buf[2*i+0]; y = buf[2*i+1]; a[i] = t*(x-y); a[n-i] = t*(x+y); } a[n2] = buf[1]/n; }
/************************************************************************* Internal subroutine. Never call it directly! -- ALGLIB -- Copyright 01.06.2009 by Bochkanov Sergey *************************************************************************/ public static void fftr1dinternaleven(ref double[] a, int n, ref double[] buf, ftbase.ftplan plan) { double x = 0; double y = 0; int i = 0; int n2 = 0; int idx = 0; complex hn = 0; complex hmnc = 0; complex v = 0; int i_ = 0; ap.assert(n>0 & n%2==0, "FFTR1DEvenInplace: incorrect N!"); // // Special cases: // * N=2 // // After this block we assume that N is strictly greater than 2 // if( n==2 ) { x = a[0]+a[1]; y = a[0]-a[1]; a[0] = x; a[1] = y; return; } // // even-size real FFT, use reduction to the complex task // n2 = n/2; for(i_=0; i_<=n-1;i_++) { buf[i_] = a[i_]; } ftbase.ftbaseexecuteplan(ref buf, 0, n2, plan); a[0] = buf[0]+buf[1]; for(i=1; i<=n2-1; i++) { idx = 2*(i%n2); hn.x = buf[idx+0]; hn.y = buf[idx+1]; idx = 2*(n2-i); hmnc.x = buf[idx+0]; hmnc.y = -buf[idx+1]; v.x = -Math.Sin(-(2*Math.PI*i/n)); v.y = Math.Cos(-(2*Math.PI*i/n)); v = hn+hmnc-v*(hn-hmnc); a[2*i+0] = 0.5*v.x; a[2*i+1] = 0.5*v.y; } a[1] = buf[0]-buf[1]; }