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

时间:2016-04-23 00:30:19

标签: apache math fft

对于这个问题,我正在使用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]+",");
    }
}

1 个答案:

答案 0 :(得分:1)

ifft(abs(fft(x)))仅在x严格对称时才是同一性(可以仅由DFT的余弦基矢量构成)。你的测试向量不是。

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

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