Estudamos o mecanismo VoIP do Mediastreamer2. Parte 4

Material do artigo retirado do meu canal zen .



Crie um medidor de nível de sinal


Em um artigo anterior , esclarecemos o término correto dos programas usando uma serpentina de mídia.


Neste artigo, montaremos o circuito de um medidor de nível de sinal e aprenderemos a ler o resultado da medição de um filtro. Estime a precisão da medição.


No conjunto de filtros fornecidos pelo streamer de mídia, existe um filtro, MS_VOLUME, que é capaz de medir o nível eficaz do sinal que passa por ele, atenuar o sinal e executar várias funções úteis e inesperadas. Abordaremos todo o artigo com esse filtro mais tarde. Mas agora vamos usá-lo como um medidor.


Como fonte de sinal, usaremos um gerador de tons, cujo sinal será enviado ao filtro MS_VOLUME, para a saída na qual uma placa de som está conectada.


Neste exemplo, usaremos o filtro do gerador em um modo ligeiramente diferente - ele gerará um sinal de tom único para nós, ou seja, um sinal contendo apenas uma oscilação sinusoidal.


, , , 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.


:


Gerador e medidor de sinal


, .


/*  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


O desvio relativo do resultado do valor verdadeiro foi de 0,1%. Fizemos uma estimativa do erro de medição no nível máximo do sinal. Assim, com uma diminuição no nível, o erro deve aumentar. Eu sugiro que você o avalie independentemente quanto a pequenos níveis de sinal.


No próximo artigo, montaremos um circuito que detecta a presença de uma determinada entrada de frequência na entrada de um tom usando um detector de tom. E também saiba como lidar com eventos gerados por filtros.


All Articles