【发布时间】:2016-07-18 11:08:56
【问题描述】:
在数据集上执行 FFT 后如何获得幅度和相应的频率。我需要绘制数据集的幅度与频率。另外,为什么我们将 FFT 数组的大小增加为实际数据集大小的两倍?然后生成的输出数组的大小再次不同,请帮助我理解这个 FFT 代码。此外,何时执行复前 FFT 以及何时执行实前 FFT?两者的区别?我需要对数据集执行 FFT 并获得 FFT 后的幅度以及每个幅度的相应频率。
int length = data.length;
FloatFFT_1D fftDo = new FloatFFT_1D(length);
float[] fft = new float[length * 2];
System.arraycopy(data, 0, fft, 0, length);
fftDo.complexForward(fft);
//for(double d: fft) {
//System.out.println(d);
//}
float outputfft[] = new float[(fft.length+1)/2];
if(fft.length%2==0){
for(int i = 0; i < length/2; i++){
outputfft[i]= (float) Math.sqrt((Math.pow(fft[2*i],2))+(Math.pow(fft[(2*(i))+1], 2)));
}
}else{
for(int i = 0; i < (length/2)+1; i++){
outputfft[i]= (float) Math.sqrt((Math.pow(fft[2*i],2))+(Math.pow(fft[(2*i)+1], 2)));
}
}
for (float f : outputfft) {
System.out.println(f);
}
【问题讨论】:
-
请添加堆栈跟踪
-
length / 2 +1 != length +1 / 2 ...
float outputfft[] = new float[(data.length+1)/2];vsfor(int i = 0; i < length/2+1; i++) -
感谢您的回复。但我真的不明白为什么数组大小不同。我已经修改了我的问题,试图更清楚地说明我真正想要的是什么。我是 Java 新手,也是 FFT 新手。如果可以的话,请帮助我理解代码。我刚刚尝试从各种来源复制它并尝试在我的数据集上实现它。但是即使在进行了您建议的更改后也无法使其工作。不知道如何添加堆栈跟踪..你的意思是在每一步都打印输出吗?
-
好的,退一步... Stacktrace 是发生异常时得到的输出。所有那些“BlahblahException at ... at ... at ...”大多数时候它会将您带到实际错误隐藏的地方。
-
数组大小可能不同,因为您有两种计算方法:a) length / 2 +1 和 (length+1)/2 它们可能采用不同的四舍五入方式。为避免该错误,您可以简单地使用您在 for 条件中使用的数组:
for(int i=0; i<outputfft.length;i++)