Я хотел бы разработать приложение для Android для измерения уровня звукового давления, но я не уверен, как реализовать взвешивание по времени. На данный момент мой алгоритм работает следующим образом:
- Запись 20 мс аудио (160 сэмплов при 8000 Гц)
- Вычислить среднеквадратичное значение
- Рассчитать 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
}
Я знаю, что уровень шумомера может быть «Быстрый», «Медленный» или «Импульсный», взвешенный по времени. Но я не уверен, как и где реализовать это взвешивание по времени в моем алгоритме.
В: Означает ли взвешивание по времени, через какое время я обновлю измеренное значение дБ?
В: Должен ли я просто изменить интервал обновления на 125 мс, чтобы получить быстрый взвешенный результат, или я совершенно не прав?
Спасибо за поддержку