Java FFT解释
我在一个Android项目中工作,在这个项目中,我使用FFT处理加速度计数据,我很难理解这些东西实际上是如何工作的。 我以以下方式使用Piotr Wendykier的jTransform库:Java FFT解释,java,android,accelerometer,fft,Java,Android,Accelerometer,Fft,我在一个Android项目中工作,在这个项目中,我使用FFT处理加速度计数据,我很难理解这些东西实际上是如何工作的。 我以以下方式使用Piotr Wendykier的jTransform库: int length = vectors.length; float[] input = new float[length*2]; for(int i=0;i<length;i++){ input[i]=vectors[i];
int length = vectors.length;
float[] input = new float[length*2];
for(int i=0;i<length;i++){
input[i]=vectors[i];
}
FloatFFT_1D fftlib = new FloatFFT_1D(length);
fftlib.complexForward(input);
float outputData[] = new float[(input.length+1)/2];
if(input.length%2==0){
for(int i = 0; i < length/2; i++){
outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*(i)+1], 2)));
}
}else{
for(int i = 0; i < length/2+1; i++){
outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*i+1], 2)));
}
}
List<Float> output = new ArrayList<Float>();
for (float f : outputData) {
output.add(f);
}
int length=vectors.length;
float[]输入=新的float[length*2];
对于(int i=0;i每个fft结果bin表示的频率是bin数乘以采样率除以fft的长度(与Sinc函数进行卷积,使其具有非零宽度,以获得比特技术)。如果采样率为50 Hz,且fft的长度为512,则fft结果的第16栏将表示约1.6 Hz,这接近于0.7秒的周期
箱位0(DC)处的峰值可能表示加速计上的非零重力。由于您有真实数据,您应该将这些值传递给realForward函数(而不是complexForward
)如前所述。重力对加速计没有影响……直流峰值很可能只是传感器的输出偏置,甚至只是测量窗口上的设备加速度积分不为零(换句话说,速度有净变化)@Oli:有意思。我放在桌上的iPhone上的加速计在Z轴上报告一个常数-1。这个-1的方向是如何确定设备方向的。Android不同吗?嗯,我对手机中使用的传感器一无所知,所以我收回了我之前的说法!不过,我会找到“加速计”这个名字如果设计为在设备静止时报告非零,则有点误导。@奥利:查找爱因斯坦广义相对论中等价的含义。那么,作为魔鬼代言人,有没有一种普遍接受的方法来消除初始噪声?或者这是硬件特有的“功能”