java - android SDK中的FFT库

标签 java android accelerometer fft

我正在使用 android 项目。我需要 FFT 算法来处理 android 加速度计数据。android sdk 中是否有可用的 FFT 库?

最佳答案

你可以使用这个类,它对于实时音频分析来说足够快

public class FFT {

  int n, m;

  // Lookup tables. Only need to recompute when size of FFT changes.
  double[] cos;
  double[] sin;

  public FFT(int n) {
      this.n = n;
      this.m = (int) (Math.log(n) / Math.log(2));

      // Make sure n is a power of 2
      if (n != (1 << m))
          throw new RuntimeException("FFT length must be power of 2");

      // precompute tables
      cos = new double[n / 2];
      sin = new double[n / 2];

      for (int i = 0; i < n / 2; i++) {
          cos[i] = Math.cos(-2 * Math.PI * i / n);
          sin[i] = Math.sin(-2 * Math.PI * i / n);
      }

  }

  public void fft(double[] x, double[] y) {
      int i, j, k, n1, n2, a;
      double c, s, t1, t2;

      // Bit-reverse
      j = 0;
      n2 = n / 2;
      for (i = 1; i < n - 1; i++) {
          n1 = n2;
          while (j >= n1) {
              j = j - n1;
              n1 = n1 / 2;
          }
          j = j + n1;

          if (i < j) {
              t1 = x[i];
              x[i] = x[j];
              x[j] = t1;
              t1 = y[i];
              y[i] = y[j];
              y[j] = t1;
          }
      }

      // FFT
      n1 = 0;
      n2 = 1;

      for (i = 0; i < m; i++) {
          n1 = n2;
          n2 = n2 + n2;
          a = 0;

          for (j = 0; j < n1; j++) {
              c = cos[a];
              s = sin[a];
              a += 1 << (m - i - 1);

              for (k = j; k < n; k = k + n2) {
                  t1 = c * x[k + n1] - s * y[k + n1];
                  t2 = s * x[k + n1] + c * y[k + n1];
                  x[k + n1] = x[k] - t1;
                  y[k + n1] = y[k] - t2;
                  x[k] = x[k] + t1;
                  y[k] = y[k] + t2;
              }
          }
      }
  }
}

警告:此代码似乎源自 here ,并拥有 GPLv2 许可证。

关于java - android SDK中的FFT库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272232/

相关文章:

javascript - 仅当设备是 android 时,如何才能显示弹出窗口?

java - 按照创建摇动监听器的教程进行操作,但使用时遇到问题

java - 如何使用加速度计检测1Gs以上的振动?

java - 使用正则表达式拆分字符串并在两侧获取数据

java - 为什么 Spring 将构造函数 arg 报告为不明确

android - 如何在 android 上以编程方式取消配对或删除配对的蓝牙设备?

android - ARCore Pose 和 Aruco estimatePoseSingleMarkers

ios - 拍照时相机方向改变。即使方向被锁定。

java - 尝试使用 java printwriters 附加文本文件

java - `gradle jar` 好像没有给jar文件添加依赖