Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图从加速度计数据中获取主频_Java_Android_Signal Processing_Fft_Android Sensors - Fatal编程技术网

Java 试图从加速度计数据中获取主频

Java 试图从加速度计数据中获取主频,java,android,signal-processing,fft,android-sensors,Java,Android,Signal Processing,Fft,Android Sensors,我正在开发一款应用程序,它可以通过加速度计返回手机所经历的振动频率 这是我个人用的。。只是为了获得DSP和在手机中使用传感器的经验 因此,我获取了一些传感器数据,并将绝对值写入一个数组。我的下一步是使用FFT尝试获得主频。这就是我迷路的地方 实际上,我的最终目标只是确定数据是周期性的还是非实时的。所以,如果我在这方面完全错了,请给我指出正确的方向 如果我朝着正确的方向走,我的代码哪里会出错?我是android和java新手,可能我也犯了一些严重的逻辑错误。如果我能拿一个阵列,对它进行FFT,实时

我正在开发一款应用程序,它可以通过加速度计返回手机所经历的振动频率

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

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

实际上,我的最终目标只是确定数据是周期性的还是非实时的。所以,如果我在这方面完全错了,请给我指出正确的方向

如果我朝着正确的方向走,我的代码哪里会出错?我是android和java新手,可能我也犯了一些严重的逻辑错误。如果我能拿一个阵列,对它进行FFT,实时获得主频,并显示结果。。。我洗耳恭听

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

int N=1024;
双[]量级=新双[N/2];
双精度[]fftData=新双精度[]{
0.0176,
-0.0620,
0.2467,
0.4599,
-0.0582,
0.4694,
0.0001,
-0.2873};
double[]fft=新的double[N*2];
双最大指数=-999999;
双最大值=-999999;
浮动采样率=59.98f;
对于(int i=0;i因此,首先,FFT的结果相对于频率而言是“二维”的,fftData[i]和fftData[i+1]都包含频率i的值(或fftData[i]和fftData[i+N/2]),但一个在img域中是实的,另一个在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之前,您需要对数据进行线性detrend(Apache math、SimpleREgression以找到斜率和截距,并将其从数据中删除)

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