Að kanna Mediastreamer2 VoIP vélina. 4. hluti

Efni greinarinnar er tekið úr mínum zen rás.

Að búa til merkjastigsmæli

Í fortíðinni grein Við höfum skýrt rétta lokun á forritum með því að nota fjölmiðlastrauminn.

Í þessari grein munum við setja saman merkistigsmælirás og læra hvernig á að lesa mæliniðurstöðuna úr síunni. Við skulum meta mælingarnákvæmni.

Síusettið sem miðlunarstraumurinn býður upp á inniheldur síu, MS_VOLUME, sem er fær um að mæla RMS-stig merksins sem fer í gegnum það, draga úr merkinu og framkvæma margar gagnlegar og óvæntar aðgerðir. Við munum helga heila grein þessari síu síðar. En í bili munum við nota það sem mæli.

Við munum nota tóngjafa sem merkigjafa, merki sem þaðan verður sent í MS_VOLUME síuna, sem hljóðkortið er tengt við úttakið á.

Í þessu dæmi munum við nota rafallsíuna í aðeins öðruvísi ham - hún mun búa til einstóns merki fyrir okkur, þ.e. merki sem inniheldur aðeins eina sinusoidal sveiflu.

Til viðbótar við tíðni og amplitude, þurfum við að stilla tímann sem merkið verður til, það verður að vera nægjanlegt til að nægjanlegur fjöldi sýna fari í gegnum MS_VOLUME síuna til mælingar. Til að flytja stillingar í rafallinn er MSDtmfGenCustomTone uppbyggingin notuð:

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;

Til að ræsa rafallinn munum við nota MS_DTMF_GEN_PLAY_CUSTOM aðferðina.

Blokkmynd af merkjavinnslu:

Að kanna Mediastreamer2 VoIP vélina. 4. hluti

Forritskóðinn sem útfærir þetta kerfi er sýndur hér að neðan.

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

Við setjum saman dæmið okkar, alveg eins og við gerðum áður, aðeins með því að nota skráarnafnið mstest3. Við skulum keyra það og fá niðurstöðuna:

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

Eins og þú sérð féll mæliniðurstaðan saman við þriðja aukastaf og fræðilega gildið jafnt kvaðratrótinni af tveimur skipt í tvennt: sqr(2)/2=0,7071067811865475

Hlutfallslegt frávik niðurstöðunnar frá raungildi var 0.1%. Við metum mæliskekkjuna á hámarksmerkjastigi. Í samræmi við það, eftir því sem stigið lækkar, ætti skekkjan að aukast. Ég legg til að þú metir það sjálfur fyrir lágt merki.

Í næstu grein munum við setja saman hringrás sem skynjar nærveru tónmerkis af tiltekinni tíðni við inntakið með því að nota tónskynjara. Við munum einnig læra hvernig á að vinna úr atburðum sem myndast af síum.

Heimild: www.habr.com

Bæta við athugasemd