diff options
author | Anthony Blake <anthonix@me.com> | 2012-10-31 17:53:53 +1300 |
---|---|---|
committer | Anthony Blake <anthonix@me.com> | 2012-10-31 17:53:53 +1300 |
commit | 35713c87d6c4c0d187e8ceabc4e5296e3522b32e (patch) | |
tree | 10867c2fd6bbbf1eae408d939fc793e13a748314 /src/ffts_nd.c | |
parent | 383e8e34fc65553ce0103bb2d28e92587d530f87 (diff) | |
download | ffts-35713c87d6c4c0d187e8ceabc4e5296e3522b32e.zip ffts-35713c87d6c4c0d187e8ceabc4e5296e3522b32e.tar.gz |
2D transforms work
Diffstat (limited to 'src/ffts_nd.c')
-rw-r--r-- | src/ffts_nd.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/src/ffts_nd.c b/src/ffts_nd.c index a6c66bb..126f82d 100644 --- a/src/ffts_nd.c +++ b/src/ffts_nd.c @@ -48,21 +48,25 @@ void ffts_free_nd(ffts_plan_t *p) { free(p); } -void ffts_transpose(void *d, int n1, int n2) { - uint64_t *v = (uint64_t *)d; - - int i, j; - for (i = 0; i<n2; i++) { - for (j = i+1; j<n1; j++) { - uint64_t temp = v[j*n2 + i]; - v[j*n2 + i] = v[i*n1 + j]; - v[i*n1 + j] = temp; -// uint64_t temp = v[i*n2 + j]; -// v[i*n2 + j] = v[j*n1 + i]; -// v[j*n1 + i] = temp; - } +void ffts_transpose(uint64_t *m, int w, int h) { + int start, next, i; + uint64_t tmp; + + for (start = 0; start <= w * h - 1; start++) { + next = start; + i = 0; + do { i++; + next = (next % h) * w + next / h; + } while (next > start); + if (next < start || i == 1) continue; + + tmp = m[next = start]; + do { + i = (next % h) * w + next / h; + m[next] = (i == start) ? tmp : m[i]; + next = i; + } while (next > start); } - } void ffts_execute_nd(ffts_plan_t *p, const void * in, void * out) { @@ -80,15 +84,15 @@ void ffts_execute_nd(ffts_plan_t *p, const void * in, void * out) { } size_t i,j; - for(i=0;i<p->Ms[0];i++) { - ffts_execute(p->plans[0], din + (i * p->Ns[0]), buf1 + (i * p->Ns[0])); + for(i=0;i<p->Ns[0];i++) { + ffts_execute(p->plans[0], din + (i * p->Ms[0]), buf1 + (i * p->Ms[0])); } ffts_transpose(buf1, p->Ms[0], p->Ns[0]); for(i=1;i<p->rank;i++) { printf("t %zu\n", i); - for(j=0;j<p->Ms[i];j++) { - ffts_execute(p->plans[i], buf1 + (j * p->Ns[i]), buf0 + (j * p->Ns[i])); + for(j=0;j<p->Ns[i];j++) { + ffts_execute(p->plans[i], buf1 + (j * p->Ms[i]), buf0 + (j * p->Ms[i])); } ffts_transpose(buf0, p->Ms[i], p->Ns[i]); @@ -123,7 +127,7 @@ ffts_plan_t *ffts_init_nd(int rank, size_t *Ns, int sign) { for(i=0;i<rank;i++) { p->Ms[i] = vol / p->Ns[i]; printf("M N %zu %zu\n", p->Ms[i], p->Ns[i]); - p->plans[i] = ffts_init_1d(p->Ns[i], sign); + p->plans[i] = ffts_init_1d(p->Ms[i], sign); } return p; |