Извлечение аудио частоты из инструмента, чтобы найти музыкальную ноту
Я пытаюсь разработать приложение для Android, которое извлекает звуковую частоту из инструмента. Я'используя метод быстрого преобразования Фурье с Jtransforms. Вот что у меня так далеко:}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new readFrequencies().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class readFrequencies extends AsyncTask {
@Override
protected Integer doInBackground(Void... arg0) {
AudioRecord recorder = null;
int bufferSize = 0;
boolean recording = true;
int rate = 8000;
short audioFormat = AudioFormat.ENCODING_PCM_16BIT;
short channelConfig = AudioFormat.CHANNEL_IN_MONO;
try {
bufferSize = AudioRecord.getMinBufferSize(rate,channelConfig, audioFormat);
recorder = new AudioRecord(AudioSource.DEFAULT, rate,
channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
/*
* Android 4.1.2
*
int recorder_id = recorder.getAudioSessionId();
if (NoiseSuppressor.isAvailable()) NoiseSuppressor.create(recorder_id);
*/
}
else {
Toast.makeText(getApplicationContext(),
"Error en la inicialización", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {}
short[] audioData = new short[bufferSize];
if (recorder != null) {
while (recording) {
if (recorder.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED) {
recorder.startRecording();
}
else {
int numshorts = recorder.read(audioData,0,audioData.length);
if ((numshorts != AudioRecord.ERROR_INVALID_OPERATION) &&
(numshorts != AudioRecord.ERROR_BAD_VALUE)) {
// Hann
double[] preRealData = new double[bufferSize];
double PI = 3.14159265359;
for (int i = 0; i < bufferSize; i++) {
double multiplier = 0.5 * (1 - Math.cos(2*PI*i/(bufferSize-1)));
preRealData[i] = multiplier * audioData[i];
}
DoubleFFT_1D fft = new DoubleFFT_1D(bufferSize);
double[] realData = new double[bufferSize * 2];
for (int i=0;i