Materiali i artikujt është marrë nga kanali im .
Krijojmë një matës të nivelit të sinjalit
Në të kaluarën ne sqaruam mbarimin e saktë të programeve që përdorin mediastreamer.
Në këtë artikull do të mbledhim një skemë të matësit të nivelit të sinjalit dhe do të mësojmë si të lexojmë rezultatin e matjes nga filtri. Do të vlerësojmë saktësinë e matjes.
Në setin e filtrave që ofrohen nga mediastreamer, ka një filtrë, MS_VOLUME, i cili është në gjendje të masë nivelin mesatar të kalimit përmes tij, të dobësojë sinjalin dhe të kryejë shumë funksione të dobishme dhe të papritura. Më vonë do t'i kushtojmë një artikull të plotë këtij filtri. Por tani do ta përdorim si matës.
Si burim sinjali do të përdorim një gjenerator tonal, sinjali nga i cili do ta dërgojmë në filtrin MS_VOLUME, në daljen e të cilit është e lidhur një kartë zanori.
Në këtë shembull, do ta përdorim filtrin e gjeneratorit në një mod të ndryshëm – ai do të genere një sinjal njëtonal, pra një sinjal që përmban vetëm një valë sinusoidale.
Përveç frekuencës dhe amplitudës, na nevojitet të caktojmë kohën gjatë së cilës do të生成sinjali, ajo duhet të jetë e mjaftueshme që përmes filtrit MS_VOLUME të kalojë një numër i mjaftueshëm matjesh. Për të dërguar konfigurimin në gjenerator përdoret struktura MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Emri tekstual i sinjalit nga 8 shkronja. */
int duration; /* Kohëzgjatja e sinjalit në milisekonda. */
int frequencies[2]; /* Një çift frekuencash nga të cilat duhet të përbëhet sinjali dalës. */
float amplitude; /* Amplituda e toneve, 1.0 përputhet me nivelin 0 dB nga miliwatti në ngarkesë 600 Ohm. */
int interval; /* Pushimi në milisekonda para fillimit të përsëritjes së sinjalit. */
int repeat_count; /* Numri i përsëritjeve. */
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Për të nisur gjeneratorin në punë, do të përdorim metodën e tij MS_DTMF_GEN_PLAY_CUSTOM.
Skema strukturore për përpunimin e sinjalit:
![]()
Kodi i programit që realizon këtë skemë është i shfaqur më poshtë.
/* Файл 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);
}Kompilohet shembulli ynë, ashtu siç e kemi bërë deri tani, vetëm duke përdorur emrin e skedarit mstest3. Nisim për ekzekutim dhe do të marrim rezultatin:
Amplituda e sinusit 1.000000 volt përputhet me vlerën mesatare të katrorit 0.707733 volt.Si e shihni, rezultati i matjes përputhet deri në shifrën e tretë pas presjes me vlerën teorike që është rrënja katrore e dy e ndarë me dy: sqr(2)/2=0.7071067811865475
Devijimi relativ i rezultatit nga vlera e vërtetë ishte 0.1%. Ne bëmë një vlerësim të gabimit të matjes në nivelin maksimal të sinjalit. Prandaj, me uljen e nivelit, gabimi duhet të rritet. Ju sugjeroj ta vlerësoni vetë atë për nivele të vogla sinjali.
Në artikullin e ardhshëm ne do të grumbullojmë një skemë që zbulon praninë e një sinjali tonal me frekuencë të caktuar në hyrje me anë të një detektori tonësh. Ndër të tjera, do të mësojmë si të trajtojmë ngjarjet e gjeneruara nga filtrat.
Burimi: habr.com
