Estudiamos el motor VoIP Mediastreamer2. Parte 4

Material del artículo tomado de mi canal zen .



Crear un medidor de nivel de señal


En un artículo anterior , aclaramos la terminación correcta de los programas utilizando un transmisor de medios.


En este artículo ensamblaremos el circuito de un medidor de nivel de señal y aprenderemos a leer el resultado de la medición de un filtro. Estime la precisión de la medición.


En el conjunto de filtros proporcionados por el transmisor de medios hay un filtro, MS_VOLUME, que puede medir el nivel eficaz de la señal que lo atraviesa, atenúa la señal y realiza muchas funciones útiles e inesperadas. Cubriremos todo el artículo con este filtro más adelante. Pero ahora lo usaremos como medidor.


Utilizaremos un generador de tonos como fuente de señal, cuya señal se enviará al filtro MS_VOLUME, a la salida de la cual está conectada una tarjeta de sonido.


En este ejemplo, usaremos el filtro generador en un modo ligeramente diferente: generará una señal de tono único para nosotros, es decir, Una señal que contiene una sola oscilación 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.


:


Generador de señal y medidor


, .


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


La desviación relativa del resultado del valor verdadero fue 0.1%. Hicimos una estimación del error de medición en el nivel de señal máximo. En consecuencia, con una disminución en el nivel, el error debería aumentar. Le sugiero que lo evalúe independientemente para niveles de señal pequeños.


En el siguiente artículo, ensamblaremos un circuito que detecta la presencia de una entrada de frecuencia dada en la entrada de un tono utilizando un detector de tono. Y también aprenda a manejar eventos generados por filtros.


All Articles