2013-03-25 132 views
0

請!我需要幫助!我試圖做一臺錄音機,然後用這個聲音做傅立葉快速變換與他的圖形。問題是我不知道如何做圖形,我找到了FFT函數,但它沒有圖形。任何建議要做到這一點?FFT錄音機Android

package proiektua.proiektua; 



import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 

import android.provider.MediaStore; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 


public class MainActivity extends Activity { 

     int peticion = 1; 
     Uri url1; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 

     public void grabar(View v) { 
      Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 
      startActivityForResult(intent, peticion);} 




     public void reproducir(View v) { 
      MediaPlayer mediaPlayer = MediaPlayer.create(this, url1); 
      mediaPlayer.start(); 
     } 

     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (resultCode == RESULT_OK && requestCode == peticion) { 
       url1 = data.getData(); 
      } 
     } 

    } 

這是FFT:

public class FFT { 

    // compute the FFT of x[], assuming its length is a power of 2 
    public static Complex[] fft(Complex[] x) { 
     int N = x.length; 

     // base case 
     if (N == 1) return new Complex[] { x[0] }; 

     // radix 2 Cooley-Tukey FFT 
     if (N % 2 != 0) { throw new RuntimeException("N is not a power of 2"); } 

     // fft of even terms 
     Complex[] even = new Complex[N/2]; 
     for (int k = 0; k < N/2; k++) { 
      even[k] = x[2*k]; 
     } 
     Complex[] q = fft(even); 

     // fft of odd terms 
     Complex[] odd = even; // reuse the array 
     for (int k = 0; k < N/2; k++) { 
      odd[k] = x[2*k + 1]; 
     } 
     Complex[] r = fft(odd); 

     // combine 
     Complex[] y = new Complex[N]; 
     for (int k = 0; k < N/2; k++) { 
      double kth = -2 * k * Math.PI/N; 
      Complex wk = new Complex(Math.cos(kth), Math.sin(kth)); 
      y[k]  = q[k].plus(wk.times(r[k])); 
      y[k + N/2] = q[k].minus(wk.times(r[k])); 
     } 
     return y; 
    } 

而他的複雜的類:

public class Complex { 
    private final double re; // the real part 
    private final double im; // the imaginary part 

    // create a new object with the given real and imaginary parts 
    public Complex(double real, double imag) { 
     re = real; 
     im = imag; 
    } 

    // return a string representation of the invoking Complex object 
    public String toString() { 
     if (im == 0) return re + ""; 
     if (re == 0) return im + "i"; 
     if (im < 0) return re + " - " + (-im) + "i"; 
     return re + " + " + im + "i"; 
    } 

    // return abs/modulus/magnitude and angle/phase/argument 
    public double abs() { return Math.hypot(re, im); } // Math.sqrt(re*re + im*im) 
    public double phase() { return Math.atan2(im, re); } // between -pi and pi 

    // return a new Complex object whose value is (this + b) 
    public Complex plus(Complex b) { 
     Complex a = this;    // invoking object 
     double real = a.re + b.re; 
     double imag = a.im + b.im; 
     return new Complex(real, imag); 
    } 

    // return a new Complex object whose value is (this - b) 
    public Complex minus(Complex b) { 
     Complex a = this; 
     double real = a.re - b.re; 
     double imag = a.im - b.im; 
     return new Complex(real, imag); 
    } 

    // return a new Complex object whose value is (this * b) 
    public Complex times(Complex b) { 
     Complex a = this; 
     double real = a.re * b.re - a.im * b.im; 
     double imag = a.re * b.im + a.im * b.re; 
     return new Complex(real, imag); 
    } 

    // scalar multiplication 
    // return a new object whose value is (this * alpha) 
    public Complex times(double alpha) { 
     return new Complex(alpha * re, alpha * im); 
    } 

    // return a new Complex object whose value is the conjugate of this 
    public Complex conjugate() { return new Complex(re, -im); } 

    // return a new Complex object whose value is the reciprocal of this 
    public Complex reciprocal() { 
     double scale = re*re + im*im; 
     return new Complex(re/scale, -im/scale); 
    } 

    // return the real or imaginary part 
    public double re() { return re; } 
    public double im() { return im; } 

    // return a/b 
    public Complex divides(Complex b) { 
     Complex a = this; 
     return a.times(b.reciprocal()); 
    } 

    // return a new Complex object whose value is the complex exponential of this 
    public Complex exp() { 
     return new Complex(Math.exp(re) * Math.cos(im), Math.exp(re) * Math.sin(im)); 
    } 

    // return a new Complex object whose value is the complex sine of this 
    public Complex sin() { 
     return new Complex(Math.sin(re) * Math.cosh(im), Math.cos(re) * Math.sinh(im)); 
    } 

    // return a new Complex object whose value is the complex cosine of this 
    public Complex cos() { 
     return new Complex(Math.cos(re) * Math.cosh(im), -Math.sin(re) * Math.sinh(im)); 
    } 

    // return a new Complex object whose value is the complex tangent of this 
    public Complex tan() { 
     return sin().divides(cos()); 
    } 



    // a static version of plus 
    public static Complex plus(Complex a, Complex b) { 
     double real = a.re + b.re; 
     double imag = a.im + b.im; 
     Complex sum = new Complex(real, imag); 
     return sum; 
    } 



    // sample client for testing 
    public static void main(String[] args) { 
     Complex a = new Complex(5.0, 6.0); 
     Complex b = new Complex(-3.0, 4.0); 

     System.out.println("a   = " + a); 
     System.out.println("b   = " + b); 
     System.out.println("Re(a)  = " + a.re()); 
     System.out.println("Im(a)  = " + a.im()); 
     System.out.println("b + a  = " + b.plus(a)); 
     System.out.println("a - b  = " + a.minus(b)); 
     System.out.println("a * b  = " + a.times(b)); 
     System.out.println("b * a  = " + b.times(a)); 
     System.out.println("a/b  = " + a.divides(b)); 
     System.out.println("(a/b) * b = " + a.divides(b).times(b)); 
     System.out.println("conj(a)  = " + a.conjugate()); 
     System.out.println("|a|   = " + a.abs()); 
     System.out.println("tan(a)  = " + a.tan()); 
    } 

} 

感謝所有!

回答

1

嗯,只是...做一個圖形表示 - 您需要做的就是計算每個頻率點的Magnitude (or Euclidian Norm),然後在Canvas或某些上繪製相應的行。

有在Google Code稱爲Audalyzer可用在完整的源代碼的開源項目 - 你可以得到一些指點那裏,只是可以肯定,如果你從那裏:)

重用代碼堅持許可證