android - android中的分贝

标签 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,对于带符号的 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 的动态范围数字可能不足为奇 - 除非您已采取积极措施禁用它,否则它将会如此。

关于android - android中的分贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072185/

相关文章:

Android - Proguard 返回错误代码 1。请参阅控制台

android - 您如何开始开发适用于多种设备尺寸/密度的 Android 应用程序?

android - 将有声读物上传到Firebase的最佳方法是什么?

android - 哪种WebRtc或wifi P2P可以将音频从一台设备共享到另一台设备

javascript - WebAudio API麦克风分贝阈值/门控(麦克风输入过于敏感)

android - 如何从 Android 支持库操作栏 SearchView 中检索文本?

android - Android 中的程序化图像大小调整、内存问题

c# - SharpDX XAudio2:6 SourceVoice限制

javascript - 网络音频的分贝值