袖套中的错误结果
Wrong results in cufft
我需要袖带方面的帮助,我的结果是错误的,我不知道为什么。
这是我的代码:
#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] 之后一切都是垃圾,就像结果是 5x3 而它应该是 5x5。
这是给我 "right" 结果的八度代码:
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 输出大小为 5x3 的结果,因为 D2Z/Z2D/R2C/C2R 变换的结果是对称的。
cuFFT 在这里遵循标准的 fft 库约定。请看:http://www.fftw.org/doc/The-1d-Real_002ddata-DFT.html http://docs.nvidia.com/cuda/cufft/index.html#multi-dimensional
如果您想重新创建完整的信号,您需要使用以下事实:前半部分的元素与信号后半部分的元素共轭。
我需要袖带方面的帮助,我的结果是错误的,我不知道为什么。
这是我的代码:
#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] 之后一切都是垃圾,就像结果是 5x3 而它应该是 5x5。
这是给我 "right" 结果的八度代码:
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 输出大小为 5x3 的结果,因为 D2Z/Z2D/R2C/C2R 变换的结果是对称的。
cuFFT 在这里遵循标准的 fft 库约定。请看:http://www.fftw.org/doc/The-1d-Real_002ddata-DFT.html http://docs.nvidia.com/cuda/cufft/index.html#multi-dimensional
如果您想重新创建完整的信号,您需要使用以下事实:前半部分的元素与信号后半部分的元素共轭。