FFT와 백터 변환을 계산하여 동일하게 작동하는지 확인하고 싶습니다. 난 내 코드에서 대형 3D 매트릭스의 어플은 4 * 4 * 4 매트릭스를 테스트하기 위해 노력하고 여기에 분명히 내 변화의 결과가 동일하지 내 코드C에서 3D FFT 및 역 FFT 계산
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <time.h>
#include <math.h>
#include <fftw3.h>
int main()
{
int N = 4; //Dimension of matrix
unsigned int seed = 1;
double *in = (double*)malloc(sizeof(double)*N*N*N);
fftw_complex *out = fftw_malloc(sizeof(fftw_complex)*N*N*N);
double *out1 = (double*)malloc(sizeof(double)*N*N*N);
fftw_plan plan_backward;
fftw_plan plan_forward;
srand (seed);
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
for(int k = 0; k < N; k++)
{
in[i*(N*N) + j*N + k] = rand ();
}
}
}
printf(" Given matrix in\n");
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
for(int k = 0; k < N; k++)
{
printf("%f\n", in[i*(N*N) + j*N + k]);
}
}
}
printf("\n");
plan_backward = fftw_plan_dft_r2c_3d (N, N, N, in, out, FFTW_ESTIMATE);
fftw_execute (plan_backward);
fftw_destroy_plan (plan_backward);
printf("out matrix\n");
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
for(int k = 0; k < N; k++)
{
printf("%f\t%f\n", creal(out[i*(N*N) + j*N + k]), cimag(out[i*(N*N) + j*N + k]));
}
}
}
printf("\n");
plan_forward = fftw_plan_dft_c2r_3d (N, N, N, out, out1, FFTW_ESTIMATE);
fftw_execute (plan_forward);
fftw_destroy_plan (plan_forward);
printf("out1 matrix\n");
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
for(int k = 0; k < N; k++)
{
printf("%f\n", out1[i*(N*N) + j*N + k]);
}
}
}
fftw_free(in);
free(out);
fftw_free(out1);
return 0;
}`
`이다 있습니다. 나는 무엇이 잘못되었는지 이해하지 못한다. FFTW3의 매뉴얼에 설명 된대로
고마워요 :) 단지 정화는 내가 역변환하는 데이터에만이 정규화를해야합니까? 처음에 복잡한 데이터에 대해 C2를 적용하고 r2c/(N * N * N)을 되 찾겠다 고 말하십니까? – verito
푸리에 변환은 선형이므로 'c2r -> 1/N^3 -> r2c', '1/N^3 -> c2r -> r2c'등 어디서나 정상화 할 수 있습니다. –