作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了一些计算麦克风声级(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/
我是一名优秀的程序员,十分优秀!