使用JCufft实现复杂的FFT

时间:2015-02-13 14:09:52

标签: java cuda fft jcuda

我正在使用org.apache.commons.math3.transform库进行实际到复杂的FFT,如下所示:

private Complex[] fft(double[] values) {
   FastFourierTransformer ffTransformer = new FastFourierTransformer(DftNormalization.STANDARD);
   Complex[] result = ffTransformer.transform(values, TransformType.FORWARD); 
   return result;  
}

这给了我一个带有结果的org.apache.commons.math3.complex数组。这很好用。

现在我想对JCufft库执行完全相同的操作。我试着这样做:

private Complex[] fft(double[] values) {
   double inputJCufft[] = values.clone();
   double outputJCufft[] = new double[values.length * 2];
   cufftHandle plan = new cufftHandle();
   JCufft.cufftPlan1d(plan, values.length, cufftType.CUFFT_D2Z, 1);
   JCufft.cufftExecD2Z(plan, inputJCufft, outputJCufft);
   JCufft.cufftDestroy(plan);
   Complex[] result = BaseHelper.getComplexArray(outputJCufft);
   return result;
}

public static Complex[] getComplexArray(double[] input) {
    List<Complex> result = new ArrayList<Complex>();
    for (int i = 0; i < input.length - 1; i = i + 2) {
        result.add(new Complex(input[i], input[i + 1]));
    }
    return result.toArray(new Complex[result.size()]);
}

然而,当我比较结果时,它们彼此不同。我没有考虑到什么,我做错了什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好的,这是我对FFT的理解不足......

我将getComplexArray方法更改为以下内容,现在工作正常:

public static Complex[] getComplexArray(double[] input) {
    Deque<Complex> deque = new LinkedList<Complex>();
    int size = (input.length / 4 + 1) * 2;
    for (int i = 0; i < size; i = i + 2) {
        deque.add(new Complex(input[i], input[i + 1]));
    }
    List<Complex> result = new ArrayList<Complex>(deque);
    deque.removeLast();
    while (deque.size() > 1) {
        result.add(deque.removeLast().conjugate());
    }
    return result.toArray(new Complex[result.size()]);
}