android中的分贝

Lau*_*aou 1 audio android decibel

我创建了一个获取getMaxAmpitude的应用程序,然后将其转换为分贝,但我只获得了30dB的范围.

Android手机只有30dB的范围或者我的代码中有问题吗?

public class getMaxAmpitude extends AsyncTask<Void, Float, Void>{
     String dB = "";    
     int ampitude;
     float db;
     @Override
    public Void doInBackground(Void... params) {
        while(rec == true){
            try{
                Thread.sleep(250);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            ampitude = recorder.getMaxAmplitude();
            db =(float) (20 * Math.log10(ampitude/700.0));
            publishProgress(db);
        }
        return null;
    }
    public void onProgressUpdate(Float... progress){

        //database.addSoundData(dB);
        dB = (progress[0].toString());
Run Code Online (Sandbox Code Playgroud)

mar*_*rko 9

分贝标度始终是相对于某些东西的度量 - 在数字音频的情况下,某些东西通常是样本能够容纳的最大值.这可以1.0用于样本的浮点表示,也可以32767用于带符号的16位样本.计算的dB值为负,0dB为剪辑.

如果不知道究竟recorder是什么实例,我会假设它是Android的MediaRecorder- 它使用带符号的16位整数.

因此,在这种情况下,正确的等式是:

db = 20.0 * log10(peakAmplitude/32767.0)

然而,您在上面使用的等式仅仅将结果偏差,因为它的等效性为:

db = 20.0 * log10(peakAmplitude) - 20.0 * log10(700)

=20.0*log10(peakAmplitude) - ~56.9

如果您正在录制板载​​麦克风并且启用了自动增益控制,那么动态范围数字30dB可能并不令人惊讶 - 因为除非您采取了有效步骤来禁用它,否则它将会出现.