Ferkenne de Mediastreamer2 VoIP-motor. Diel 4

It materiaal fan it artikel is nommen út myn zen kanaal.

It meitsjen fan in sinjaal nivo meter

Yn de lêste artikel Wy hawwe de juste beëiniging fan programma's dúdlik makke mei de mediastreamer.

Yn dit artikel sille wy in sirkwy fan 'e sinjaalnivometer gearstalle en learje hoe't jo it mjitresultaat fan it filter lêze. Litte wy de krektens fan 'e mjitting evaluearje.

De set fan filters levere troch de mediastreamer omfettet in filter, MS_VOLUME, dat by steat is om it RMS-nivo te mjitten fan it sinjaal dat der troch giet, it sinjaal attenuate en in protte nuttige en ûnferwachte funksjes útfiere. Wy sille letter in folslein artikel wije oan dit filter. Mar foar no sille wy it as meter brûke.

As sinjaalboarne sille wy in toangenerator brûke, wêrfan it sinjaal stjoerd wurdt nei it MS_VOLUME-filter, nei de útfier wêrfan de lûdkaart ferbûn is.

Yn dit foarbyld sille wy it generatorfilter brûke yn in wat oare modus - it sil in sinjaal mei ien toan generearje foar ús, d.w.s. in sinjaal dat mar ien sinusoïdale oscillaasje befettet.

Neist de frekwinsje en amplitude moatte wy de tiid ynstelle wêryn't it sinjaal sil wurde generearre; it moat genôch wêze dat in foldwaande oantal samples troch it MS_VOLUME-filter passe foar mjitting. Om ynstellings oer te bringen nei de generator, wurdt de MSDtmfGenCustomTone-struktuer brûkt:

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;

Om de generator te begjinnen, sille wy de metoade MS_DTMF_GEN_PLAY_CUSTOM brûke.

Blokdiagram fan sinjaalferwurking:

Ferkenne de Mediastreamer2 VoIP-motor. Diel 4

De programmakoade dy't dit skema ymplementearret wurdt hjirûnder werjûn.

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

Wy kompilearje ús foarbyld, krekt lykas wy earder diene, allinich mei de triemnamme mstest3. Litte wy it útfiere en it resultaat krije:

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

Sa't jo sjen kinne, foel it mjitresultaat oerien mei de tredde desimaal mei de teoretyske wearde gelyk oan de fjouwerkantswoartel fan twa ferdield yn de helte: sqr(2)/2=0,7071067811865475

De relative ôfwiking fan it resultaat fan 'e wiere wearde wie 0.1%. Wy beoardielje de mjitflater op it maksimale sinjaalnivo. Dêrtroch, as it nivo ôfnimt, moat de flater tanimme. Ik stel foar dat jo it sels evaluearje foar lege sinjaalnivo's.

Yn it folgjende artikel sille wy in sirkwy gearstalle dy't de oanwêzigens fan in toansignaal fan in bepaalde frekwinsje by de ynfier detektearret mei in toandetektor. Wy sille ek leare hoe't jo eveneminten kinne ferwurkje oanmakke troch filters.

Boarne: www.habr.com

Add a comment