我创建了一个获取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());
答案 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的动态范围数字可能不会令人惊讶 - 因为除非您采取了有效步骤来禁用它,否则它将会出现。