读入 WAV 文件并计算 RMS

Posted

技术标签:

【中文标题】读入 WAV 文件并计算 RMS【英文标题】:Reading in a WAV file and calculating RMS 【发布时间】:2019-03-22 17:55:50 【问题描述】:

所以我正在尝试测试一些分析某些 PCM 数据量的代码。我得到了一些奇怪的体积测量结果,这些测量结果对我从 Audacity 获得的数据没有意义。看来我的测量结果到处都是。

我不确定我的错误是在我读取 WAV 数据的方式上,还是在我计算音量的方式上。

这里是我以字节形式读取数据并转换为短裤的地方,因为它是 PCM 16 位。

        InputStream pcmStream = this.getClass().getClassLoader().getResourceAsStream("Test-16Bit-PCM.wav");
        ArrayList<Byte> bytes = new ArrayList<>();
        int b = pcmStream.read();
        while(b != -1)
        
            bytes.add((byte)b);
            b = pcmStream.read();
       

       // First 44 bytes of WAV file are file info, we already know PCM properties since we recorded test audio
        byte [] bytesArray = new byte[bytes.size()-44];
        for(int i = 44; i < bytes.size(); i++)
        
            bytesArray[i-44] = bytes.get(i);
        
        bytes = null;
        pcmStream = null;
        short [] pcm = new short[bytesArray.length/2];
        ByteBuffer bb = ByteBuffer.wrap(bytesArray).asShortBuffer().get(pcm);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.asShortBuffer().get(pcm);
        bytesArray = null;

然后将 short [] 直接传递给我的分析器,然后我将数据拆分为 0.1 秒的时间步长,并对每个时间步长的音量进行平均。

这是我计算 RMS 和 dB 的地方

        double sumOfSamples = 0;
        double numOfSamples = settings.shortsPerTimeStep();
        for(int i = start; i < start+settings.shortsPerTimeStep(); i++)
        
           sumOfSamples = originalPcm[i]*originalPcm[i];
        
        double rms = Math.sqrt(sumOfSamples/numOfSamples);
        // Convert to decibels
        calculatedVolume = 20*Math.log10(rms/20);

我正在阅读的音频是在 44100 MONO 录制的,并大胆保存为 WAV 16 Signed PCM。不知道我做错了什么。

任何帮助将不胜感激!谢谢

编辑:发现我读错了 WAV 数据。我通过添加 end little endianess 来修复它。但是我仍然对如何计算音量感到困惑。这些值更好,但仍然难以破译,我不确定我的 RMS 是什么单位,以及参考值应该是什么单位。

【问题讨论】:

【参考方案1】:

您的计算中有错误 - sumOfSamples = originalPcm[i]*originalPcm[i]; 应该是 sumOfSamples += originalPcm[i]*originalPcm[i];,因此您将累积这些值。 至于参考值——你为什么用20?通常您使用可能的最低值(在这种情况下为 1),或者您可以使用最大值(即 sqrt(32768)),并且您的所有值都将低于该值,因此您将获得负 dB 值.

【讨论】:

以上是关于读入 WAV 文件并计算 RMS的主要内容,如果未能解决你的问题,请参考以下文章

构造一个 wav 文件并使用 scipy 将其写入磁盘

使用python过滤wav文件

NAudio 拆分 wav 文件问题。其他所有音频文件声音失真,而其他音频文件清晰

在 C++ 中连接 .wav 文件

使用 NAudio 将 WAV 文件转换为 2 个单独的 PCM 文件

使用 C 绕过声音/音频文件 (WAV)