2017-05-16 16 views
0

저는 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

사용 FFT 크기 피크 검출기는 reliabl 아니다 전자 음악 피치 (주파수/음) 추정기. 종종 일부 음색의 경우 고조파 주파수를 찾습니다.

대신 스펙트럼 주파수 추정기를 사용하는 대신 피치 검출/추정 방법 (가중치 자동 상관, AMDF, HPS, 셉 스트 럼, 결정, CDNN 등)을 찾아보고 그 중 하나를 시도하십시오.

+0

기본 주파수 (각 하모닉 피크를 1, 2, 3로 나눈 값)를 찾기 위해 서브 하모닉 합계를 수행하므로 처음에는 F0이 항상 존재할 수 있지만 항상 우세합니다. 올바른 데이터를 보유하고 있어야합니다. 내 문제는 내 짧은 데이터를 두 번, 모든 제안 변환 할 때 무엇입니까?. –