Artikli sisu on pärit minu .
Loome signaalitaseme mõõtjat
Eelmises osas Me selgitasime välja, kuidas õigesti lõpetada programme, mis kasutavad meediumivoogusid.
Selles artiklis koostame signaalitaseme mõõtja skeemi ja õpime filtisti välja mõõdetud tulemusi lugema. Hinnatakse mõõtmise täpsust.
Meediumivooguga kaasasolevas filtrite komplektis on filter MS_VOLUME, mis suudab mõõta selle kaudu läbiva signaali ruutkeskmist taset, nõrgestada signaali ja täita hulga kasulikke ja ootamatuid funktsioone. Hiljem pühendame sellele filtrile kogu artikli. Kuid praegu kasutame seda kui mõõtjat.
Signaali allikana kasutame toonigeneraatorit, mille signaal suunatakse MS_VOLUME filtrisse, mille väljund on ühendatud helikaardiga.
Selles näites kasutame generaatori filtrit veidi teises režiimis - see genereerib meile ühetasandilise signaali, st signaali, mis sisaldab ainult ühte sinusoidset võnget.
Lisaks sagedusele ja amplituudile peame määrama aja, mille jooksul signaal genereeritakse, mis peab olema piisav, et MS_VOLUME filtrist läbiks piisav arv mõõtmeid. Generaatori seadistuste edastamiseks kasutatakse struktureeritud MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Signaali nime tekst 8 tähega.*/
int duration; /* Signaali kestus millisekundites.*/
int frequencies[2]; /* Kahest sagedusest koosnev paar, millest väljundsignaal peab koosnema. */
float amplitude; /* Toonide amplituud, 1.0 vastab 0 dB tasemele 600 oomi koormusega.*/
int interval; /* Pause millisekundites enne signaali kordamist.*/
int repeat_count; /* Korduste arv.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Generaatori käivitamiseks kasutame selle meetodit MS_DTMF_GEN_PLAY_CUSTOM.
Signaali töötlemise struktuuriskeem:
![]()
Täpne kood, mis rakendab seda skeemi, on näidatud allpool.
/* Файл 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);
}Kompileerime meie näite sama moodi, nagu oleme eelnevalt teinud, lihtsalt faili nimena kasutades mstest3. Käivitame selle ja saame tulemuse:
Sinusoidi amplituudile 1.000000 volti vastab ruutkeskmine väärtus 0.707733 volti.Nagu näete, vastab mõõtmise tulemus kolmandale kohale pärast koma teoreetilisele väärtusele, mis on ruutjuur kahest jagatuna kahega: sqr(2)/2=0,7071067811865475
Tulemuse suhteline kõrvalekalle tõelisest väärtusest oli 0.1%. Oleme hinnanud mõõtmise viga maksimaalses signaalitasemes. Vastavalt peaks vea suurenema signaali taseme langemisel. Pakun teil iseseisvalt hinnata seda väikeste signaalitasemete jaoks.
Järgmises artiklis koostame skeemi, mis tuvastab antud sageduse toonilise signaali olemasolu sisendis, kasutades toonidetektorit. Samuti õpime töötlema filtreid genereeritud sündmusi.
Allikas: habr.com
