我们研究了Mediastreamer2 VoIP引擎。第4部分

文章资料取自我的禅宗频道



创建一个信号电平表


在上一篇文章中,我们阐明了使用媒体流媒体的程序的正确终止。


在本文中,我们将组装信号电平计的电路,并学习如何从滤波器读取测量结果。估计测量的准确性。


在媒体流提供的一组滤波器中,有一个MS_VOLUME滤波器,它能够测量通过它的信号的均方根电平,衰减信号并执行许多有用和意外的功能。稍后,我们将使用此过滤器介绍整篇文章。但是现在我们将其用作仪表。


我们将使用音调发生器作为信号源,信号源将从信号发生器发送到MS_VOLUME滤波器,并与声卡的输出连接。


在此示例中,我们将以略有不同的模式使用生成器滤波器-它将为我们生成单音信号,即 仅包含一个正弦波振荡的信号。


, , , MS_VOLUME . MSDtmfGenCustomTone:


struct _MSDtmfGenCustomTone{
    char tone_name[8];     /*     8 .*/
    int duration;          /*    .*/
    int frequencies[2];    /*        . */
    float amplitude;       /*  , 1.0   0      600 .*/
    int interval;          /*        .*/
    int repeat_count;      /*  .*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;

, MS_DTMF_GEN_PLAY_CUSTOM.


:


信号发生器和仪表


, .


/*  mstest3.c */

#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>

int main()
{
    ms_init();
    /*   . */
    MSFilter  *voidsource=ms_filter_new(MS_VOID_SOURCE_ID);
    MSFilter  *dtmfgen=ms_filter_new(MS_DTMF_GEN_ID);
    MSFilter  *volume=ms_filter_new(MS_VOLUME_ID);
    MSSndCard *card_playback=ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter  *snd_card_write=ms_snd_card_create_writer(card_playback);

    /*  . */
    MSTicker *ticker=ms_ticker_new();

    /*    . */
    ms_filter_link(voidsource, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, volume, 0);
    ms_filter_link(volume, 0, snd_card_write, 0);

    /*   . */
    ms_ticker_attach(ticker,voidsource);

    MSDtmfGenCustomTone dtmf_cfg;

   /*    ,   ,     
       ,    . */
    strncpy(dtmf_cfg.tone_name, "busy", sizeof(dtmf_cfg.tone_name));
    dtmf_cfg.duration=1000;
    dtmf_cfg.frequencies[0]=440; /*    ,      0.*/
    dtmf_cfg.frequencies[1]=0;
    dtmf_cfg.amplitude=1.0; /*        0.707.*/
    dtmf_cfg.interval=0.;
    dtmf_cfg.repeat_count=0.;

   /*   . */
   ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM, (void*)&dtmf_cfg);

   /* ,   ,    . */
   ms_usleep(500000);

   /*   . */
  float level=0;
   ms_filter_call_method(volume, MS_VOLUME_GET_LINEAR,&level);
   printf("  %f      %f .\n", dtmf_cfg.amplitude, level);
}

, , mstest3. :


  1.000000      0.707733 .

, : sqr(2)/2=0,7071067811865475


结果与真实值的相对偏差为0.1%。我们估算了最大信号电平下的测量误差。因此,随着水平的降低,误差应该增加。我建议您对小信号电平进行独立评估。


在下一篇文章中,我们将组装一个电路,该电路使用音调检测器来检测音调输入处是否存在给定的频率输入。并且还将学习如何处理过滤器生成的事件。


All Articles