Wir untersuchen die Mediastreamer2 VoIP-Engine. Teil 4

Artikelmaterial aus meinem Zen-Kanal .



Erstellen Sie einen Signalpegelmesser


In einem früheren Artikel haben wir die korrekte Beendigung von Programmen mit einem Media-Streamer erläutert.


In diesem Artikel werden wir die Schaltung eines Signalpegelmessers zusammenbauen und lernen, wie das Messergebnis von einem Filter abgelesen wird. Schätzen Sie die Genauigkeit der Messung.


In dem vom Medien-Streamer bereitgestellten Filtersatz befindet sich ein Filter, MS_VOLUME, der in der Lage ist, den Effektivwert des durch ihn hindurchtretenden Signals zu messen, das Signal zu dämpfen und viele nützliche und unerwartete Funktionen auszuführen. Wir werden den gesamten Artikel später mit diesem Filter behandeln. Aber jetzt werden wir es als Meter verwenden.


Wir werden einen Tongenerator als Signalquelle verwenden, dessen Signal an den Filter MS_VOLUME gesendet wird, an dessen Ausgang eine Soundkarte angeschlossen ist.


In diesem Beispiel verwenden wir das Generatorfilter in einem etwas anderen Modus - es erzeugt ein Einzeltonsignal für uns, d. H. ein Signal, das nur eine sinusförmige Schwingung enthält.


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


:


Signalgenerator und Messgerät


, .


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


Die relative Abweichung des Ergebnisses vom wahren Wert betrug 0,1%. Wir haben den Messfehler bei maximalem Signalpegel geschätzt. Dementsprechend sollte der Fehler mit einer Abnahme des Pegels zunehmen. Ich schlage vor, Sie bewerten es unabhängig für kleine Signalpegel.


Im nächsten Artikel werden wir eine Schaltung zusammenstellen, die das Vorhandensein eines bestimmten Frequenzeingangs am Eingang eines Tons mithilfe eines Tondetektors erkennt. Außerdem erfahren Sie, wie Sie mit von Filtern generierten Ereignissen umgehen.


All Articles