CUDA库夫库2D FFT仅左半平面正确

Da Teng

我正在使用CUFFT库在尺寸为128 x 128的128张图像上进行2D FFT。我使用该库的方式如下:

unsigned int nx = 128; unsigned int ny = 128; unsigned int nz = 128;
// Make 2D fft batch plan
int n[2] = {nx, ny};
int inembed[] = {nx, ny};
int onembed[] = {nx, ny};

cufftPlanMany(&plan,
            2, // rank
            n, // dimension
            inembed,
            1, // istride
            nx * ny, // idist
            onembed,
            1, //ostride
            nx * ny, // odist
            CUFFT_D2Z,
            nz);
cufftSetCompatibilityMode(plan,CUFFT_COMPATIBILITY_NATIVE)

// Create output array
complex<double>* out_complex = new complex<double>[nx * ny * nz];
// Initialize output array
for (unsigned int i = 0; i < nx * ny * nz; i++) {
   out_complex[i].real(0);
   out_complex[i].imag(0);
}
cudaMalloc( (void**)&idata, sizeof(cufftDoubleReal) * nx * ny * nz );
cudaMalloc( (void**)&odata, sizeof(cufftDoubleComplex) * nx * ny * nz );
cudaMemcpy( idata, in_real, nx * ny  * nz * sizeof(cufftDoubleReal), 
                                  cudaMemcpyHostToDevice )  );
cudaMemcpy( odata, out_complex, nx * ny * nz *  sizeof(cufftDoubleComplex), 
                                  cudaMemcpyHostToDevice )  );

cufftExecD2Z( plan, idata, odata );

cudaMemcpy( out_complex, odata, nx * ny * nz * sizeof(cufftDoubleComplex),
                                  cudaMemcpyDeviceToHost ) );

主机上的输入in_real是保存3D图像的大数组,它是双精度数组。我猜应该没有问题,从cufftDoubleReal到double的转换和从cufftDoubleComplex到double的转换是没有问题的?我对计划的制定方式和参数有些怀疑,我试图在网上找到一些示例,但它们并没有帮助或一致。然后,我会根据自己的理解,通过编程指南设置参数

如标题所示,输出部分正确(左半平面),右半平面为零,这让我感到困惑。我尝试设置不同类型的兼容模式,但没有帮助。我要比较的版本是MATLAB fft2()。

看守人

您需要(重新)阅读文档,以进行实际到复杂的转换。报价单:

在许多实际应用中,输入向量是实值。可以很容易地看出,在这种情况下,输出满足厄米对称性(X k = XN-k ∗,其中星号表示复共轭)。反之亦然:对于复杂的Hermitian输入,逆变换将是纯实值。cuFFT利用了这种冗余,仅在Hermitian向量的前半部分起作用

也就是说,实数到复数变换的输出是对称的,而cuFFT通过不计算冗余(对称)系数来利用这一点。因此,通常只获得转换输出的“一半”是正常的,因为另一个“一半”是相同的。这并不是cuFFT,FFTW和大多数其他高性能FFT库所独有的,这种方式适用于实数到复数变换和复数到实数逆变换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CUDA fft 2d 与 MATLAB fft 在 2d 上的不同结果

来自分类Dev

CUDA 2d卷积边界不正确

来自分类Dev

CMake无法正确找到CUDA库

来自分类Dev

仅使用标准库,是否有用于从 Rust 中的 2D 数组切片列的简短表示法?

来自分类Dev

Zend框架2:分页仅显示数据库中的一半项目

来自分类Dev

基本的2D图形库

来自分类Dev

小型2D游戏的Android库

来自分类Dev

如何使用iOS Accelerate框架正确填充FFT的2D数组

来自分类Dev

更改2D平面上的位置

来自分类Dev

从MATLAB到Python的2D FFT

来自分类Dev

巨大矩阵的2D FFT

来自分类Dev

2D fft-空虚部

来自分类Dev

Java 库 Graphics2D 不会将文本显示为正确的字体

来自分类Dev

用于2D路径比较的Java库

来自分类Dev

数据库表的2D ArrayList

来自分类Dev

数据库表的2D ArrayList

来自分类Dev

Spring批处理中仅处理MongoDB数据库的一半

来自分类Dev

WordPress图片库的自定义HTML,仅输出一半功能

来自分类Dev

仅当“if 语句”正确时才插入数据库

来自分类Dev

Matlab / Octave中的2D与3D FFT

来自分类Dev

如何正确克隆2D阵列?

来自分类Dev

将平面拟合到2D阵列

来自分类Dev

将已连接的盒子放在2D平面上

来自分类Dev

计算2D平面中黑白形状的大小

来自分类Dev

资产:预编译后,按钮变为平面/ 2D

来自分类Dev

Autodesk Viewer:关于平面视图的2D视图的建议

来自分类Dev

CUDA 2d阵列映射

来自分类Dev

CUDA cufft 2D示例

来自分类Dev

绘制图像的2D FFT