cuFFT R2C批量输出大小与输入大小不匹配

时间:2016-01-22 15:19:45

标签: fft cufft

我正在使用 cuFFT 试验批处理。但我不认为我得到了正确的输出。

int NX = 16;    // size of the array
int BATCH = 16; // # of batch

我在GPU上分配了两个数组:

float *src;
cufftComplex *dst;
cudaMalloc((void**)&src, sizeof(float)*NX*BATCH);
cudaMalloc((void**)&dst, sizeof(cufftComplex)*NX*BATCH);

我正在用这样一个简单的内核初始化源数组:

__global__ void initFloatArray(float *data, const int size) {
  const int i = (blockIdx.x * blockDim.x) + threadIdx.x;
  if (i < size) {
    data[i] = i % NX;
  }
}

基本上,每个数组的值都是0到15.我得到了16次。

我创建了这样的计划:

cufftPlanMany(&plan, 1, &NX, nullptr, 1, NX, nullptr, 1, NX, CUFFT_R2C, BATCH);

然后我正在执行我的计划:

cufftExecR2C(plan, src, dst);

最后,我将 dst 的内容传回主机。但是当我打印出这些值时,我得到了这个:

 BATCH 0:
  <120, 0>.length = 120
  <-8, 40.2187>.length = 41.0066
  <-8, 19.3137>.length = 20.905
  <-8, 11.9728>.length = 14.3996
  <-8, 8>.length = 11.3137
  <-8, 5.34543>.length = 9.62152
  <-8, 3.31371>.length = 8.65914
  <-8, 1.5913>.length = 8.15673
  <-8, 0>.length = 8
  <120, 0>.length = 120
  <-8, 40.2187>.length = 41.0066
  <-8, 19.3137>.length = 20.905
  <-8, 11.9728>.length = 14.3996
  <-8, 8>.length = 11.3137
  <-8, 5.34543>.length = 9.62152
  <-8, 3.31371>.length = 8.65914
 BATCH 1:
  <-8, 1.5913>.length = 8.15673
  <-8, 0>.length = 8
  <120, 0>.length = 120
  <-8, 40.2187>.length = 41.0066
  <-8, 19.3137>.length = 20.905
  <-8, 11.9728>.length = 14.3996
  ...

我期待重复的输出,但每9个数字重复一次,而不是每16个数字重复一次。

我做错了吗?或者有些事我不理解。

1 个答案:

答案 0 :(得分:1)

实值信号的DFT表现出厄米特对称性(见real-input DFT on wikipedia)。因此,N - 点DFT的完整N复数输出值只能由第一个N/2+1输出值构成(即,其他输出是冗余的)。

相应地,对于实值输入的许多FFT实现,cuFFT不返回频谱的冗余上部(如cuFFT library user's guide的2.4节所示)。在使用16点FFT的情况下,您将获得16/2 + 1 = 9非冗余输出。然后,每个FFT的9个值在最终的dst缓冲区中背靠背地打包(因此,每9个复数就会开始一个新的FFT结果)。