title: Capturing Sound for Analysis and Visualizing Frequencies in Android
body: <p>I'm new in Android and  I'm trying to make a program which captures an audio sound  and then displays the frequencies that exist within it. I found an example that draws the graphic portion of a graphic equalizer. In this example it is used an object of type
  AudioRecord to capture audio sound. The technique used to break an audio signal down into component frequencies employs  a mathematic transformation called a discrete Fourier transform (DFT) and to perform DFT it is used a fast Fourier transform (FFT). This example use a package which implements the FFT. The package is linked here <a href="http://www.netlib.org/fftpack/jfftpack.tgz" rel="noreferrer">www.netlib.org/fftpack/jfftpack.tgz</a>. 
  The problem is that after I run this example the graphic equalizer doesn't appear on the display after I press the start button.</p>
  
  <p>Here is the source code for the activity class: </p>
  
  <pre><code>package com.audio.processing;
  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.media.AudioFormat;
  import android.media.AudioRecord;
  import android.media.MediaRecorder;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.ImageView;
  
  import ca.uol.aig.fftpack.RealDoubleFFT;
  
  public class AudioProcessing extends Activity implements OnClickListener{
      int frequency = 8000;
      int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
      int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
  
  
      private RealDoubleFFT transformer;
      int blockSize = 256;
      Button startStopButton;
      boolean started = false;
  
      RecordAudio recordTask;
  
      ImageView imageView;
      Bitmap bitmap;
      Canvas canvas;
      Paint paint;
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          startStopButton = (Button) this.findViewById(R.id.StartStopButton);
          startStopButton.setOnClickListener(this);
  
          transformer = new RealDoubleFFT(blockSize);
  
          imageView = (ImageView) this.findViewById(R.id.ImageView01);
          bitmap = Bitmap.createBitmap((int)256,(int)100,Bitmap.Config.ARGB_8888);
          canvas = new Canvas(bitmap);
          paint = new Paint();
          paint.setColor(Color.GREEN);
          imageView.setImageBitmap(bitmap);
      }
  
      private class RecordAudio extends AsyncTask&lt;Void, double[], Void&gt; {
          @Override
          protected Void doInBackground(Void... params) {
          try {
              int bufferSize = AudioRecord.getMinBufferSize(frequency,
                      channelConfiguration, audioEncoding);
                      AudioRecord audioRecord = new AudioRecord(
                      MediaRecorder.AudioSource.DEFAULT, frequency,
                      channelConfiguration, audioEncoding, bufferSize);
  
                      short[] buffer = new short[blockSize];
                      double[] toTransform = new double[blockSize];
                      audioRecord.startRecording();
                      while (started) {
                      int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
  
                      for (int i = 0; i &lt; blockSize &amp;&amp; i &lt; bufferReadResult; i++) {
                          toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit
                          }
  
                      transformer.ft(toTransform);
                      publishProgress(toTransform);
                      }
                      audioRecord.stop();
                      } catch (Throwable t) {
                      Log.e("AudioRecord", "Recording Failed");
                      }
                      return null;
                      }
          }
  
      protected void onProgressUpdate(double[]... toTransform) {
          canvas.drawColor(Color.BLACK);
          for (int i = 0; i &lt; toTransform[0].length; i++) {
          int x = i;
          int downy = (int) (100 - (toTransform[0][i] * 10));
          int upy = 100;
          canvas.drawLine(x, downy, x, upy, paint);
          }
          imageView.invalidate();
          }
  
          public void onClick(View v) {
          if (started) {
          started = false;
          startStopButton.setText("Start");
          recordTask.cancel(true);
          } else {
          started = true;
          startStopButton.setText("Stop");
          recordTask = new RecordAudio();
          recordTask.execute();
          }
          }
  }
  </code></pre>
  
  <p>Here is the main.xml :</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  &gt;
  &lt;TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/hello"
  /&gt;
  &lt;ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content"
  android:layout_height="wrap_content"&gt;&lt;/ImageView&gt;&lt;Button android:text="Start"
  android:id="@+id/StartStopButton" android:layout_width="wrap_content"
  android:layout_height="wrap_content"&gt;&lt;/Button&gt;
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>In the AndroidManifest.xml I set the RECORD_AUDIO permission.
  Thanks in advance !</p>