1

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

安卓手机是否只有 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());
4

1 回答 1

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 的动态范围数字可能并不令人惊讶——除非您已采取主动步骤禁用它。

于 2013-04-18T23:09:20.537 回答