Note that there are some explanatory texts on larger screens.

plurals
  1. POCapturing Sound for Analysis and Visualizing Frequencies in Android
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload