저는 Polyphonic 신호 피치 감지기를 구현하여 프로그램 수행 (RecordData, Convert Data, Zero-padding, Windowing, FFT, Peak detection)을 코딩하기 시작했습니다. 처음에 나는 이미 내가 가지고 있어야하는 가치가있는 새로운 소리로 그것을 시험했고, 그것은 완벽하게 작동했다.Audiorecord 데이터를 FFT로 변환
내가 가지고있는 문제는 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 어디 Inputsignal는 오디오 버퍼이며, N은 (DFT 기능 내부) 길이의 :
for(int i = 0; i < N; i++){
doubley[i] = (double)(InputSignal[i])/32768.0;
}
기본 주파수 (각 하모닉 피크를 1, 2, 3로 나눈 값)를 찾기 위해 서브 하모닉 합계를 수행하므로 처음에는 F0이 항상 존재할 수 있지만 항상 우세합니다. 올바른 데이터를 보유하고 있어야합니다. 내 문제는 내 짧은 데이터를 두 번, 모든 제안 변환 할 때 무엇입니까?. –