JTransforms:ifft 奇数数据
JTransforms : ifft odd data
我正在尝试计算逆 FFT,因为我只需要 select 个频率。这是我进行 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 ]
我的结果在图表上如下所示:
虽然频率输出 似乎是 正确的(我的图中有 5 个波),但我不明白为什么有两个(Img 和 real)。就像我制作 FFT 入口集时一样,我希望虚构的对应物为零;即 2 * i + 1 = 0.
我是不是在使用这个库取出 iFFT 时做错了什么?
要获得严格实数的结果(所有虚部都为零),IFFT 的输入必须是共轭对称的。例如阵列的上半部分必须是下半部分的复共轭,围绕阵列的中心镜像,除了零元素(DC 或 0 Hz bin)。
我正在尝试计算逆 FFT,因为我只需要 select 个频率。这是我进行 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 ]
我的结果在图表上如下所示:
虽然频率输出 似乎是 正确的(我的图中有 5 个波),但我不明白为什么有两个(Img 和 real)。就像我制作 FFT 入口集时一样,我希望虚构的对应物为零;即 2 * i + 1 = 0.
我是不是在使用这个库取出 iFFT 时做错了什么?
要获得严格实数的结果(所有虚部都为零),IFFT 的输入必须是共轭对称的。例如阵列的上半部分必须是下半部分的复共轭,围绕阵列的中心镜像,除了零元素(DC 或 0 Hz bin)。