Mediastreamer2 VoIP кыймылдаткычын изилдөө. 4-бөлүк

Макаланын материалы менин zen каналы.

Сигналдын деңгээлин өлчөгүчтү түзүү

Акырында макала Биз медиа стримерди колдонуу менен программаларды туура токтотууну тактадык.

Бул макалада биз сигнал деңгээлин өлчөгүч схемасын чогултуп, чыпкадан өлчөө натыйжасын кантип окууну үйрөнөбүз. Келгиле, өлчөө тактыгына баа берели.

Медиа стримерлер тарабынан берилген чыпкалардын жыйындысы өзүнөн өткөн сигналдын RMS деңгээлин өлчөөгө, сигналды басаңдатууга жана көптөгөн пайдалуу жана күтүлбөгөн функцияларды аткарууга жөндөмдүү MS_VOLUME чыпкасын камтыйт. Бул чыпкага кийинчерээк бүт макаланы арнайбыз. Бирок азырынча эсептегич катары колдонобуз.

Сигнал булагы катары тон генераторун колдонобуз, анын сигналы 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%ды түздү. Биз максималдуу сигнал деңгээлинде өлчөө катасын бааладык. Ошого жараша деңгээл төмөндөгөн сайын ката да көбөйүшү керек. Сигналдын төмөн деңгээли үчүн аны өзүңүз баалоону сунуштайм.

Кийинки макалада биз тон детекторунун жардамы менен киргизүүдө берилген жыштыктагы тондук сигналдын бар экендигин аныктаган схеманы чогултабыз. Биз ошондой эле чыпкалар тарабынан түзүлгөн окуяларды кантип иштетүүнү үйрөнөбүз.

Source: www.habr.com

Комментарий кошуу