Artikli materjal on saadud minu .
Loome signaali mõõturi
Eelmisel Oleme selgitanud, kuidas lõpetada rakendused, mis kasutavad meediastreamerit.
Selles artiklis koostame signaali mõõturi skeemi ja õpime lugema mõõtmistulemusi filtrist. Hindame mõõtmise täpsust.
Meediastreameriga pakutavate filtrite hulgas on filter MS_VOLUME, mis suudab mõõta selle kaudu kulgeva signaali ruutkeskmist taset, nõrgestada signaali ja täita palju kasulikke ja ootamatuid funktsioone. Hiljem pühendame sellele filtrile eraldi artikli. Aga praegu kasutame seda kui mõõturit.
Signaali allikana kasutame toonigeneraatorit, mille signaal suunatakse filtrisse MS_VOLUME, mille väljund on ühendatud helikaardiga.
Antud näites kasutame generaatori filtrit veidi teises režiimis — see genereerib meile ühetaktilise signaali, st signaali, mis sisaldab ainult ühte sinusoidset kõikumist.
Lisaks sagedusele ja amplituudile peame määrama aja, mille jooksul signaal genereeritakse, see peab olema piisav, et läbi filtri MS_VOLUME kulgeks piisav arv mõõtmisi. Generaatorile seadete edastamiseks kasutatakse MSDtmfGenCustomTone struktuuri:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Signaali tekstinimi 8 tähega.*/
int duration; /* Signaali kestus millisekundites.*/
int frequencies[2]; /* Kahest sagedusest koosnev väljundsigaal. */
float amplitude; /* Toonide amplituud, 1.0 vastab 0 dB tasemele 600 oomi koormusega.*/
int interval; /* Paus millisekundites enne signaali uuesti mängimist.*/
int repeat_count; /* Korduste arv.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Generaatori käivitamiseks kasutame selle meetodit MS_DTMF_GEN_PLAY_CUSTOM.
Signaali töötlemise struktuurne skeem:
![]()
Alljärgnev kood realiseerib seda skeemi.
/* Файл 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 nagu me enne tegime, kasutades failinime mstest3. Käivitame selle ja saame tulemuse:
Sinuse amplituudile 1.000000 volti vastab ruutkeskmine väärtus 0.707733 volti.Nagu näha, vastab mõõtmise tulemus teoreetilisele väärtusele, mis on ruutjuur kahest jagatud kahega, kuni kolmanda komakohani: sqr(2) / 2 = 0,7071067811865475
Tulemuse suhteline kõrvalekalle tõelisest väärtusest oli 0,1%. Hindasime mõõtmise viga maksimaalsel signaalitasemel. Seega, signaalitaseme vähenedes peaks viga suurenema. Pakun, et saate seda ise hinnata madalate signaalitasemete korral.
Järgmisest artiklist koostame skeemi, mis tuvastab antud sagedusega tonaalse signaali olemasolu sissepääsul koos toonide detektoriga. Õpime samuti töötlema filtreerijate genereeritud sündmusi.
Allikas: habr.com
