【问题标题】:Detect audio peak using gstreamer plugin使用 gstreamer 插件检测音频峰值
【发布时间】:2014-05-29 20:55:52
【问题描述】:

我正在用 C 语言开发一个使用 gstreamer-1.0 检测音频峰值的插件。我对音频编程一无所知,到目前为止,我的插件只能检测声音冲动(如果没有音频,则什么都不会发生,如果有声音,我会打印能量)。

这是我的(非常简单的)算法的示例代码。

gfloat energy_of_sample(guint8 array[], int num_elements, gfloat *p)
{
    gfloat energy=0.f;
    for(int i=0 ; i<num_elements ; i++)
    {
        energy += array[i]*array[i]/4096;
        if (*p < (array[i]*array[i]/4096)) *p = array[i]*array[i]/4096;
    }
    return energy/num_elements;
}

static void
audio_process(GstBPMdetect *filter, GstBuffer *music)
{

    GstMapInfo info;
    gint threshold = 6;


// gets the information of the buffer and put it in "info"
    gst_buffer_map (music, &info, GST_MAP_READ);

// calculate the average of the buffer data
    gfloat energy = 0;
    gfloat peak = 0;
    energy = energy_of_sample(info.data, info.size, &peak);
    if (energy >= threshold )g_print("energy : %f , peak : %f \n", energy,peak);
}

例如,如果音频源只是简单的拍手或底鼓,我的插件可以很好地检测到音频峰值。但是当音频源是一首歌曲时,我的插件会不断检测声音冲动(总是超过阈值)。

我针对该问题的解决方案是添加一个低通滤波器,以便仅检测到低音。通过这样做,我将歌曲的每个部分都剪掉,只包含高频,这不是我想要的(不适用于高频节拍)。

所以我的问题是:有没有人知道如何在不削减高频的情况下检测节拍(音频冲击)?坦克给大家,希望我的问题很清楚!

【问题讨论】:

    标签: c audio plugins gstreamer


    【解决方案1】:

    您应该测量能量而不是峰值。有一种很好的方法来计算能量。使用统计中的方差公式。您需要在 20 - 50 毫秒的间隔内对所有点进行总和平方和的计数。使用方差公式,您可以获得能量。公式在这里 http://staff.icdi.wvu.edu/djhstats/variance1.JPG

    作为替代方案,您可以使用一组好的插件中现有的插件级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      相关资源
      最近更新 更多