FFT解释

时间:2012-01-06 21:33:43

标签: 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];
        }

        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);
        }

结果是一个包含以下数据output data visualization的数组。

我在解释输出数据时遇到问题。数据来自10秒长的间隔,采样频率为50Hz。虽然我手里拿着手机每隔3/4秒向上和向下移动手机,有可能的是,大约x值16的极值可能是信号中最强分量的周期? 我需要获得信号中最强组分的频率。

2 个答案:

答案 0 :(得分:7)

每个fft结果区表示的频率是二进制数乘以采样率除以fft的长度(用一个Sinc函数进行卷积,得到非零宽度,得到一点技术)。如果您的采样率为50 Hz且您的fft长度为fft长度为512,那么fft结果的bin 16将代表约1.6 Hz,接近0.7秒的周期。

bin 0(DC)处的尖峰可能代表加速度计上的非零重力。

答案 1 :(得分:1)

由于您拥有真实数据,因此您应将这些值传递给realForward函数(不是complexForward),如所述here