public static void ddct( int n, int isgn, double* a, int* ip, double* w ) {
//void makewt(int nw, int *ip, double *w);
//void makect(int nc, int *ip, double *c);
//void cftfsub(int n, double *a, int *ip, int nw, double *w);
//void cftbsub(int n, double *a, int *ip, int nw, double *w);
//void rftfsub(int n, double *a, int nc, double *c);
//void rftbsub(int n, double *a, int nc, double *c);
//void dctsub(int n, double *a, int nc, double *c);
int j, nw, nc;
double xr;
nw = ip[0];
if ( n > (nw << 2) ) {
nw = n >> 2;
makewt( nw, ip, w );
}
nc = ip[1];
if ( n > nc ) {
nc = n;
makect( nc, ip, w + nw );
}
if ( isgn < 0 ) {
xr = a[n - 1];
for ( j = n - 2; j >= 2; j -= 2 ) {
a[j + 1] = a[j] - a[j - 1];
a[j] += a[j - 1];
}
a[1] = a[0] - xr;
a[0] += xr;
if ( n > 4 ) {
rftbsub( n, a, nc, w + nw );
cftbsub( n, a, ip, nw, w );
} else if ( n == 4 ) {
cftbsub( n, a, ip, nw, w );
}
}
dctsub( n, a, nc, w + nw );
if ( isgn >= 0 ) {
if ( n > 4 ) {
cftfsub( n, a, ip, nw, w );
rftfsub( n, a, nc, w + nw );
} else if ( n == 4 ) {
cftfsub( n, a, ip, nw, w );
}
xr = a[0] - a[1];
a[0] += a[1];
for ( j = 2; j < n; j += 2 ) {
a[j - 1] = a[j] - a[j + 1];
a[j] += a[j + 1];
}
a[n - 1] = xr;
}
}