Ngajalajah mesin Mediastreamer2 VoIP. Bagian 4

Materi artikel dicokot ti abdi saluran zen.

Nyiptakeun méter tingkat sinyal

Di tempo anu kalangkung artikel Kami parantos netelakeun panyabutan program anu leres nganggo streamer média.

Dina tulisan ieu urang bakal ngumpul sirkuit meteran tingkat sinyal sareng diajar kumaha cara maca hasil pangukuran tina saringan. Hayu urang evaluate akurasi pangukuran.

Susunan saringan anu disayogikeun ku streamer média kalebet saringan, MS_VOLUME, anu sanggup ngukur tingkat RMS tina sinyal anu ngalangkunganana, ngirangan sinyal sareng ngalaksanakeun seueur fungsi anu mangpaat sareng teu kaduga. Urang bakal bakti hiji sakabéh artikel kana filter ieu engké. Tapi pikeun ayeuna urang bakal ngagunakeun éta salaku méter.

Urang bakal ngagunakeun generator nada salaku sumber sinyal, sinyal ti mana bakal dikirim ka saringan MS_VOLUME, kana kaluaran nu kartu sora disambungkeun.

Dina conto ieu, urang bakal nganggo saringan generator dina mode anu rada béda - éta bakal ngahasilkeun sinyal nada tunggal pikeun urang, i.e. sinyal nu ngandung ngan hiji osilasi sinusoida.

Salian frékuénsi sareng amplitudo, urang kedah nyetél waktos nalika sinyal bakal dibangkitkeun; éta kedah cekap ku kituna jumlah sampel anu cekap ngalangkungan saringan MS_VOLUME pikeun pangukuran. Pikeun mindahkeun setélan ka generator, struktur MSDtmfGenCustomTone dianggo:

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;

Pikeun ngamimitian generator, urang bakal make metoda MS_DTMF_GEN_PLAY_CUSTOM na.

Diagram blok pamrosésan sinyal:

Ngajalajah mesin Mediastreamer2 VoIP. Bagian 4

Kode program anu nerapkeun skéma ieu dipidangkeun di handap.

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

Kami nyusun conto urang, sapertos anu urang lakukeun sateuacanna, ngan ukur nganggo nami file mstest3. Hayu urang ngajalankeun éta sarta meunang hasilna:

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

Sakumaha anjeun tiasa tingali, hasil pangukuran coincided ka tempat decimal katilu jeung nilai teoritis sarua jeung akar kuadrat dua dibagi satengah: sqr(2)/2=0,7071067811865475

Panyimpangan relatif tina hasil tina nilai sabenerna éta 0.1%. Urang ditaksir kasalahan pangukuran dina tingkat sinyal maksimum. Sasuai, salaku tingkat nurun, kasalahan kudu ngaronjat. Kuring nyarankeun Anjeun evaluate eta diri pikeun tingkat sinyal low.

Dina artikel salajengna urang bakal ngumpul sirkuit nu ngadeteksi ayana sinyal nada tina frékuénsi dibikeun dina input maké detektor nada. Urang ogé bakal diajar kumaha ngolah kajadian anu dihasilkeun ku saringan.

sumber: www.habr.com

Tambahkeun komentar