尝试从加速度计数据中获取主导频率

时间:2015-02-27 20:10:05

标签: java android signal-processing fft android-sensors

我正在开发一款可以恢复手机使用加速度计所经历的振动频率的应用。

这是我个人使用的......只是为了获得DSP的经验并在手机中使用传感器。

所以,我抓住了一些传感器数据并将绝对值写入数组。我的下一步是使用FFT来尝试获得主导频率。那就是我失去的地方。

我的最终目标实际上只是确定数据是否是实时的周期性。所以,如果我认为这一切都错了,请指出我正确的方向。

如果我朝着正确的方向前进,我的代码在哪里出错?我是android和java的新手,而且我可能也会犯一些严重的逻辑错误。如果我可以采用数组,对其执行FFT,实时获得主导频率,并显示结果......我全都耳朵。

下面的代码片段:(数组fftData充满了垃圾数据)

int N = 1024;
        double[] magnitude = new double[N/2];
        double[] fftData = new double[]{
                0.0176,
                -0.0620,
                0.2467,
                0.4599,
                -0.0582,
                0.4694,
                0.0001,
                -0.2873};
        double[] fft = new double[N*2];
        double max_index=-9999999;
        double max_magnitude = -9999999;
        float sample_rate = 59.98f;

        for (int i = 0; i < N; i++) {
            fftData[i] = AbsVal;
        }
        DoubleFFT_1D fftDo = new DoubleFFT_1D(N);
        fftDo.realForwardFull(fftData);

       // I'm lost here ...

        double frequency = /* not sure what to do here either */;
        Strength.setText(String.valueOf(Math.round(AbsVal)) + " \u00b5T");
        field.setText(String.valueOf(frequency));

1 个答案:

答案 0 :(得分:0)

因此,首先FFT的结果是关于频率的'二维',fftData [i]和fftData [i + 1]都包含频率i的值(或fftData [i]和fftData [i + N] / 2]),但是一个在img域中是另一个(或者另一个用于cos函数的另一个)。 你需要将fft频谱转换为1D,这称为功率谱PS [i] = fft [i] ^ 2 + fft [i + 1] ^ 2(在你的情况下,你可以认为值是PS的平方) 。 因此,请阅读FFT库手册中如何表示FFT结果(如果索引= 0,1属于第一个频率,或者它是1和2,os是1和N / 2 + 1)。

然后你正在寻找PS表中的高峰值(值)。最高的索引将是您的频率。

最后,您想要计算“实际”频率,这取决于您的采样间隔和点数。

P.S。 Beffore FFT需要线性去除数据(Apache数学,SimpleREgression以找到斜率和拦截并从数据中删除它们)。