【问题标题】:Obtaining Sound Pressure Level of wav file获取wav文件的声压级
【发布时间】:2014-07-29 09:45:06
【问题描述】:

我正在尝试获取并表示以前使用我设备的内部麦克风录制的 wav 文件的 SPL。 问题是我得到的值似乎根本不符合逻辑,因为我得到的值超过 100 分贝,你可以在这里看到:


(来源:subirimagenes.com

这就是我正在做的:

  • 首先,由于 wav 文件保存在 16 位 PCM 中,因此我对其字节进行操作以在 [-1,1] 之间进行归一化的唯一双精度值(我不将前 44 个字节操作为它是 wav 标题)。
  • 然后,根据这个等式 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();
            }
        };  

【问题讨论】:

  • 转换为dBSPL - 我想你想先通过乘法转换为帕斯卡 - 也许通过lref。接下来,您需要将帕斯卡转换为 dBSPL,其中dBSPL = 20*log10(Pa/2e-5)。以任何 dB 单位绘制时域波形是非常不寻常的,也不是很有用。用 Pascals 绘制它可能会更好。
  • 另外,我对 lref 的 10e-12 号码有点怀疑。是你麦克风的灵敏度吗?
  • 嗨,jaket,谢谢你的回答,正如我在互联网上的几个资料中看到的那样,声压级 Lp=20log(Pa/2e-5) 等于声强级 Li= 10log(I/10e-12),在这种情况下,我使用第二个公式(因此,它的 Iref)。我真的不知道audioSamples 给了我什么,压力还是强度?以及如何将其转换为帕斯卡?我对此有点困惑
  • audioSamples 是瞬时值,表示转换器输入的满量程 (FFS) 的一小部分。转换成帕斯卡需要知道的是麦克风的灵敏度。换句话说,产生完整的音频样本需要多少帕斯卡。表征这一点的方法是在麦克风校准器连接到麦克风时测量 FFS 输入的 RMS 电平。校准器将产生 94dBSPL 的音调,因此您可以向后计算以确定 FFS 每帕斯卡的比例因子。麦克风的数据表也可能有它的规格。

标签: java android audio wav androidplot


【解决方案1】:

Isnt SPL standing for sound pressure level compared to the absolute reference?. So the microphone is plugged into a 16bit precision port I think its 好的。 SNR 应该在 60dB 左右,所以你有大约 44dB 的语音间隔。因此,当麦克风收到任何声音时,信号应该会上升(如果我记得是 16 位的话,大约 104dB)。

SPL=20log (Pascal/2e-5)

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2019-05-30
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多