10

我想使用 Apache math commons 实现 FFT(FastFourierTransformer类)来处理一些虚拟数据,这些数据的 8 个数据样本对一个完整的正弦波有贡献。最大振幅为 230。我尝试的代码片段如下:

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) 现在transform方法返回的数据是一个复数数组。该数组是否包含有关输入数据的频率分量信息?还是我创建的 tempConversion 数组将包含频率信息?tempConversion 数组中的值是:

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

2)我搜索了很多,但在大多数地方没有关于数据算法期望什么格式的明确文档(就示例代码而言,以便更好地理解)以及如何使用结果数组来计算包含在信号?

4

1 回答 1

13

您的输出数据看起来正确。您已经计算了每个频率仓的复数 FFT 输出的幅度,它对应于该仓对应频率的输入信号中的能量。由于您的输入是纯实数,因此输出是复共轭对称的,并且最后 3 个输出值是多余的。

所以你有了:

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

除了对应于Fs/8预期频率的 bin 1(和 bin 6)之外,所有值实际上都是 0。

于 2012-08-23T07:20:22.873 回答