Mediastreamer2 VoIP-mootori uurimine. 4. osa

Artikli materjal on võetud minu zen kanal.

Signaalitaseme mõõtja loomine

Viimases siit Meediumivoodri abil oleme selgitanud programmide õiget lõpetamist.

Selles artiklis paneme kokku signaalitaseme mõõturi vooluringi ja õpime, kuidas filtrist mõõtmistulemust lugeda. Hindame mõõtmise täpsust.

Meedia voogedastusseadme filtrite komplekt sisaldab filtrit MS_VOLUME, mis on võimeline mõõtma seda läbiva signaali RMS taset, summutama signaali ning täitma palju kasulikke ja ootamatuid funktsioone. Hiljem pühendame sellele filtrile terve artikli. Aga praegu kasutame seda arvestina.

Signaaliallikana kasutame toonigeneraatorit, mille signaal saadetakse filtrisse MS_VOLUME, mille väljundisse on ühendatud helikaart.

Antud näites kasutame generaatori filtrit veidi teises režiimis – see genereerib meile ühetoonilise signaali, s.t. signaal, mis sisaldab ainult ühte sinusoidaalset võnkumist.

Lisaks sagedusele ja amplituudile peame määrama aja, mille jooksul signaal genereeritakse; see peab olema piisav, et mõõtmiseks läbiks MS_VOLUME filtri piisav arv näidiseid. Seadete ülekandmiseks generaatorisse kasutatakse MSDtmfGenCustomTone struktuuri:

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;

Generaatori käivitamiseks kasutame selle meetodit MS_DTMF_GEN_PLAY_CUSTOM.

Signaalitöötluse plokkskeem:

Mediastreamer2 VoIP-mootori uurimine. 4. osa

Programmikood, mis seda skeemi rakendab, on näidatud allpool.

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

Koostame oma näite, nagu varemgi, kasutades ainult failinime mstest3. Käivitame selle ja saame tulemuse:

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

Nagu näete, langes mõõtmistulemus kolmanda kümnendkoha täpsusega kokku teoreetilise väärtusega, mis on võrdne ruutjuurega kahest jagatud pooleks: sqr(2)/2=0,7071067811865475

Tulemuse suhteline hälve tegelikust väärtusest oli 0.1%. Hindasime mõõtmisviga maksimaalse signaalitaseme juures. Seega, kui tase väheneb, peaks viga suurenema. Soovitan teil seda ise madala signaalitaseme jaoks hinnata.

Järgmises artiklis paneme kokku vooluringi, mis tuvastab toonidetektori abil antud sagedusega toonsignaali olemasolu sisendis. Samuti õpime, kuidas töödelda filtrite genereeritud sündmusi.

Allikas: www.habr.com

Lisa kommentaar