Kami mempelajari mesin VoIP Mediastreamer2. Bagian 4

Materi artikel diambil dari saluran zen saya .



Buat pengukur level sinyal


Dalam artikel sebelumnya , kami mengklarifikasi penghentian program yang benar menggunakan media streamer.


Pada artikel ini kita akan merakit rangkaian meteran level sinyal dan mempelajari cara membaca hasil pengukuran dari filter. Perkirakan keakuratan pengukuran.


Di set filter yang disediakan oleh streamer media ada filter, MS_VOLUME, yang mampu mengukur level rms dari sinyal yang melewatinya, melemahkan sinyal dan melakukan banyak fungsi yang berguna dan tidak terduga. Kami akan membahas seluruh artikel dengan filter ini nanti. Tapi sekarang kita akan menggunakannya sebagai meteran.


Kami akan menggunakan generator nada sebagai sumber sinyal, sinyal dari mana akan dikirim ke filter MS_VOLUME, ke output yang terhubung dengan kartu suara.


Dalam contoh ini, kita akan menggunakan filter generator dalam mode yang sedikit berbeda - itu akan menghasilkan sinyal nada tunggal untuk kita, yaitu sinyal yang hanya mengandung satu osilasi 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.


:


Generator dan Meter Sinyal


, .


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


Penyimpangan relatif dari hasil dari nilai sebenarnya adalah 0,1%. Kami membuat estimasi kesalahan pengukuran pada level sinyal maksimum. Dengan demikian, dengan penurunan level, kesalahan akan meningkat. Saya sarankan Anda mengevaluasinya secara independen untuk level sinyal kecil.


Pada artikel selanjutnya, kami akan merakit sirkuit yang mendeteksi keberadaan input frekuensi yang diberikan pada input nada menggunakan detektor nada. Dan juga belajar cara menangani acara yang dihasilkan oleh filter.


All Articles