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