سؤال

I have searched on stackoverflow for the fastest FFT algorithm, and I found the following:

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

My question is that I have a MediaRecorder Object to capture audio as follows:

if (mRecorder == null) {
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            mRecorder.setOutputFile("/dev/null");

            try {
                mRecorder.prepare();
            } catch (IllegalStateException e) {
                Log.e("error", "IllegalStateException");
            } catch (IOException e) {
                Log.e("error", "IOException");
                ;
            }

            mRecorder.start();
        }

Now I want to use this FFT algorithm on my captured audio and show the results on an equalizer or something. How I can do that?

هل كانت مفيدة؟

المحلول

MediaRecorder doesn't give you access directly to the audio buffer, but if you use AudioRecord you can. If you must use MediaRecorder then perhaps save it to a file and then re-read the file back in again.

Someone has worked on an example here Capturing Sound for Analysis and Visualizing Frequencies in Android

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top