我尝试对长度为4000的输入信号进行FFT。我的java代码如下:
Vector<Double> signal = readFile("signal.txt");
double[] input = new double[signal.size()];
for(int i=0; i<signal.size(); i++) {
input[i] = signal.get(i);
}
DoubleFFT_1D fftDo = new DoubleFFT_1D(input.length);
double[] fft = new double[input.length * 2];
System.arraycopy(input, 0, fft, 0, input.length);
fftDo.realForwardFull(fft);
for(int i=0; i<6; i=i+2) {
System.out.println(fft[i] + "\t" + fft[i+1]);
}
输出与Matlab的FFT中给出的答案相匹配,除了第一个组件。
有谁知道这个的原因?
答案 0 :(得分:1)
一些仅实数据的FFT仅将频率数据返回到N / 2个二进制位,因为其余的只是前半部分的镜像复共轭,用于严格实数输入。但由于能量的一半是在下半年,因此结果需要加倍才能解释未返回的N / 2能量箱。第0(DC)不需要加倍,因为它在负DC处没有复杂的共轭仓,因此必须在某处进行不同的处理。检查FFT的文档,因为您可能需要在实际半长度结果FFT之外处理此问题。