Hulumtojmë motorin VoIP Mediastreamer2. Pjesa 4

Materiali i artikullit është marrë nga kanali im zen.

Krijojmë një matës të nivelit të sinjalit

Në të kaluarën artikullin ne sqaruam përfundimin e duhur të programeve që përdorin mediastreamer.

Në këtë artikull, do të krijojmë skemën e matësit të nivelit të sinjalit dhe do të mësojmë të lexojmë rezultatin e matjes nga filtri. Do të vlerësojmë saktësinë e matjes.

Në pakon e filtrave të ofruar nga mediastreamer gjendet filtri MS_VOLUME, i cili është i aftë të masë nivelin mesatar të sinjalit që kalon përmes tij, të dobësojë sinjalin dhe të kryejë shumë funksione të dobishme dhe të befason. Më vonë, do t’i kushtojmë një artikull të tërë këtij filtri. Por tani do ta përdorim atë si një matës.

Si burim të sinjalit do të përdorim një gjenerator tonik, sinjali i të cilit do të drejtohet te filtri MS_VOLUME, ndërlidhur me një kartë audio.

Në këtë shembull, filtri i gjeneratorit do ta përdorim në një mod të ndryshëm — do të gjenerojë për ne një sinjal monotonal, pra një sinjal që përmban vetëm një valë sinusoidale.

Përveç frekuencës dhe amplitudës, na nevojitet të përcaktojmë kohën gjatë së cilës do të gjenerohet sinjali, ajo duhet të jetë e mjaftueshme që përmes filtrit MS_VOLUME të kalojë një numër i mjaftueshëm matjesh. Për të dërguar konfigurimet në gjenerator, përdoret struktura MSDtmfGenCustomTone:

struct _MSDtmfGenCustomTone{
    char tone_name[8];     /* Emri tekstual i sinjalit nga 8 shkronja.*/
    int duration;          /* Kohëzgjatja e sinjalit në milisekonda.*/
    int frequencies[2];    /* Një çift frekuencash nga të cilat duhet të përbëhet sinjali i daljes. */
    float amplitude;       /* Amplituda e tonëve, 1.0 korrespondon me nivelin 0 dB nga miliwatti në ngarkesën 600 Ohm.*/
    int interval;          /* Pauza në milisekonda para fillimit të riprodhimit të përsëritur të sinjalit.*/
    int repeat_count;      /* Numri i përsëritjeve.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;

Për të aktivizuar gjeneratorin, do të përdorim metodën e tij MS_DTMF_GEN_PLAY_CUSTOM.

Skema strukturale e përpunimit të sinjalit:

Hulumtojmë motorin VoIP Mediastreamer2. Pjesa 4

Kodi i programit që zbaton këtë skemë është treguar më poshtë.

/* Файл 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);
}

Kompiliojmë shembullin tonë ashtu siç bëmë më parë, vetëm duke përdorur emrin e skedarit mstest3. E nisim për ekzekutim dhe marrim rezultatin:

Amplitudës së sinusit 1.000000 volt i korrespondon vlera mesatare 0.707733 volt.

Siç e shihni, rezultati i matjes përputhet deri në tre shifra pas presjes me vlerën teorike që është rrënja katrore e dy e ndarë me dy: sqr(2)/2=0,7071067811865475

Shkalla relative e devijimit të rezultatit nga vlera e vërtetë ishte 0.1%. Ne bëmë një vlerësim të gabimit të matjes në nivelin maksimal të sinjalit. Prandaj, kur ulni nivelin, gabimi duhet të rritet. Ju ftoj të bëni vetë një vlerësim të saj për nivele të ulëta sinjali.

Në artikullin tjetër do të krijojmë skemën që zbulon praninë e një sinjali tonik në hyrje me frekuencë të caktuar duke përdorur një detektor tonash. Po ashtu, do të mësojmë të përpunojmë ngjarjet që krijohen nga filtrat.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster