【问题标题】:Trying get the dominant frequency from accelerometer data尝试从加速度计数据中获取主频率
【发布时间】:2015-02-27 20:10:04
【问题描述】:

我正在开发一个应用程序,该应用程序将返回手机使用加速度计所经历的振动频率。

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

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

实际上,我的最终目标只是确定数据是否是实时的。所以,如果我做错了,请指出正确的方向。

如果我朝着正确的方向前进,我的代码哪里出错了?我是 android 和 java 的新手,我也可能犯了一些严重的逻辑错误。如果我可以获取一个数组,对其执行 FFT,实时获取主频率,并显示该结果......我全神贯注。

下面的代码sn-p:(数组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));

【问题讨论】:

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


    【解决方案1】:

    因此,首先,FFT 的结果是关于频率的“二维”,fftData[i] 和 fftData[i+1] 都包含频率 i 的值(或 fftData[i] 和 fftData[i+N /2]),但一个在 img 域中实际上是另一个(或者一个用于 sin,另一个用于 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 表中的高点窥视(值)。最高的索引将是您的频率。

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

    附:在 FFT 之前,您需要对数据进行线性去趋势(Apache 数学、SimpleREgression 以找到斜率和截距并将它们从数据中删除)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-16
      • 2014-06-08
      • 2011-05-25
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      相关资源
      最近更新 更多