2016-09-05 6 views
0

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의 매뉴얼에 설명 된대로

답변

0

FFT가 정규화되지 않았습니다. 입력과 출력 사이에는 일정한 요소가 있습니다.

는 표정 here

이러한 변환이 때문에 C2R 뒤에 R2C는 (또는 그 반대)는 실제 데이터 요소-IS의 숫자로 축소 원래 데이터 될 것이다 변환, 표준화되어 걸릴 실제 데이터의 (논리적 인) 차원의 산물.

따라서 요인은 N * N * N이어야합니다. 이 요인으로 데이터를 나누면 입력과 동일한 데이터를 다시 가져와야합니다.

+0

고마워요 :) 단지 정화는 내가 역변환하는 데이터에만이 정규화를해야합니까? 처음에 복잡한 데이터에 대해 C2를 적용하고 r2c/(N * N * N)을 되 찾겠다 고 말하십니까? – verito

+0

푸리에 변환은 선형이므로 'c2r -> 1/N^3 -> r2c', '1/N^3 -> c2r -> r2c'등 어디서나 정상화 할 수 있습니다. –

0

이러한 변환은 정규화되지된다

하므로 C2R 뒤에 R2C 변환 (또는 그 반대)은 실제 데이터 요소의 개수에 의해 스케일링 원래 데이터 될 것이다 즉, 실제 데이터의 (논리적 인) 차원의 산물이다.

실제 차원의 번호는 경우 4^3하고 그 번호에 의해 제 115474520512 결과를 분할하여 상기 제 입력 115474520512/(4^3) = 1804289383을 다시 제공한다.

+0

감사합니다. 나는 대답을 가지고 있습니다. :) – verito