0

私は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

FFTの大きさのピーク検出器はreliablではありませんe音程(周波数/音符)エスティメータ。それはしばしば、いくつかのティンバーの代わりに高調波の周波数を見つけるでしょう。

代わりに、スペクトル周波数推定器を使用するのではなく、ピッチ検出/推定方法(重み付き自己相関、AMDF、HPS、ケプストラム、決定、CDNNなど)を調べ、それらのうちの1つを試してください。

+0

基本周波数(各高調波ピークを1、2、3で割った和)を見つけるためにサブハーモニック加算を行いますので、F0は最初は存在しなくても常に優勢になります。適切なデータを持っています。私の問題は、私の短いデータを二重に変換するとき、何らかの提案ですか? –

関連する問題