2017-06-20 4 views
1

私のチームと、私はrmsDb値を表示するバイパスオーディオソースを組み込んだアプリケーションを作成しています。私たちは-155から0の範囲のスケールを得ることを望んでいましたが、私たちが得ている値は-70から-19の範囲でした。私たちはすべてオーディオプログラミングを初めて経験しているので、スケールに何が問題なのかはわかりません。不正なdb rmsスケールを修正できません

EDIT:私たちが使用しているデバイスは、我々はタンゴとオーディオの仕事をしているために特別に買っただけで、市販のタンゴ対応デバイスであるレノボPhab2Pro、ですのでこれは、Googleプロジェクトタンゴに関連しています。したがって、これはタンゴ技術の採用に影響します。

public class RecordingThread { 
private static final String LOG_TAG = RecordingThread.class.getSimpleName(); 
private static final int SAMPLE_RATE = 22050; 
public float centerFrequency = 1000; 
private short[] audioBuffer; 
private short[] audioBuffer2; 
private double rms; 
private double mGain; 
private double rmsdB; 

public RecordingThread(AudioDataReceivedListener listener) { 
    mListener = listener; 
} 

private boolean mShouldContinue; 
private AudioDataReceivedListener mListener; 
private Thread mThread; 

public boolean recording() { 
    return mThread != null; 
} 

public void startRecording() { 
    if (mThread != null) 
     return; 

    mShouldContinue = true; 
    mThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      record(); 
     } 
    }); 
    mThread.start(); 
} 

public void stopRecording() { 
    if (mThread == null) 
     return; 

    mShouldContinue = false; 
    mThread = null; 
} 

private void record() { 
    rms = 0; 
    android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); 

    // buffer size in bytes 
    int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    if (bufferSize == AudioRecord.ERROR || bufferSize == AudioRecord.ERROR_BAD_VALUE) { 
     bufferSize = SAMPLE_RATE * 2; 
    } 

    audioBuffer = new short[bufferSize/2]; 
    audioBuffer2 = new short[bufferSize/2]; 

    AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 
      SAMPLE_RATE, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, 
      bufferSize); 

    if (record.getState() != AudioRecord.STATE_INITIALIZED) { 
     Log.e(LOG_TAG, "Audio Record can't initialize!"); 
     return; 
    } 
    record.startRecording(); 

    Log.v(LOG_TAG, "Start recording"); 

    long shortsRead = 0; 
    while (mShouldContinue) { 
     int numberOfShort = record.read(audioBuffer, 0, audioBuffer.length); 
     shortsRead += numberOfShort; 

     /* 
     * Noise level meter begins here 
     */ 
     // Compute the RMS value. (Note that this does not remove DC). 
     for (int i = 2; i < audioBuffer.length; i++) { 
      if(i % 3 == 0) { 
       audioBuffer2[i] = BiQuad.bqfilter(audioBuffer[i], audioBuffer[i - 1], audioBuffer[i - 2], audioBuffer2[i], audioBuffer2[i - 1], audioBuffer2[i - 2], SAMPLE_RATE, centerFrequency, 5); 
       rms += audioBuffer2[i] * audioBuffer2[i]; 
      } 
     } 
     rms = Math.sqrt(rms/audioBuffer2.length); 
     mGain = 1.0/32767; //0.0044; 
     rmsdB = 20.0 * Math.log10(mGain * rms); 
    } 

    record.stop(); 
    record.release(); 

    Log.v(LOG_TAG, String.format("Recording stopped. Samples read: %d", shortsRead)); 
    } 
} 

ご協力いただければ幸いです。

答えて

0

おそらく、rmsdB値に定数を追加する較正が必要な場合があります。

複数の測定を行い、標準の音量レベルメーターと比較してください。

サウンド強度(y軸上のdB)とrmsdB値(x軸上)のグラフを作成すると、これらのデータに線をフィットさせ、次にy切片をグラフはあなたに追加する定数を教えてくれます。

rmsdB = calibrationCostant + 20.0 * Math.log10(mGain * rms); 
関連する問題