androidのアプリで鼻歌を録り、それをフーリエ変換して周波数を求め、その周波数にあわせて、MIDIで楽器音を出すというアプリを作っています。
しかし、なかなかうまくいかず、現在フーリエ変換(周波数があっていない)までしかできていません。
↓現時点でできているコード
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.os.Handler;
import edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D;
public class MainActivity extends Activity {
final static int SAMPLING_RATE = 44100;
final static int FFT_SIZE = 4096;
AudioRecord audioRec = null;
boolean bIsRecording = false;
int bufSize;
double dB_baseline = Math.pow(2, 15)FFT_SIZEMath.sqrt(2);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bufSize=AudioRecord.getMinBufferSize(
SAMPLING_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
if (FFT_SIZE > bufSize) bufSize = FFT_SIZE;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onResume() {
super.onResume();
audioRec = new AudioRecord(
MediaRecorder.AudioSource.MIC,
SAMPLING_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufSize *2);
audioRec.startRecording();
bIsRecording = true;
new Thread(new Runnable() {
@Override
public void run() {
short buf[] = new short[bufSize];
while (bIsRecording) {
audioRec.read(buf, 0, buf.length);
Log.d("audiorecord", String.valueOf(buf.length));
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);
//dBFS計算
double[] dbfs = new double[FFT_SIZE/2];
double max_db = -120d;
int max_i = 0;
for(int i=0;i<FFT_SIZE;i+=2){
dbfs[i/2]=(int)
(20*Math.log10( Math.sqrt(Math.pow(FFTdata[i], 2)
+Math.pow(FFTdata[i+1], 2))/dB_baseline));
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 + "maxdb" + max_db);
}
// 録音停止
audioRec.stop();
audioRec.release();
}
}).start();
}
@Override
protected void onPause() {
super.onPause();
if (bIsRecording) {
bIsRecording = false;
}
}
}
どなたか教えてください。
できればコードをおくってください。
あなたの回答
tips
プレビュー