gpt4 book ai didi

c# - 计算分贝

转载 作者:IT王子 更新时间:2023-10-29 04:29:55 25 4
gpt4 key购买 nike

我正在使用 XNA 库录制麦克风输入(我不认为这真的是特定于技术的,但它从来没有坏处)。每次我得到一个样本,我都想计算分贝。我在互联网上做了很多搜索,但没有找到一个可靠的例子......

这是我尝试从样本中计算分贝的尝试:

        double peak = 0;

for (var i = 0; i < _buffer.Length; i = i + 2)
{
var sample = BitConverter.ToInt16(_buffer, i);
if (sample > peak)
peak = sample;
else if (sample < -peak)
peak = -sample;
}

var decibel = (20 * Math.Log10(peak/32768));

如果我将分贝值输出到屏幕上,我可以看到分贝值随着我声音的增大而变大,而随着我说话的声音变小而变小。但是,当我绝对安静时,它总是徘徊在 -40 左右......我认为它会是 -90。我必须在上面的 block 中计算错误?从我在某些网站上读到的内容来看,-40 相当于“轻声说话”……但是,它完全安静。

此外,如果我将麦克风静音,它会直接变为 -90。

我做错了吗?

最佳答案

测量声音信号的电平时,应根据 RMS 值计算 dB。在您的样本中,您正在查看绝对峰值水平。单个(峰值)样本值决定了您的 dB 值,即使所有其他样本都恰好为 0。

试试这个:

double sum = 0;
for (var i = 0; i < _buffer.length; i = i + 2)
{
double sample = BitConverter.ToInt16(_buffer, i) / 32768.0;
sum += (sample * sample);
}
double rms = Math.Sqrt(sum / (_buffer.length / 2));
var decibel = 20 * Math.Log10(rms);

对于“瞬时”dB 电平,您通常会在 20-50 毫秒的一段上计算 RMS。请注意,计算出的 dB 值是相对于满量程的。对于声音,dB 值应与 20 uPa 相关,您需要校准信号以找到从数字值到压力值的正确转换。

关于c# - 计算分贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4152201/

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