Archwilio peiriant VoIP Mediastreamer2. Rhan 4

Mae deunydd yr erthygl yn cael ei gymryd o fy sianel zen.

Creu mesurydd lefel signal

Yn yr olaf Erthygl Rydym wedi egluro terfynu rhaglenni'n gywir gan ddefnyddio'r ffrwdiwr cyfryngau.

Yn yr erthygl hon byddwn yn cydosod cylched mesurydd lefel signal ac yn dysgu sut i ddarllen canlyniad mesur yr hidlydd. Gadewch i ni werthuso cywirdeb mesur.

Mae'r set o hidlwyr a ddarperir gan y streamer cyfryngau yn cynnwys hidlydd, MS_VOLUME, sy'n gallu mesur lefel RMS y signal sy'n mynd trwyddo, gwanhau'r signal a chyflawni llawer o swyddogaethau defnyddiol ac annisgwyl. Byddwn yn neilltuo erthygl gyfan i'r hidlydd hwn yn ddiweddarach. Ond am y tro byddwn yn ei ddefnyddio fel mesurydd.

Byddwn yn defnyddio generadur tôn fel ffynhonnell signal, a bydd y signal yn cael ei anfon i'r hidlydd MS_VOLUME, y mae'r cerdyn sain wedi'i gysylltu ag allbwn ohono.

Yn yr enghraifft hon, byddwn yn defnyddio hidlydd y generadur mewn modd ychydig yn wahanol - bydd yn cynhyrchu signal un tôn i ni, h.y. signal sy'n cynnwys un osgiliad sinwsoidaidd yn unig.

Yn ogystal â'r amledd a'r osgled, bydd angen i ni osod yr amser y bydd y signal yn cael ei gynhyrchu; rhaid iddo fod yn ddigonol fel bod nifer ddigonol o samplau yn mynd trwy'r hidlydd MS_VOLUME i'w fesur. I drosglwyddo gosodiadau i'r generadur, defnyddir strwythur 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;

I gychwyn y generadur, byddwn yn defnyddio ei ddull MS_DTMF_GEN_PLAY_CUSTOM.

Diagram bloc o brosesu signal:

Archwilio peiriant VoIP Mediastreamer2. Rhan 4

Dangosir cod y rhaglen sy'n rhoi'r cynllun hwn ar waith isod.

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

Rydym yn llunio ein hesiampl, yn union fel y gwnaethom o'r blaen, gan ddefnyddio enw'r ffeil yn unig mstest3. Gadewch i ni ei redeg a chael y canlyniad:

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

Fel y gwelwch, roedd canlyniad y mesuriad yn cyd-daro â'r trydydd lle degol gyda'r gwerth damcaniaethol yn hafal i ail isradd dau wedi'i rannu'n hanner: sqr(2)/2=0,7071067811865475

Gwyriad cymharol y canlyniad o'r gwir werth oedd 0.1%. Fe wnaethom asesu'r gwall mesur ar lefel uchaf y signal. Yn unol â hynny, wrth i'r lefel ostwng, dylai'r gwall gynyddu. Rwy'n awgrymu eich bod chi'n ei werthuso'ch hun ar gyfer lefelau signal isel.

Yn yr erthygl nesaf byddwn yn cydosod cylched sy'n canfod presenoldeb signal tôn o amledd penodol yn y mewnbwn gan ddefnyddio synhwyrydd tôn. Byddwn hefyd yn dysgu sut i brosesu digwyddiadau a gynhyrchir gan hidlwyr.

Ffynhonnell: hab.com

Ychwanegu sylw