Capturing Sound for Analysis and Visualizing Frequencies in Android

后端 未结 3 1136
自闭症患者
自闭症患者 2020-12-02 10:33

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 t

3条回答
  •  失恋的感觉
    2020-12-02 11:21

    Here is the working code. I tried it myself. It works fine.

    package com.example.frequencytest;
    
    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.Menu;
    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 MainActivity 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;
    
        //AudioRecord audioRecord;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            startStopButton = (Button) this.findViewById(R.id.start_stop_btn);
            startStopButton.setOnClickListener(this);
    
            transformer = new RealDoubleFFT(blockSize);
    
            imageView = (ImageView) this.findViewById(R.id.imageView1);
            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);
    
        }
    
        public class RecordAudio extends AsyncTask {
    
            @Override
            protected Void doInBackground(Void... arg0) {
    
                try {
                    // int bufferSize = AudioRecord.getMinBufferSize(frequency,
                    // AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
                    int bufferSize = AudioRecord.getMinBufferSize(frequency, 
                            channelConfiguration, audioEncoding); 
    
                    AudioRecord audioRecord = new AudioRecord( 
                            MediaRecorder.AudioSource.MIC, frequency, 
                            channelConfiguration, audioEncoding, bufferSize); 
    
                    short[] buffer = new short[blockSize];
                    double[] toTransform = new double[blockSize];
    
                    audioRecord.startRecording();
    
                    // started = true; hopes this should true before calling
                    // following while loop
    
                    while (started) {
                        int bufferReadResult = audioRecord.read(buffer, 0,
                                blockSize);
    
                        for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                            toTransform[i] = (double) buffer[i] / 32768.0; // signed
                                                                            // 16
                        }                                       // bit
                            transformer.ft(toTransform);
                            publishProgress(toTransform);
    
    
    
                    }
    
                    audioRecord.stop();
    
                } catch (Throwable t) {
                    t.printStackTrace();
                    Log.e("AudioRecord", "Recording Failed");
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(double[]... toTransform) {
    
                canvas.drawColor(Color.BLACK);
    
                for (int i = 0; i < 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();
    
                // TODO Auto-generated method stub
                // super.onProgressUpdate(values);
            }
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (started) {
                started = false;
                startStopButton.setText("Start");
                recordTask.cancel(true);
            } else {
                started = true;
                startStopButton.setText("Stop");
                recordTask = new RecordAudio();
                recordTask.execute();
            }
        }
    }
    

提交回复
热议问题