Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 使用FFTW的FFT多重1d变换_Fortran_Fft_Fftw - Fatal编程技术网

Fortran 使用FFTW的FFT多重1d变换

Fortran 使用FFTW的FFT多重1d变换,fortran,fft,fftw,Fortran,Fft,Fftw,我有一个三维数组U(z,y,x),我想在z中对y和x的所有值进行复傅里叶变换。我计划使用FFTW图书馆。我从FFTW手册中了解到,有一种方法可以同时执行多个1d变换(如下所述) 调用dfftw_plan_many_dft(plan,rank,n,hown,in,inembed,istride,idist,out,onembed,ostride,odist,FFTW_度量) 我不太明白inembed和outembed的意思。由于我是Fortran新手,不知道如何使用它,您能否对此提供更多的见解 E

我有一个三维数组U(z,y,x),我想在z中对y和x的所有值进行复傅里叶变换。我计划使用FFTW图书馆。我从FFTW手册中了解到,有一种方法可以同时执行多个1d变换(如下所述)

调用dfftw_plan_many_dft(plan,rank,n,hown,in,inembed,istride,idist,out,onembed,ostride,odist,FFTW_度量)

我不太明白
inembed
outembed
的意思。由于我是Fortran新手,不知道如何使用它,您能否对此提供更多的见解


EDIT1:更新了Fortran代码

这里描述得非常好:

inembed
outembed
允许将传入和传出数据嵌入到更大的数据集中:

假设您希望对
O
元素表示的
中的
子矩阵进行FFT。并可能将结果输出到
out
变量的
O
字段中

     X X X X X           X X X X X X
     X X X X X           X O O X X X
in = X O O X X     out = X O O X X X
     X O O X X
     X X X X X
inembed
则为[2,1](主列)和
outembed
[1,1]。然后,stride会将您从一个切片带到另一个切片/从一个卷带到另一个卷等。使用
stride
embed
可以告诉FFTW,如何找到每个要转换的子数据的
O
元素,以及如何将它们放在更大的数据集中

希望这能解释。如果您现在已经打开了BLAS接口,您会发现
inembed
outembed
对应于许多例程的
LDA
LDB
。当然,BLAS例程仅限于矩阵,即假设二维操作。当然,您可以在任意多个维度上进行FFT


如果将
inembed
outembed
设置为
NULL
,则FFTW假设在两个输入和输出中都没有
X
字段。

是。我只是提供这一点作为参考。我现在将更新Fortran版本。我不明白[2,1]和[1,1]是如何从图中的矩阵开始的。
[2,1]
在主列中意味着从第3行第2列开始。在row major中,
[1,2]
当然,但您当时正在编写fortran,这就是我选择manjor列的原因。这是嵌入矩阵的左上角。我知道了,我从左下角开始计数。我的错。由于我最常用的应用程序,我总是想到带FFT的笛卡尔空间。在计算机上,一切都从左上角开始。这同样适用于mathematica和matlab,我知道。然而,物理空间并非如此。