[英]Computing 3D FFT and Inverse FFT in C
我想計算FFT並進行逆變換,以檢查其工作原理是否相同。 我的代碼中有一個大型3D矩陣的應用程序,我嘗試使用4 * 4 * 4矩陣對其進行測試,這是我的代碼
`
#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;
}`
顯然我的轉換結果不一樣。 我不明白怎么了?
您的FFT未標准化。 您的輸入和輸出之間有一個常數。
在這里看看
這些轉換未歸一化,因此r2c和c2r轉換(反之亦然)將導致原始數據按真實數據元素的數量(即,真實數據的(邏輯)維的乘積)進行縮放。
因此,該因子應為N * N * N
只要將您的數據除以這個系數,您就應該獲得與輸入相同的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.