使用 JCufft 进行实数到复数的 FFT
real-to-complex FFT with JCufft
我正在使用 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()]);
}
但是,当我比较结果时,它们彼此不同。我没有考虑到什么,我做错了什么?
感谢您的帮助。
好吧,是我对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()]);
}
我正在使用 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()]);
}
但是,当我比较结果时,它们彼此不同。我没有考虑到什么,我做错了什么?
感谢您的帮助。
好吧,是我对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()]);
}