0

次のように、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()]);
}

しかし、結果を比較していると、それらは互いに異なります。私が考慮していないこと、何が間違っているのですか?

ご協力いただきありがとうございます。

4

1 に答える 1

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()]);
}
于 2015-02-13T15:29:22.270 に答える