Raziskovanje mehanizma VoIP Mediastreamer2. 4. del

Gradivo članka je vzeto iz mojega zen kanal.

Izdelava merilnika nivoja signala

V preteklosti članek Pojasnili smo pravilno prekinitev programov z uporabo medijskega pretakalnika.

V tem članku bomo sestavili vezje merilnika nivoja signala in se naučili brati rezultat meritve s filtra. Ocenimo natančnost meritev.

Nabor filtrov, ki jih zagotavlja medijski pretočni predvajalnik, vključuje filter MS_VOLUME, ki je sposoben izmeriti RMS raven signala, ki prehaja skozi njega, oslabiti signal in izvesti veliko uporabnih in nepričakovanih funkcij. Kasneje bomo temu filtru posvetili cel članek. Ampak za zdaj ga bomo uporabljali kot merilnik.

Kot vir signala bomo uporabili tonski generator, signal iz katerega bo poslan v filter MS_VOLUME, na izhod katerega je priključena zvočna kartica.

V tem primeru bomo filter generatorja uporabili v nekoliko drugačnem načinu - za nas bo ustvaril enotonski signal, tj. signal, ki vsebuje samo eno sinusno nihanje.

Poleg frekvence in amplitude bomo morali nastaviti čas, v katerem se bo signal generiral, ta mora biti zadosten, da gre skozi filter MS_VOLUME zadostno število vzorcev za merjenje. Za prenos nastavitev v generator se uporablja struktura 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;

Za zagon generatorja bomo uporabili njegovo metodo MS_DTMF_GEN_PLAY_CUSTOM.

Blok diagram obdelave signalov:

Raziskovanje mehanizma VoIP Mediastreamer2. 4. del

Programska koda, ki izvaja to shemo, je prikazana spodaj.

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

Naš primer prevedemo, tako kot prej, le z uporabo imena datoteke mstest3. Zaženimo ga in dobimo rezultat:

Амплитуде синуса 1.000000 вольт  соответствует среднеквадратическое значение 0.707733 вольт.

Kot lahko vidite, je rezultat meritve sovpadal na tretjo decimalno mesto s teoretično vrednostjo, ki je enaka kvadratnemu korenu iz dveh, deljeno na pol: sqr(2)/2=0,7071067811865475

Relativno odstopanje rezultata od prave vrednosti je bilo 0.1 %. Merilno napako smo ocenili pri najvišji ravni signala. V skladu s tem, ko se raven zmanjša, se mora napaka povečati. Predlagam, da sami ocenite nizke ravni signala.

V naslednjem članku bomo sestavili vezje, ki zazna prisotnost tonskega signala dane frekvence na vhodu s pomočjo detektorja tonov. Naučili se bomo tudi obdelave dogodkov, ki jih generirajo filtri.

Vir: www.habr.com

Dodaj komentar