私はPolyphonic信号ピッチ検出器を実装しているので、プログラムの実行(RecordData、Convert Data、Zero-padding、Windowing、FFT、Peak検出)をコードし始めました。最初は、私が得なければならない新しい音で試してみました。Audiorecordデータをプロセスに変換する
問題は、私の電話でAudiorecordクラスを使って録音することです。
例:私は電話で2〜3の純音を再生して録音しましたが、Audiorecordクラスで得た値は正しくありませんでした。私の電話から間違ったデータを取得しても、私は良い分析をすることはできません。ここで
はレコードデータ(ショート)に私のコードです。ここで(私はその問題を考えるところ、このステップはある)
を倍増するために、データショートを変換する私のコードです:
void recordAudio() {
mShouldContinue= true;
new Thread(new Runnable() {
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);
// buffer size in short
bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioEncoding); //Consigue el minimo tamaño de buffer para poder analizar
if (bufferSize == AudioRecord.ERROR || bufferSize == AudioRecord.ERROR_BAD_VALUE) {
bufferSize = sampleRate * 2; // si el buffersize obtenido por nuestro getMinBufferSize es apto usaremos el encontrado si no utilizaremos el doble de nuestra frecuencia de sampleo
}
short[] audioBuffer = new short[bufferSize];
if (audioBuffer.length % 2 == 0){ // Aseguramos que nuestro buffer input tenga una tamaño impar para una mejor R.F.
audioBuffer = new short[bufferSize +1];
}
AudioRecord record = new AudioRecord(audioSource, sampleRate, channelConfig, audioEncoding, bufferSize); //Instancia de la clase AudioRecord
if (record.getState() != AudioRecord.STATE_INITIALIZED) { // Si audiorecord no ha sido inicializado displeamos un mensaje advirtiendo.
Log.e(LOG_TAG, "Audio Record can't initialize!");
return;
}
record.startRecording(); //Empezamos a grabar con nuestros parámetros ya definidos.
Log.v(LOG_TAG, "Start recording"); //mensaje informativo
long shortsRead = 0;
while (mShouldContinue) {
int numberOfShort = record.read(audioBuffer, 0, audioBuffer.length); //audiobuffer.length
shortsRead += numberOfShort;
DFT(audioBuffer);
try { // Dormimos el programa durante un segundo
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
record.stop();
record.release();
Log.v(LOG_TAG, String.format("Recording stopped. Samples read: %d", shortsRead));
}
}).start();
}
Convertionどこ入力信号がaudiobufferとN(DFT関数内で)それの長さ:
for(int i = 0; i < N; i++){
doubley[i] = (double)(InputSignal[i])/32768.0;
}
基本周波数(各高調波ピークを1、2、3で割った和)を見つけるためにサブハーモニック加算を行いますので、F0は最初は存在しなくても常に優勢になります。適切なデータを持っています。私の問題は、私の短いデータを二重に変換するとき、何らかの提案ですか? –