У Android MediaRecorder есть функция
.getMaxAmplitude();, которая, как сообщает API, " Возвращает максимальную абсолютную амплитуду, которая была взятый с момента последнего вызова этого метода., но я не могу найти, какая амплитуда это? Это в паскале или ваттах?
Я нашел на нескольких страницах в Интернете, что вы можете вычислить значение, тесно связанное с децибелами, используя (как предложено здесь).
double db = (20 * Math.log10(amplitude / REFERENCE)); 
который позволил бы мне предположить, что возвращаемое значение находится в некотором линейном масштабе (вероятно, что-то вроде milipascal...)
REFERENCE = 0.1 (я знаю, что это должно быть что-то вроде 2 * 10 ^ (- 5) Pascal ((20 uPascal)), но это возвращает странные значения... 0.1 странно работает лучше.)
Прямо сейчас я измеряю MaxAmplitude() с помощью
getMaxAmplitude()и помещаю это в переменную амплитуда.
Это метод:
public double getNoiseLevel() 
{
    //Log.d("SPLService", "getNoiseLevel() ");
    int x = mRecorder.getMaxAmplitude();
    double x2 = x;
    Log.d("SPLService", "x="+x);
    double db = (20 * Math.log10(x2 / REFERENCE));
    //Log.d("SPLService", "db="+db);
    if(db>0)
    {
        return db;
    }
    else
    {
        return 0;
    }
}
Это делается 5 раз за полсекунды, которое получает вид среднего
for(int i=0; i<5; i++)
{
    try 
    {
            Thread.sleep(100);
    } 
    catch (InterruptedException e) 
    {
            e.printStackTrace();
            return 0;
    }
    level = level+getNoiseLevel();
    if(level>0)
    {
        counter++;
    }
}
level=level/counter;
Log.d(LOG_TAG, "level="+level);
Я получаю что-то подобное, похожее на децибел, но я не уверен, что его фактический децибел вообще...
Итак, может ли кто-нибудь помочь мне в этом? Кажется очень странным, что API совсем не соответствует тому, что возвращается...
