Materialul articolului provine de pe canalul meu .
Creăm un sistem de măsurare a nivelului semnalului
În trecut, am clarificat modul corect de finalizare a programelor care utilizează un media streamer.
În acest articol vom reuni schema sistemului de măsurare a nivelului semnalului și vom învăța cum să citim rezultatul măsurării din filtrul respectiv. Vom evalua precizia măsurării.
În setul de filtre furnizate de media streamer se află un filtru, MS_VOLUME, care poate măsura nivelul mediu pătratic al semnalului care îi trece prin el, atenuând semnalul și îndeplinind o mulțime de funcții utile și neașteptate. Ulterior, îi vom dedica un articol întreg. Dar acum, îl vom folosi ca sistem de măsurare.
Ca sursă a semnalului, vom folosi un generator tonal, iar semnalul va fi direcționat către filtrul MS_VOLUME, la ieșirea căruia este conectată o placă de sunet.
În acest exemplu, filtrul generatorului va fi utilizat într-un mod puțin diferit — va genera un semnal tonal unic, adică un semnal care conține doar o oscilație sinusoidală.
Pe lângă frecvență și amplitudine, va trebui să stabilim timpul în care semnalul va fi generat, acesta trebuie să fie suficient pentru ca filtrul MS_VOLUME să primească un număr adecvat de mostre pentru măsurare. Pentru a transmite setările generatorului, se folosește structura MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8];
/* Numele semnalului format din 8 litere. */
int duration;
/* Durata semnalului în milisecunde. */
int frequencies[2];
/* O pereche de frecvențe din care ar trebui să fie constituit semnalul de ieșire. */
float amplitude;
/* Amplitudinea tonurilor, 1.0 corespunde nivelului 0 dB de la milivolt la o sarcină de 600 Ohm. */
int interval;
/* Pauza în milisecunde înainte de reluarea semnalului. */
int repeat_count;
/* Numărul de repeat-uri. */
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Pentru a porni generatorul, vom folosi metoda sa MS_DTMF_GEN_PLAY_CUSTOM.
Schema structurală de procesare a semnalului:
![]()
Codul programului care implementează această schemă este prezentat mai jos.
/* Файл 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);
}Compilăm exemplul nostru, la fel ca înainte, doar folosind numele fișierului mstest3. Îl rulăm și obținem rezultatul:
Amplitudinii sinusoidale de 1.000000 volți îi corespunde o valoare medie pătratică de 0.707733 volți.După cum vedeți, rezultatul măsurării a corespuns până la a treia zecimală cu valoarea teoretică egală cu rădăcina pătrată din 2 împărțită la 2: sqr(2)/2=0,7071067811865475
Devierea relativă a rezultatului față de valoarea adevărată a fost de 0,1%. Am evaluat eroarea de măsurare la nivelul maxim al semnalului. Așadar, atunci când nivelul scade, eroarea ar trebui să crească. Vă propun să evaluați singuri această eroare pentru niveluri mici ale semnalului.
În articolul următor, vom construi un circuit care detectează prezența unui semnal tonal de o anumită frecvență la intrare folosind un detector de tonuri. De asemenea, vom învăța să procesăm evenimentele generate de filtre.
Sursa: habr.com
