Истраживање Медиастреамер2 ВоИП механизма. Део 4

Материјал чланка је преузет са мог зен канал.

Креирање мерача нивоа сигнала

У последњих Чланак Појаснили смо исправан прекид програма помоћу медијског стримера.

У овом чланку ћемо саставити коло мерача нивоа сигнала и научити како да очитамо резултат мерења из филтера. Хајде да проценимо тачност мерења.

Скуп филтера који пружа медиа стреамер укључује филтер, МС_ВОЛУМЕ, који је способан да измери РМС ниво сигнала који пролази кроз њега, пригуши сигнал и изврши много корисних и неочекиваних функција. Касније ћемо овом филтеру посветити цео чланак. Али за сада ћемо га користити као мерач.

Као извор сигнала користићемо генератор тона, сигнал из којег ће бити послат филтеру МС_ВОЛУМЕ, на чији је излаз повезана звучна картица.

У овом примеру користићемо филтер генератора у мало другачијем режиму – он ће за нас генерисати једнотонски сигнал, тј. сигнал који садржи само једну синусну осцилацију.

Поред фреквенције и амплитуде, мораћемо да подесимо време током којег ће се сигнал генерисати; оно мора бити довољно да довољан број узорака прође кроз филтер МС_ВОЛУМЕ за мерење. За пренос подешавања у генератор користи се структура МСДтмфГенЦустомТоне:

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;

Да бисмо покренули генератор, користићемо његов МС_ДТМФ_ГЕН_ПЛАИ_ЦУСТОМ метод.

Блок дијаграм обраде сигнала:

Истраживање Медиастреамер2 ВоИП механизма. Део 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);
}

Ми компајлирамо наш пример, баш као и раније, само користећи име датотеке мстест3. Хајде да га покренемо и добијемо резултат:

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

Као што видите, резултат мерења се поклопио на трећу децималу са теоријском вредношћу једнаком квадратном корену из два подељеном на пола: скр(2)/2=0,7071067811865475

Релативно одступање резултата од праве вредности износило је 0.1%. Грешку мерења смо проценили на максималном нивоу сигнала. Сходно томе, како се ниво смањује, грешка би требало да се повећа. Предлажем да сами процените низак ниво сигнала.

У следећем чланку ћемо саставити коло које детектује присуство тонског сигнала дате фреквенције на улазу помоћу детектора тона. Такође ћемо научити како да обрађујемо догађаје генерисане филтерима.

Извор: ввв.хабр.цом

Додај коментар