Я пытаюсь получить уровень входных аудиоданных уровня дБ. На каждом видеокадра, я обновить уровень дБ и рисуем бар, представляющий 0 - значение 100% (0% нечто произвольное такое как -20.0dB а 100% 0 дБ.)gstreamer читать децибел из буфера
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);
Это была адаптирована к C из образца кода, помеченного как ответ, от here. Мне интересно, что мне не хватает из этого простого уравнения.
ответил (а): Куртка была верна в отношении кода, теряющего знак, поэтому все положилось. Также неверен код 10 * log(rms)
. Он должен быть 20 * log(rms)
, так как я преобразую амплитуду в децибелы (в качестве меры выходной мощности).
Поскольку я идиот, я забыл описать, в чем проблема. Значение дБ, возвращаемое из этого уравнения, всегда находится где угодно от +1 до +5, даже для очень тихого звука. –
Код выглядит правильно, поэтому проблема в чем-то тонкая. Поскольку dB положителен, значит, rms выходит больше 1. Возможно, сумма слишком велика, что приведет к конверсии в 'gdouble' – jaket
Не можете ли вы использовать элемент уровня или, по крайней мере, математику? – ensonic