【问题标题】:Wrong results in cufft袖带的错误结果
【发布时间】:2016-06-13 05:25:00
【问题描述】:

我需要袖带方面的帮助,我的结果是错误的,我不知道为什么。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include <cufft.h>

__global__ void print(cufftDoubleComplex *c, int h, int w){
for(int i=0; i<1; i++){
        for (int j=0; j<w; j++){
                printf("(%d,%d): %f + %fi\n",i+1, j+1, c[i*w+j].x, c[i*w+j].y);
            }
        //printf("\n");
        }
}

int main(int argc, char *argv[]){
    cudaSetDevice(0);   

    int img_w=5;
    int img_h=5;

    double fx[img_w*img_h], *d_fx;  

    cudaMalloc((void**)&d_fx, img_w*img_h*sizeof(double));
    cufftDoubleComplex *otfFx;
    cudaMalloc((void**)&otfFx, img_w*img_h*sizeof(cufftDoubleComplex)); 

    for(int i=0; i<img_w*img_h; i++){
        fx[i]=0;
    }

    fx[0]=1;
    fx[img_w-1]=-1;
    cudaMemcpy(d_fx, fx, img_w*img_h*sizeof(double), cudaMemcpyHostToDevice);

    cufftHandle plan_fx;
    cufftPlan2d(&plan_fx, img_h, img_w, CUFFT_D2Z);
    cufftExecD2Z(plan_fx, d_fx, otfFx);

    print<<<1,1>>>(otfFx, img_h, img_w);
    cudaDeviceSynchronize();

    cufftDestroy(plan_fx);
    cudaFree(d_fx);
    cudaFree(otfFx);
    return 0;
}

这就是我在结果的第一行得到的:

0.00000 + 0.00000i 0.69098 - 0.95106i 1.80902 - 0.58779i 0.00000 + 0.00000i 0.69098 - 0.95105i

应该是:

0.00000 + 0.00000i 0.69098 - 0.95106i 1.80902 - 0.58779i 1.80902 + 0.58779i 0.69098 + 0.95106i

otfFx[14]之后的一切都是垃圾,就像结果应该是5x5的时候是5x3一样。

这是给我“正确”结果的八度音阶代码:

A=[1 0 0 0 -1; 0 0 0 0 0; 0 0 0 0 0; 0 0 0 0 0; 0 0 0 0 0];
fft2(A)

【问题讨论】:

    标签: cufft


    【解决方案1】:

    你是对的 - cuFFT 输出大小为 5x3 的结果,因为 D2Z/Z2D/R2C/C2R 变换的结果是对称的。

    cuFFT 在此处遵循标准 fft 库约定。请看:http://www.fftw.org/doc/The-1d-Real_002ddata-DFT.htmlhttp://docs.nvidia.com/cuda/cufft/index.html#multi-dimensional

    如果你想重新创建完整的信号,你需要使用前半部分的元素与信号后半部分的元素共轭这一事实。

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2016-08-16
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多