diff options
author | Brian Duff <bduff@google.com> | 2013-11-30 21:15:50 -0800 |
---|---|---|
committer | Brian Duff <bduff@google.com> | 2013-11-30 21:17:46 -0800 |
commit | 598e0aeda91e8ed536b4b2ed670be0055dde3289 (patch) | |
tree | 348efaaa434a28c5df76570c815fbd67eb3c7a22 /src/fft2d/fft2d/sample2d/fftsg3dt.c | |
parent | 85ba2a83c6cd8a10c26124550736a89a2e03f14b (diff) | |
download | fft2d-598e0aeda91e8ed536b4b2ed670be0055dde3289.tar.gz |
Initial commit of fft2d.
Bug: 11946001
Change-Id: I79609cc5a1a011e25a1dfb597a7ddcec532366cb
Diffstat (limited to 'src/fft2d/fft2d/sample2d/fftsg3dt.c')
-rw-r--r-- | src/fft2d/fft2d/sample2d/fftsg3dt.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/fft2d/fft2d/sample2d/fftsg3dt.c b/src/fft2d/fft2d/sample2d/fftsg3dt.c new file mode 100644 index 0000000..87879e6 --- /dev/null +++ b/src/fft2d/fft2d/sample2d/fftsg3dt.c @@ -0,0 +1,128 @@ +/* test of fftsg3d.c */ + +#include <math.h> +#include <stdio.h> +#include "alloc.h" +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +/* random number generator, 0 <= RND < 1 */ +#define RND(p) ((*(p) = (*(p) * 7141 + 54773) % 259200) * (1.0 / 259200)) + + +int main() +{ + void cdft3d(int, int, int, int, double ***, double *, int *, double *); + void rdft3d(int, int, int, int, double ***, double *, int *, double *); + void ddct3d(int, int, int, int, double ***, double *, int *, double *); + void ddst3d(int, int, int, int, double ***, double *, int *, double *); + void putdata3d(int n1, int n2, int n3, double ***a); + double errorcheck3d(int n1, int n2, int n3, double scale, double ***a); + int *ip, n1, n2, n3, n, nt, i, j; + double ***a, *w, err; + + printf("data length n1=? (n1 = power of 2) \n"); + scanf("%d", &n1); + printf("data length n2=? (n2 = power of 2) \n"); + scanf("%d", &n2); + printf("data length n3=? (n3 = power of 2) \n"); + scanf("%d", &n3); + + a = alloc_3d_double(n1, n2, n3); + nt = MAX(n1, n2); + n = MAX(nt, n3 / 2); + ip = alloc_1d_int(2 + (int) sqrt(n + 0.5)); + n = MAX(nt, n3) * 3 / 2; + w = alloc_1d_double(n); + ip[0] = 0; + + /* check of CDFT */ + putdata3d(n1, n2, n3, a); + cdft3d(n1, n2, n3, 1, a, NULL, ip, w); + cdft3d(n1, n2, n3, -1, a, NULL, ip, w); + err = errorcheck3d(n1, n2, n3, 2.0 / n1 / n2 / n3, a); + printf("cdft3d err= %g \n", err); + + /* check of RDFT */ + putdata3d(n1, n2, n3, a); + rdft3d(n1, n2, n3, 1, a, NULL, ip, w); + rdft3d(n1, n2, n3, -1, a, NULL, ip, w); + err = errorcheck3d(n1, n2, n3, 2.0 / n1 / n2 / n3, a); + printf("rdft3d err= %g \n", err); + + /* check of DDCT */ + putdata3d(n1, n2, n3, a); + ddct3d(n1, n2, n3, 1, a, NULL, ip, w); + ddct3d(n1, n2, n3, -1, a, NULL, ip, w); + for (i = 0; i <= n1 - 1; i++) { + for (j = 0; j <= n2 - 1; j++) { + a[i][j][0] *= 0.5; + } + for (j = 0; j <= n3 - 1; j++) { + a[i][0][j] *= 0.5; + } + } + for (i = 0; i <= n2 - 1; i++) { + for (j = 0; j <= n3 - 1; j++) { + a[0][i][j] *= 0.5; + } + } + err = errorcheck3d(n1, n2, n3, 8.0 / n1 / n2 / n3, a); + printf("ddct3d err= %g \n", err); + + /* check of DDST */ + putdata3d(n1, n2, n3, a); + ddst3d(n1, n2, n3, 1, a, NULL, ip, w); + ddst3d(n1, n2, n3, -1, a, NULL, ip, w); + for (i = 0; i <= n1 - 1; i++) { + for (j = 0; j <= n2 - 1; j++) { + a[i][j][0] *= 0.5; + } + for (j = 0; j <= n3 - 1; j++) { + a[i][0][j] *= 0.5; + } + } + for (i = 0; i <= n2 - 1; i++) { + for (j = 0; j <= n3 - 1; j++) { + a[0][i][j] *= 0.5; + } + } + err = errorcheck3d(n1, n2, n3, 8.0 / n1 / n2 / n3, a); + printf("ddst3d err= %g \n", err); + + free_1d_double(w); + free_1d_int(ip); + free_3d_double(a); + return 0; +} + + +void putdata3d(int n1, int n2, int n3, double ***a) +{ + int j1, j2, j3, seed = 0; + + for (j1 = 0; j1 <= n1 - 1; j1++) { + for (j2 = 0; j2 <= n2 - 1; j2++) { + for (j3 = 0; j3 <= n3 - 1; j3++) { + a[j1][j2][j3] = RND(&seed); + } + } + } +} + + +double errorcheck3d(int n1, int n2, int n3, double scale, double ***a) +{ + int j1, j2, j3, seed = 0; + double err = 0, e; + + for (j1 = 0; j1 <= n1 - 1; j1++) { + for (j2 = 0; j2 <= n2 - 1; j2++) { + for (j3 = 0; j3 <= n3 - 1; j3++) { + e = RND(&seed) - a[j1][j2][j3] * scale; + err = MAX(err, fabs(e)); + } + } + } + return err; +} + |