Reading in a WAV file and calculating RMS(读取WAV文件并计算RMS)
问题描述
所以我正在尝试测试一些分析一些PCM数据量的代码。我得到了一些奇怪的音量测量数据,这与我从Audity获得的数据毫无意义。我的尺码好像到处都是。
我不确定我的错误是在读取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秒的时间步长,并对每个时间步长的音量进行平均。
这里是我计算均方根和分贝的地方
        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单声道录制的,并在Audacity中保存为WAV16签名的PCM。不确定我做错了什么。
任何帮助我们都将不胜感激!谢谢
编辑:发现我读错了wav数据。我通过添加末尾小字符顺序修复了它。然而,我仍然对如何计算体积感到困惑。数值更好了,但仍然很难破译,我不确定我的RMS使用什么单位,以及参考值应该使用什么单位。
推荐答案
您的计算中有一个错误--sumOfSamples = originalPcm[i]*originalPcm[i];应该是sumOfSamples += originalPcm[i]*originalPcm[i];,因此您将累加值。
至于参考值--为什么要用20?通常,您使用可能的最小值(在本例中为1),也可以使用最大值(SQRT(32768)),所有的值都将低于该值,因此您将得到负的dB值。
这篇关于读取WAV文件并计算RMS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:读取WAV文件并计算RMS
 
				
         
 
            
        基础教程推荐
- 从 python 访问 JVM 2022-01-01
- 验证是否调用了所有 getter 方法 2022-01-01
- 多个组件的复杂布局 2022-01-01
- 如何在 JFrame 中覆盖 windowsClosing 事件 2022-01-01
- Java Swing计时器未清除 2022-01-01
- 如何在 Spring @Value 注解中正确指定默认值? 2022-01-01
- 在 Java 中创建日期的正确方法是什么? 2022-01-01
- 大摇大摆的枚举 2022-01-01
- Java 实例变量在两个语句中声明和初始化 2022-01-01
- 不推荐使用 Api 注释的描述 2022-01-01
 
    	 
    	 
    	 
    	 
    	 
    	 
    	 
    	 
						 
						 
						 
						 
						 
				 
				 
				 
				