簡體   English   中英

用C計算3D FFT和逆FFT

[英]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;

}`

顯然我的轉換結果不一樣。 我不明白怎么了?

FFTW3手冊中所述

這些轉換未歸一化,因此r2c和c2r轉換(反之亦然)將導致原始數據按真實數據元素的數量(即,真實數據的(邏輯)維的乘積)進行縮放。

實際維數為4^3 ,將第一個結果115474520512除以該數字即得到第一個輸入115474520512/(4^3) = 1804289383

您的FFT未標准化。 您的輸入和輸出之間有一個常數。

在這里看看

這些轉換未歸一化,因此r2c和c2r轉換(反之亦然)將導致原始數據按真實數據元素的數量(即,真實數據的(邏輯)維的乘積)進行縮放。

因此,該因子應為N * N * N 只要將您的數據除以這個系數,您就應該獲得與輸入相同的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM