Build sample data for apache commons Fast Fourier Transform algorithm

我的未来我决定 提交于 2019-12-03 13:34:50

问题


I wanted to use Apache math commons implementation for FFT (FastFourierTransformer class) to process some dummy data whose 8 data samples are contributing to one complete sinusoidal wave. The maximum being amplitude 230. The code snippet that I tried is below :

private double[] transform() 
{   
    double [] input = new double[8];
    input[0] = 0.0;
    input[1] = 162.6345596729059;
    input[2] = 230.0;
    input[3] = 162.63455967290594;
    input[4] = 2.8166876380389125E-14;
    input[5] = -162.6345596729059;
    input[6] = -230.0;
    input[7] = -162.63455967290597;

    double[] tempConversion = new double[input.length];

    FastFourierTransformer transformer = new FastFourierTransformer();
    try {           
        Complex[] complx = transformer.transform(input);

        for (int i = 0; i < complx.length; i++) {               
            double rr = (complx[i].getReal());
            double ri = (complx[i].getImaginary());

            tempConversion[i] = Math.sqrt((rr * rr) + (ri * ri));
        }

    } catch (IllegalArgumentException e) {
        System.out.println(e);
    }

    return tempConversion;
}

1) Now the data returned by method transform is an array of complex number. Does that array contains the frequency component information about input data? or the tempConversion array that I created will contain the frequency information? The values in tempConversion array is :

 2.5483305001488234E-16
 920.0
 4.0014578493024757E-14
 2.2914314707516465E-13
 5.658858581079313E-14
 2.2914314707516465E-13
 4.0014578493024757E-14
 920.0

2) I searched a lot but at most of the places there is no clear documentation on what format of data algorithm expects (in terms of sample code to understand better) and how do I use the array of results to calculate the frequencies contained in the signal?


回答1:


Your output data looks correct. You've calculated the magnitude of the complex FFT output at each frequency bin which corresponds to the energy in the input signal at the corresponding frequency for that bin. Since your input is purely real, the output is complex conjugate symmetric, and the last 3 output values are redundant.

So you have:

Bin     Freq        Magnitude
  0     0 (DC)        2.5483305001488234E-16
  1     Fs/8        920.0
  2     Fs/4          4.0014578493024757E-14
  3     3Fs/8         2.2914314707516465E-13
  4     Fs/2 (Nyq)    5.658858581079313E-14
  5     3Fs/8         2.2914314707516465E-13  # redundant - mirror image of bin 3
  6     Fs/4          4.0014578493024757E-14  # redundant - mirror image of bin 2
  7     Fs/8        920.0                     # redundant - mirror image of bin 1

All the values are effectively 0 apart from bin 1 (and bin 6) which corresponds to a frequency of Fs/8 as expected.



来源:https://stackoverflow.com/questions/12049407/build-sample-data-for-apache-commons-fast-fourier-transform-algorithm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!