Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 4

Материали макола аз ман гирифта шудааст канали zen.

Эҷоди як ҳисобкунаки сатҳи сигнал

Дар охир мақола Мо қатъи дурусти барномаҳоро бо истифода аз стримери медиа равшан кардем.

Дар ин мақола мо як схемаи ҳисобкунаки сатҳи сигналро ҷамъ мекунем ва чӣ гуна хондани натиҷаи андозагириро аз филтр меомӯзем. Биёед дурустии ченкуниро баҳо диҳем.

Маҷмӯи филтрҳое, ки стримери медиа пешниҳод кардааст, филтри MS_VOLUME-ро дар бар мегирад, ки қодир аст сатҳи RMS-и сигнали аз он гузаштаро чен кунад, сигналро суст кунад ва бисёр вазифаҳои муфид ва ғайричашмдоштро иҷро кунад. Мо як мақолаи пурраро ба ин филтр баъдтар мебахшем. Аммо ҳоло мо онро ҳамчун ҳисобкунак истифода хоҳем кард.

Мо генератори оҳангро ҳамчун манбаи сигнал истифода мебарем, ки сигнал аз он ба филтри 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-ро истифода мебарем.

Диаграммаи блоки коркарди сигнал:

Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 4

Рамзи барномае, ки ин схемаро амалӣ мекунад, дар зер нишон дода шудааст.

/* Файл 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 фоизро ташкил дод. Мо хатогии андозагириро дар сатҳи максималии сигнал арзёбӣ кардем. Мувофиқи он, вақте ки сатҳ паст мешавад, хато бояд афзоиш ёбад. Ман тавсия медиҳам, ки шумо онро худатон барои сатҳи пасти сигнал арзёбӣ кунед.

Дар мақолаи навбатӣ мо схемаеро ҷамъ меорем, ки мавҷудияти сигнали оҳангии басомади додашударо дар вуруд бо истифода аз детектори оҳанг муайян мекунад. Мо инчунин тарзи коркарди рӯйдодҳои тавассути филтрҳо тавлидшударо меомӯзем.

Манбаъ: will.com

Илова Эзоҳ