AudioRecordとjtransformsを使用してボタンをクリックするごとにFFTを行うプログラムを作っています。
しかし、値が安定せずに困っています。使い方が間違っているのでしょうか?
ご教授お願いいたします。
ある程度、ボタンを使い方は改造途中なので間違っています・・・
package com.example.testfft004;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.jtransforms.fft.DoubleFFT_1D;
public class MainActivity extends Activity implements View.OnClickListener {
/** Called when the activity is first created. */
final static int SAMPLING_RATE = 44100;
AudioRecord audioRec = null;
Button btn = null;
boolean bIsRecording = false;
int bufSize;
final static int FFT_SIZE = 512;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button)findViewById(R.id.button_id); btn.setOnClickListener(this); // バッファサイズの計算 bufSize = AudioRecord.getMinBufferSize( SAMPLING_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); if (FFT_SIZE > bufSize) { bufSize = FFT_SIZE; } // AudioRecordの作成 audioRec = new AudioRecord( MediaRecorder.AudioSource.MIC, SAMPLING_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufSize); } @Override public void onClick(View v) { // TODO Auto-generated method stub if (v == btn) { if (bIsRecording) { bIsRecording = false; } else { // 録音開始 Log.v("AudioRecord", "startRecording"); audioRec.startRecording(); bIsRecording = true; // 録音スレッド new Thread(new Runnable() { @Override public void run() { byte buf[] = new byte[bufSize]; // TODO Auto-generated method stub // 録音データ読み込み audioRec.read(buf, 0, buf.length); // 録音停止 //audioRec.stop(); //高速フーリエ変換 DoubleFFT_1D fft = new DoubleFFT_1D(FFT_SIZE); double[] FFTdata = new double[FFT_SIZE]; for (int i = 0; i < FFT_SIZE; i++) { FFTdata[i] = (double) buf[i]; } fft.realForward(FFTdata); double[] dbfs = new double[FFT_SIZE / 2]; double max_db = 0; int max_i = 0; for (int i = 0; i < FFT_SIZE / 2; i += 2) { dbfs[i / 2] = (int) (Math.sqrt(Math.pow(FFTdata[i], 2) + Math.pow(FFTdata[i + 1], 2))); if (max_db < dbfs[i / 2]) { max_db = dbfs[i / 2]; max_i = i / 2; } } //Log.d("db", "Hz" + (SAMPLING_RATE/ (double) FFT_SIZE)*max_i*2 + "maxdb" + max_db); } }).start(); } } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); audioRec.release(); }
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/20 04:07
2016/05/25 13:59