static double verify_impulse(fftd_func *dft, int n, int veclen, COMPLEX *inA, COMPLEX *inB, COMPLEX *inC, COMPLEX *outA, COMPLEX *outB, COMPLEX *outC, COMPLEX *tmp, int rounds) { int N = n * veclen; COMPLEX impulse; int i; double e, maxerr = 0.0; /* test 2: check that the unit impulse is transformed properly */ RE(impulse) = 1.0; IM(impulse) = 0.0; for (i = 0; i < N; ++i) { /* impulse */ RE(inA[i]) = 0.0; IM(inA[i]) = 0.0; /* transform of the impulse */ outA[i] = impulse; } for (i = 0; i < veclen; ++i) inA[i * n] = impulse; /* a simple test first, to help with debugging: */ dft((double *)outB, (double *)inA); e = acmp(outB, outA, N); if(e > maxerr) maxerr = e; for (i = 0; i < rounds; ++i) { fill_random(inB, N); asub(inC, inA, inB, N); dft((double *)outB, (double *)inB); dft((double *)outC, (double *)inC); aadd(tmp, outB, outC, N); e = acmp(tmp, outA, N); if(e > maxerr) maxerr = e; } return maxerr; }
static double impulse0(dofft_closure *k, int n, int vecn, C *inA, C *inB, C *inC, C *outA, C *outB, C *outC, C *tmp, int rounds, double tol) { int N = n * vecn; double e = 0.0; int j; k->apply(k, inA, tmp); e = dmax(e, acmp(tmp, outA, N, "impulse 1", tol)); for (j = 0; j < rounds; ++j) { arand(inB, N); asub(inC, inA, inB, N); k->apply(k, inB, outB); k->apply(k, inC, outC); aadd(tmp, outB, outC, N); e = dmax(e, acmp(tmp, outA, N, "impulse", tol)); } return e; }