gpt4 book ai didi

java - 声级均方根

转载 作者:行者123 更新时间:2023-11-30 04:43:59 26 4
gpt4 key购买 nike

我找到了一些计算麦克风声级(RMS)的代码:

public int calculateRMSLevel(byte[] audioData) {
// audioData might be buffered data read from a data line
long lSum = 0;
for (int i = 0; i < audioData.length; i++) {
lSum = lSum + audioData[i];
}

double dAvg = lSum / audioData.length;

double sumMeanSquare = 0d;
for (int j = 0; j < audioData.length; j++) {
sumMeanSquare = sumMeanSquare + Math.pow(audioData[j] - dAvg, 2d);
}

double averageMeanSquare = sumMeanSquare / audioData.length;
return (int) (Math.pow(averageMeanSquare, 0.5d) + 0.5);
}

但它仅适用于以下音频格式:

private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;

int sampleSizeInBits = 8;

int channels = 1;

boolean signed = true;

boolean bigEndian = true;

return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
bigEndian);
}

如何扩展代码以便它可以使用不同的位数?如果我将位数更改为 16,当静音时,它会返回大约 50 的值,而对于 8 位,它会返回 1 或 2。另外,我想在图表上绘制声级,声级值与时间有何关系?

最佳答案

采样率并不重要,但位深度、字节序以及 channel 数(以不同的方式)很重要。

要了解原因,您必须简单地注意到所讨论的函数将字节数组作为参数并单独处理该数组中的每个值。字节数据类型是一个 8 位值。如果您想要使用 16 位值的东西,您需要使用不同的数据类型(短)或从字节转换为该数据类型。

一旦你这样做了,你仍然会得到16位和8位不同的值,因为范围不同:8位从-128到+127,16位从-32768到+32767,但它们都是测量相同的事物,这意味着它们将相同的实际值缩放为不同的表示值。

至于声级及其与时间的关系......这取决于您的采样率和进入该函数的数组的大小。例如,如果您的采样率为 8kHz,每个缓冲区有 2048 个样本,那么您的函数将被调用 8000/2048 或每秒大约 3.9 次,这意味着您的结果将以该速率(每 256 毫秒)传入。

关于java - 声级均方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540094/

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