Nous étudions le moteur VoIP Mediastreamer2. Partie 4

Article extrait de ma chaîne zen .



Créer un indicateur de niveau de signal


Dans un article précédent , nous avons clarifié la terminaison correcte des programmes à l'aide d'un streamer multimédia.


Dans cet article, nous allons assembler le circuit d'un indicateur de niveau de signal et apprendre à lire le résultat de la mesure à partir d'un filtre. Estimez la précision de la mesure.


Dans l'ensemble de filtres fournis par le streamer multimédia, il y a un filtre, MS_VOLUME, qui est capable de mesurer le niveau efficace du signal qui le traverse, d'atténuer le signal et d'effectuer de nombreuses fonctions utiles et inattendues. Nous couvrirons l'article entier avec ce filtre plus tard. Mais maintenant, nous allons l'utiliser comme compteur.


Nous utiliserons un générateur de sons comme source de signal, dont le signal sera envoyé au filtre MS_VOLUME, à la sortie duquel une carte son est connectée.


Dans cet exemple, nous utiliserons le filtre du générateur dans un mode légèrement différent - il générera pour nous un signal à ton unique, c'est-à-dire un signal ne contenant qu'une seule oscillation sinusoïdale.


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


:


Générateur de signaux et compteur


, .


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


L'écart relatif du résultat par rapport à la valeur réelle était de 0,1%. Nous avons fait une estimation de l'erreur de mesure au niveau du signal maximum. Par conséquent, avec une diminution du niveau, l'erreur devrait augmenter. Je vous suggère de l'évaluer indépendamment pour de petits niveaux de signal.


Dans l'article suivant, nous allons assembler un circuit qui détecte la présence d'une fréquence d'entrée donnée à l'entrée d'une tonalité à l'aide d'un détecteur de tonalité. Et apprenez également à gérer les événements générés par les filtres.


All Articles