android中的分贝

时间:2013-04-17 23:45:14

标签: android audio 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());

1 个答案:

答案 0 :(得分:9)

分贝刻度始终是相对于某些东西的度量 - 在数字音频的情况下,某些东西通常是样本能够容纳的最大值。这对于样本的浮点表示是1.0,对于有符号的16位样本是32767。计算的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的动态范围数字可能不会令人惊讶 - 因为除非您采取了有效步骤来禁用它,否则它将会出现。