हम Mediastreamer2 वीओआईपी इंजन का अध्ययन करते हैं। भाग ४

मेरे ज़ेन चैनल से लिया गया लेख सामग्री



सिग्नल स्तर मीटर बनाएं


पिछले लेख में, हमने मीडिया स्ट्रीमर का उपयोग करके कार्यक्रमों की सही समाप्ति को स्पष्ट किया।


इस लेख में हम एक सिग्नल स्तर मीटर के सर्किट को इकट्ठा करेंगे और एक फिल्टर से माप परिणाम को पढ़ना सीखेंगे। माप की सटीकता का अनुमान लगाएं।


मीडिया स्ट्रीमर द्वारा प्रदान किए गए फिल्टर के सेट में एक फिल्टर, MS_VOLUME है, जो इसके माध्यम से गुजरने वाले सिग्नल के आरएम स्तर को मापने में सक्षम है, सिग्नल को अटेंड करता है और बहुत सारे उपयोगी और अनपेक्षित कार्य करता है। हम बाद में इस फ़िल्टर के साथ पूरे लेख को कवर करेंगे। लेकिन अब हम इसे मीटर की तरह इस्तेमाल करेंगे।


एक सिग्नल स्रोत के रूप में हम एक टोन जनरेटर का उपयोग करेंगे, जिसमें से सिग्नल MS_VOLUME फ़िल्टर को भेजा जाएगा, जिसके आउटपुट में एक साउंड कार्ड जुड़ा हुआ है।


इस उदाहरण में, हम जनरेटर फ़िल्टर का उपयोग कुछ अलग मोड में करेंगे - यह हमारे लिए एकल-टोन सिग्नल उत्पन्न करेगा, अर्थात। एक संकेत जिसमें केवल एक साइनसोइडल दोलन है।


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


:


सिग्नल जेनरेटर और मीटर


, .


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


वास्तविक मूल्य से परिणाम का सापेक्ष विचलन 0.1% था। हमने अधिकतम सिग्नल स्तर पर माप त्रुटि का अनुमान लगाया। तदनुसार, स्तर में कमी के साथ, त्रुटि बढ़नी चाहिए। मेरा सुझाव है कि आप स्वतंत्र रूप से छोटे सिग्नल स्तरों के लिए इसका मूल्यांकन करें।


अगले लेख में, हम एक सर्किट को इकट्ठा करेंगे जो एक टोन डिटेक्टर के उपयोग से एक टोन के इनपुट पर दिए गए आवृत्ति इनपुट की उपस्थिति का पता लगाता है। और फिल्टर द्वारा उत्पन्न घटनाओं को संभालना भी सीखें।


All Articles