我试图计算逆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。让我们推断这个双值存储在一个名为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 ]我的结果在一个图表上如下:

虽然频率输出似乎是正确的(在我的图表中的5波),但我不明白为什么有两个( Img和real )。同样的,当我做FFT入口集时,我期望想象中的对应方是零,即2*i+1= 0。
我在使用这个库取出iFFT时做错了什么吗?
发布于 2017-06-03 01:00:06
为了得到一个严格的实结果(所有虚分量等于零),IFFT的输入必须是共轭对称的。例如,阵列的上半部分必须是下半部分的复共轭,除了零点eth元件( DC或0 Hz bin)外,还反映在阵列的中心附近。
https://stackoverflow.com/questions/44338999
复制相似问题