//N*Nの複素配列 (N=2^n) a[N][2*N] a[][偶数]=実部 a[][奇数] =虚部 //行と列の数が異なる場合はもう少し面倒くさいです。 /* #include #include #include "fft2dc.h" のように読み込んでやる。 */ #include #include #include "fft2dc.h" #define N 64 int main(void) { int *ip, m, i; int j1, j2 ; double **a, *w; a = alloc_2d_double(N, 2*N); ip = alloc_1d_int(2 + (int) sqrt(N + 0.5)); m = N/2 + 2*N; w = alloc_1d_double(m); ip[0] = 0; /*この間にフーリエ変換したいものを配列a[N][2*N]の中に読み込んでください */ /* 例 for (j1 = 0; j1 < N; j1++) { for (j2 = 0; j2 < N; j2++) { a[j1][j2*2] = j1*j2 ;//実部 a[j1][j2*2+1] = j1+j2 ;//虚部 } }*/ cdft2d(N, 2*N, 1, a, ip, w);//a[j1][j2]をFourier変換 → a[k1][k2] cdft2d(N, 2*N, -1, a, ip, w);//逆フーリエ変換 a[k1][k2] → a[j1][j2] 開始 for (j1 = 0; j1 < N; j1++) { for (j2 = 0; j2 < 2 * N; j2++) { a[j1][j2] *= 1.0 / (N * N); } }//逆フーリエ変換終了 free_1d_double(w); free_1d_int(ip); free_2d_double(a);//作った配列は消します }