音圧レベルを測定する Android アプリを開発したいのですが、時間重み付けの実装方法がわかりません。現時点では、私のアルゴリズムは次のように機能します。
- 20ms のオーディオを録音 (160 サンプル @ 8000Hz)
- RMS の計算
- SPL を計算する
- 表示値を更新してやり直す
ここでは、アルゴリズムの主要部分を確認できます。
// The Google ASR input requirements state that audio input sensitivity
// should be set such that 90 dB SPL at 1000 Hz yields RMS of 2500 for
// 16-bit samples, i.e. 20 * log_10(2500 / mGain) = 90.
double Gain = 2500.0 / Math.pow(10.0, 90.0 / 20.0);
// This method is called every 20ms:
@Override
public void processAudioFrame(short[] audioFrame) {
// Compute the RMS value.
double rms = 0;
for (int i = 0; i < audioFrame.length; i++) {
rms += audioFrame[i]*audioFrame[i];
}
rms = Math.sqrt(rms/audioFrame.length);
final double rmsdB = 20.0 * Math.log10(rms / Gain) + refSPL;
// refSPL is obtained by calibration with a professional spl meter
}
サウンドレベルメーターのグレードは、高速、低速、またはインパルス時間で重み付けできることを知っています。しかし、今回の重み付けをアルゴリズムに実装する方法と場所がわかりません。
Q: 時間加重とは、測定された dB 値を更新する時間が経過したことを意味しますか?
Q: 重み付けされた結果を高速に取得するには、更新間隔を 125 ミリ秒に変更する必要がありますか?それとも完全に間違っていますか?
ご協力ありがとうございました