org.apache.commons.math3.transform FastFourierTransformer returns 输入为 Complex[] 和 Double[] 时的不同值

org.apache.commons.math3.transform FastFourierTransformer returns different value when input is Complex[] and Double[]

对于这个问题,我使用了 Apache

的数学库

我的目标是在对输入值的正向傅立叶变换的 absolute value 结果执行逆傅立叶变换后取回我的输入。

当我对输入的正向傅立叶变换的 Complex value 结果执行逆傅立叶变换时,我得到了正确的输出。

我可能做错了什么?

public void fourierTestTemp(){
    double[] input = new double[]{1,0,0,0,0,0,0,66,888,0,0,0,0,0,0,0};//Length = 16

    double[] result = new double[input.length];//This double array will hold the results of the fourier transform
    FastFourierTransformer transformer = new FastFourierTransformer(DftNormalization.UNITARY);//The FastFourierTransformer class by Apache
    Complex[] complx = transformer.transform(result, TransformType.FORWARD);//Apply fourier transform to double[]

    //Go through Complex value results and obtain absolute value
    for (int i = 0; i < complx.length; i++) {
        result[i] = complx[i].abs();
    }

    //Perform inverse transform on the obtained absolute values from the forward transform.
    complx = transformer.transform(result, TransformType.INVERSE);

    //Go through Complex value results and obtain absolute value
    for (int i = 0; i < complx.length; i++) {
        result[i] = complx[i].abs();
    }

    //Print results
    for (int i = 0; i < result.length; i++) {
        System.out.print(result[i]+",");
    }
}

iff​​t(abs(fft(x))) 仅当 x 严格对称时才是恒等式(可以仅由 DFT 的余弦基向量构成)。你的测试向量不是。

余弦是对称函数。正弦是反对称的。

如果 x 不对称,fft(x) 将不是实数,因此 abs() 函数将旋转一些相位结果,从而使 ifft 输出波形失真。