gpt4 book ai didi

java - 获取wav文件的声压级

转载 作者:行者123 更新时间:2023-12-01 12:52:35 24 4
gpt4 key购买 nike

我正在尝试获取并表示先前使用设备的内部麦克风录制的 wav 文件的 SPL。问题是,我得到的值似乎根本不符合逻辑,因为我得到的值超过 100 db,只是拍手,如您在此处看到的:

image
(来源:subirimagenes.com)

这就是我正在做的事情:

  • 首先,由于 wav 文件保存在 16 位 PCM 中,我对其字节进行操作,以获得在 [-1,1] 之间规范化的唯一 double 值(我不使用前 44 个字节进行操作,如它是 wav header )。
  • 然后,根据公式 SPL=10*log(audioSample/Iref),我可以获得每个所需的声级(即 Iref=10^-12)。
  • 最后,我计算最大值和最小值来设置绘图的边距。

你们知道我做错了什么吗?我认为这些值应该是获得的值的一半左右

这是一段代码:

protected void miThread() {
Thread t=new Thread() {
public void run(){
//Operaciones ope=new Operaciones();
double [] st =new double [arr.length];
int j=0;
try{
for (int i = 44; i < s; i+=2) {
// convert byte pair to int
double audioSample = (double) (array[i+1] << 8 | array[i] & 0xff)/ 32767.0;

arr[j]=audioSample; //double
n[j] = (Number)arr[j]; //Number

st[j]=10*Math.log10(Math.abs((audioSample/Math.pow(10, -12)))); //double
l[j]=(Number)(10*Math.log10(Math.abs((audioSample/Math.pow(10, -12))))); //Number

if(audioSample == 0.0 ){
if(j!=0){
l[j]=l[j-1];
st[j]=st[j-1];
}else{
l[j]=0.0;
st[j]=0.0;
}
}

j=j+1;}
min=Operaciones.minimum(arr);
max=Operaciones.maximum(arr);
min2=Operaciones.minimum(st);
max2=Operaciones.maximum(st);
}
catch (NullPointerException e){
e.printStackTrace();
}
handle.post(proceso);
} }; t.start();
}

final Runnable proceso=new Runnable(){
public void run(){
//plot.redraw();
//plot2.redraw();
Toast.makeText(Grafica.this,
"Ya se ha cargado todo el array", Toast.LENGTH_LONG).show();
}
};

最佳答案

SPL 不是代表与绝对引用值相比的声压级吗?所以麦克风插在16bit精度的端口上我认为是可以的。 SNR 应约为 60dB,因此语音间隔约为 44dB。因此,当麦克风接收到任何声音时,信号应该上升(如果我记得是 16 位的话,信号应该上升约 104dB)。

SPL=20log(帕斯卡/2e-5)

关于java - 获取wav文件的声压级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com