Njelajah mesin Mediastreamer2 VoIP. Bagean 4

Materi artikel dijupuk saka sandi saluran zen.

Nggawe meter level sinyal

Ing pungkasan artikel Kita wis njlentrehake mandap program sing bener nggunakake streamer media.

Ing artikel iki, kita bakal ngumpulake sirkuit meter level sinyal lan sinau babagan maca asil pangukuran saka saringan. Kita bakal ngevaluasi akurasi pangukuran.

Ing set saringan sing diwenehake dening streamer media ana saringan, MS_VOLUME, sing bisa ngukur tingkat RMS saka sinyal sing ngliwati, nyuda sinyal lan nindakake akeh fungsi sing migunani lan ora dikarepake. Mengko kita bakal ngaturake kabeh artikel kanggo filter iki. Nanging saiki kita bakal nggunakake minangka meter.

Kita bakal nggunakake generator nada minangka sumber sinyal, sinyal sing bakal dikirim menyang saringan MS_VOLUME, menyang output sing nyambungake kertu swara.

Ing conto iki, kita bakal nggunakake filter generator ing mode rada beda - iku bakal generate sinyal siji-nada kanggo kita, IE sinyal ngemot mung siji osilasi sinusoidal.

Saliyane frekuensi lan amplitudo, kita kudu nyetel wektu nalika sinyal bakal diasilake; kudu cukup kanggo jumlah sampel sing cukup kanggo ngliwati saringan MS_VOLUME kanggo pangukuran. Struktur MSDtmfGenCustomTone digunakake kanggo nransfer setelan menyang generator:

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;

Kanggo miwiti generator, kita bakal nggunakake cara MS_DTMF_GEN_PLAY_CUSTOM sawijining.

Diagram struktural pangolahan sinyal:

Njelajah mesin Mediastreamer2 VoIP. Bagean 4

Kode program sing ngleksanakake skema iki kapacak ing ngisor iki.

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

Kita ngumpulake conto, kaya sadurunge, mung nggunakake jeneng file mstest3. Kita miwiti lan entuk asil:

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

Minangka sampeyan bisa ndeleng, asil pangukuran pas karo panggonan desimal katelu kanthi nilai teoretis sing padha karo akar kuadrat saka loro dibagi loro: sqr(2)/2=0,7071067811865475

Penyimpangan relatif saka asil saka nilai sing bener yaiku 0.1%. Kita ngira kesalahan pangukuran ing tingkat sinyal maksimal. Patut, kesalahan kudu nambah minangka tingkat sudo. Aku suggest sampeyan ngira dhewe kanggo tingkat sinyal kurang.

Ing artikel sabanjure kita bakal nglumpukake sirkuit sing ndeteksi anané sinyal nada saka frekuensi tartamtu ing input nggunakake detektor nada. Kita uga bakal sinau carane ngolah acara sing digawe dening saringan.

Source: www.habr.com

Tuku hosting sing dipercaya kanggo situs kanthi proteksi DDoS, server VPS VDS 🔥 Tuku hosting situs web sing bisa dipercaya nganggo proteksi DDoS, server VPS VDS | ProHoster