【发布时间】:2015-09-26 00:12:28
【问题描述】:
我正在尝试获取传入音频样本的 dB 级别。在每个视频帧上,我都会更新 dB 级别并绘制一个代表 0 - 100% 值的条形(0% 是任意值,例如 -20.0dB,100% 是 0dB。)
gdouble sum, rms;
sum = 0.0;
guint16 *data_16 = (guint16 *)amap.data;
for (gint i = 0; i < amap.size; i = i + 2)
{
gdouble sample = ((guint16)data_16[i]) / 32768.0;
sum += (sample * sample);
}
rms = sqrt(sum / (amap.size / 2));
dB = 10 * log10(rms);
这是从here 标记为答案的代码示例改编为 C 的。我想知道这个非常简单的方程式中缺少什么。
已回答:夹克关于丢失标志的代码是正确的,所以一切最终都是肯定的。代码10 * log(rms) 也不正确。它应该是20 * log(rms),因为我正在将幅度转换为分贝(作为输出功率的度量)。
【问题讨论】:
-
因为我是个白痴,所以我忘了描述到底是什么问题。从这个等式返回的 dB 值始终介于 +1 到 +5 之间,即使对于非常安静的音频也是如此。
-
代码看起来是正确的,所以问题很微妙。由于 dB 是正数,这意味着 rms 大于 1。可能总和太大,这将暗示转换为
gdouble -
你不能使用关卡元素或者至少是其中的数学吗?
-
我可以请我从流中读取代码
标签: audio gstreamer volume decibel