JTransforms:ifft奇数据

时间:2017-06-03 00:12:36

标签: java fft ifft

我正在尝试计算逆FFT,因为我只需要选择频率。以下是我如何进行FFT:

final double[] points = reader.readPoints();
final DoubleFFT_1D analyzer = new DoubleFFT_1D(points.length);
final double[] fft = new double[points.length * 2];

for (int i = 0; i < points.length; i++) {
    fft[2 * i] = points[i];
    fft[2 * i + 1] = 0;
}

analyzer.complexForward(fft);

如上所述,我从每个点开始编号。

然后我计算我的功率电平,频率为:

final double[] magnitude = new double[fft.length];
for (int i = 0; i < fft.length / 2; i++) {
    magnitude[2 * i] = Math.sqrt(Math.pow(fft[2 * i], 2) + Math.pow(fft[2 * i + 1], 2));
    magnitude[2 * i + 1] = 0;
}

从生成的图表中,我可以看到一个感兴趣的峰值,其近似频率为0.2717391304347826。我们推断这个Double值存储在一个名为frequencyOfInterest;

的变量中

我试图按照以下方式接受iFFT:

public void performIfft() {
    int ifftIdx = 0;
    for (int idx = 0; idx < magnitude.length; idx += 2) {
        final Double currentBinFreq = getFrequency(magnitude.length, idx);
        final boolean freqMatch = currentBinFreq.compareTo(frequencyOfInterest) == 0;
        ifft[ifftIdx] = Double.valueOf(freqMatch ? fft[ifftIdx] : 0);
        ifft[ifftIdx + 1] = Double.valueOf(freqMatch ? fft[ifftIdx + 1] : 0);
        ifftIdx += 2;
    }
    analyzer.complexInverse(ifft, true);
}

private static Double getFrequency(final int pointsLength, final int idx) {
    final Double sampleCount = Double.valueOf(idx * 30);
    final Double n = Double.valueOf(pointsLength);
    return Double.valueOf(sampleCount / n);
}

执行此操作后,我的复杂数组如下:

0.0,0.0
0.0,0.0
-6126.10186299952,-6126.10186299952
-3385.1822332667743,-3385.1822332667743
0.0,0.0
[ 0.0,0.0 continues until the end ]

我的结果如下图所示: enter image description here

虽然频率输出似乎正确(我的图中有5个波),但我不明白为什么有两个(Img和真实)。类似于我制作FFT入口集时,我希望假想的对应物是零;即2 * i + 1 = 0。

在使用此库取出iFFT时我做错了什么?

1 个答案:

答案 0 :(得分:2)

为了得到严格的实数结果(所有虚数分量等于零),IFFT的输入必须是共轭对称的。例如阵列的上半部分必须是下半部分的复共轭,镜像中心周围,除零-eth元素(DC或0 Hz bin)外。