Menjelajahi mesin VoIP Mediastreamer2. Bagian 4

Materi artikel diambil dari saya saluran Zen.

Membuat pengukur level sinyal

Terakhir Artikel Kami telah mengklarifikasi penghentian program yang benar menggunakan media streamer.

Pada artikel kali ini kita akan merakit rangkaian pengukur level sinyal dan mempelajari cara membaca hasil pengukuran dari filter. Mari kita evaluasi keakuratan pengukurannya.

Kumpulan filter yang disediakan oleh media streamer mencakup filter, MS_VOLUME, yang mampu mengukur level RMS dari sinyal yang melewatinya, melemahkan sinyal dan melakukan banyak fungsi berguna dan tidak terduga. Kami akan mencurahkan seluruh artikel untuk filter ini nanti. Namun untuk saat ini kami akan menggunakannya sebagai meteran.

Kami akan menggunakan generator nada sebagai sumber sinyal, sinyal yang akan dikirim ke filter MS_VOLUME, ke output yang terhubung dengan kartu suara.

Dalam contoh ini, kita akan menggunakan filter generator dalam mode yang sedikit berbeda - ini akan menghasilkan sinyal satu nada untuk kita, yaitu. sinyal yang hanya mengandung satu osilasi sinusoidal.

Selain frekuensi dan amplitudo, kita perlu mengatur waktu di mana sinyal akan dihasilkan; waktu tersebut harus mencukupi sehingga jumlah sampel yang cukup dapat melewati filter MS_VOLUME untuk pengukuran. Untuk mentransfer pengaturan ke generator, struktur MSDtmfGenCustomTone digunakan:

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;

Untuk memulai generator, kita akan menggunakan metode MS_DTMF_GEN_PLAY_CUSTOM.

Diagram blok pemrosesan sinyal:

Menjelajahi mesin VoIP Mediastreamer2. Bagian 4

Kode program yang mengimplementasikan skema ini ditunjukkan di bawah ini.

/* Файл 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 mengkompilasi contoh kami, sama seperti yang kami lakukan sebelumnya, hanya menggunakan nama file mstest3. Mari kita jalankan dan dapatkan hasilnya:

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

Seperti yang Anda lihat, hasil pengukurannya bertepatan dengan tempat desimal ketiga dengan nilai teoritis sama dengan akar kuadrat dua dibagi dua: kuadrat(2)/2=0,7071067811865475

Penyimpangan relatif hasil dari nilai sebenarnya adalah 0.1%. Kami menilai kesalahan pengukuran pada level sinyal maksimum. Oleh karena itu, ketika levelnya menurun, kesalahannya akan meningkat. Saya sarankan Anda mengevaluasinya sendiri untuk mengetahui tingkat sinyal rendah.

Pada artikel selanjutnya kita akan merakit rangkaian yang mendeteksi keberadaan sinyal nada dengan frekuensi tertentu pada input menggunakan detektor nada. Kita juga akan mempelajari cara memproses peristiwa yang dihasilkan oleh filter.

Sumber: www.habr.com

Beli hosting yang andal untuk situs dengan perlindungan DDoS, server VPS VDS 🔥 Beli hosting website andal dengan perlindungan DDoS, server VPS VDS | ProHoster