【问题标题】:Decibels in android安卓中的分贝
【发布时间】:2013-04-17 23:45:14
【问题描述】:

我创建了一个获取 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());

【问题讨论】:

  • 你对db =(float) (20 * Math.log10(ampitude/700.0));有什么看法?
  • 我在玩参考振幅,所以我可以得到一个 0 的起始值。但这并不能回答我的问题

标签: android audio decibel


【解决方案1】:

分贝标度始终是相对于某物的量度 - 在数字音频的情况下,该物通常是样本能够保持的最大值。这是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 的动态范围数字可能并不令人惊讶 - 因为除非您已采取主动步骤将其禁用,否则它会如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2015-03-18
    • 2013-08-08
    • 1970-01-01
    • 2014-04-13
    • 2014-07-16
    • 2011-11-20
    • 2015-07-20
    相关资源
    最近更新 更多