نحن ندرس محرك Mediastreamer2 VoIP. الجزء 4

مادة المقالة مأخوذة من قناة zen الخاصة بي .



إنشاء مقياس مستوى الإشارة


في مقال سابق ، أوضحنا الإنهاء الصحيح للبرامج باستخدام مشغل وسائط.


في هذه المقالة سنقوم بتجميع دائرة مقياس مستوى الإشارة ونتعلم كيفية قراءة نتيجة القياس من مرشح. تقدير دقة القياس.


في مجموعة الفلاتر التي يوفرها دفق الوسائط ، يوجد فلتر 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