Materijal u članku preuzet je sa mog .
Ustvarjamo merilnik ravni signala
V prejšnjem Razjasnili smo pravilno zaključevanje programov, ki uporabljajo medijski streamer.
V tem članku bomo zbrali shemo merilnika ravni signala in se naučili brati rezultate merjenja iz filtra. Ocenili bomo natančnost merjenja.
V naboru filtrov, ki jih nudi medijski streamer, je filter MS_VOLUME, ki lahko meri učinkovito raven signala, ki ga prenaša, zmanjšuje signal in izvaja številne koristne in nepričakovane funkcije. Kasneje bomo temu filtru posvetili celoten članek. Toda zdaj ga bomo uporabili kot merilnik.
Kot vir signala bomo uporabili tonalni generator, katerega signal bomo usmerili na filter MS_VOLUME, na izhod katerega je priključena zvočna kartica.
V tem primeru bomo filtrirnik generatorja uporabili v nekoliko drugačnem načinu — generiral bo enotonalni signal, tj. signal, ki vsebuje samo eno sinusno nihanje.
Poleg frekvenc in amplitude bomo morali določiti čas, v katerem bo signal generiran, dovolj dolgi, da skozi filter MS_VOLUME preide dovolj podatkov za merjenje. Za prenos nastavitev generatorju se uporablja struktura MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Besedilno ime signala iz 8 črk.*/
int duration; /* Trajanje signala v milisekundah.*/
int frequencies[2]; /* Dvojica frekvenc, iz katerih naj bi bil sestavljen izhodni signal. */
float amplitude; /* Amplituda tonov, 1.0 ustreza ravni 0 dB od milivata na obremenitvi 600 Ohmov.*/
int interval; /* Pavza v milisekundah pred začetkom ponovnega predvajanja signala.*/
int repeat_count; /* Število ponovitev.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Za zagon generatorja v delovanje bomo uporabili njegovo metodo MS_DTMF_GEN_PLAY_CUSTOM.
Strukturna shema obdelave signala:
![]()
Koda programa, ki implementira to shemo, je prikazana spodaj.
/* Файл 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);
}Kompilirajmo naš primer, tako kot smo to počeli doslej, le da uporabimo ime datoteke mstest3. Zaženemo ga in dobimo rezultat:
Amplitudi sinusa 1.000000 voltov ustreza učinkovita vrednost 0.707733 voltov.Kot vidite, je meritev rezultata ujemala do tretje decimalke s teoretično vrednostjo, ki je enaka kvadratnemu korenu dvojke deljenemu z dvema: sqr(2)/2=0,7071067811865475
Relativna odstopanja rezultata od dejanske vrednosti je znašala 0,1 %. Ocenili smo napako merjenja pri največji ravni signala. Zato bi morala napaka pri zmanjšanju ravni naraščati. Predlagam, da jo sami ocenite za nizke ravni signala.
V naslednjem članku bomo sestavili shemo, ki zaznava prisotnost tonskega signala določene frekvence na vhodu s pomočjo tonskega detektorja. Prav tako se bomo naučili obdelovati dogodke, ki jih generirajo filtri.
Izvor: habr.com
