Materialet i artiklen er taget fra min .
Vi skaber en signalniveau måler
I den forrige Vi har afklaret korrekt afslutning af programmer, der bruger mediestrømmeren.
I denne artikel vil vi samle et skema til signalniveau måleren og lære at læse måleresultatet fra filteret. Vi vil vurdere nøjagtigheden af målingen.
I sættet med filtre, der leveres af mediestrømmeren, findes der et filter, MS_VOLUME, som kan måle den rottede effekt af det signal, der passerer gennem det, dæmpe signalet og udføre mange nyttige og overraskende funktioner. Senere vil vi dedikere en hel artikel til dette filter. Men nu vil vi bruge det som måler.
Som signal kilde vil vi bruge en tongenerator, hvis signal vil blive sendt til filteret MS_VOLUME, hvis udgang er tilsluttet et lydkort.
I dette eksempel vil vi bruge filtergeneratoren i en lidt anden tilstand — den vil generere et monotont signal for os, dvs. et signal, der kun indeholder en enkelt sinusoidal svingning.
Ud over frekvens og amplituder skal vi angive den tid, signalet skal genereres, den skal være tilstrækkelig til, at filteret MS_VOLUME får et tilstrækkeligt antal målinger. Indstillingerne til generatoren sendes ved hjælp af strukturen MSDtmfGenCustomTone:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Tekstnavn for signalet over 8 bogstaver.*/
int duration; /* Varighed af signalet i millisekunder.*/
int frequencies[2]; /* Et par frekvenser, som det udgående signal skal bestå af. */
float amplitude; /* Amplitude af toner, 1.0 svarer til niveau 0 dB fra milliwatt på en belastning på 600 Ohm.*/
int interval; /* Pause i millisekunder før signalet genafspilles.*/
int repeat_count; /* Antal gentagelser.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;For at starte generatoren i drift vil vi bruge dens metode MS_DTMF_GEN_PLAY_CUSTOM.
Strukturelt skema for signalbehandling:
![]()
Kodeprogrammet, der realiserer dette skema, vises nedenfor.
/* Файл 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);
}Vi kompilere vores eksempel ligesom vi gjorde før, men bruger filnavnet mstest3. Kør det, så får vi resultatet:
En amplituder på sinussen 1.000000 volt svarer til en kvadratrodsværdi på 0.707733 volt.Som du kan se, stemmer måleresultatet nøjagtigt til tredje decimal med den teoretiske værdi, der er lig med kvadratroden af to divideret med to: sqr(2)/2=0,7071067811865475
Det relative afvigelse af resultatet fra den sande værdi var 0,1%. Vi har vurderet målefejlen ved det maksimale signalfald. Følgelig skal fejlen stige, når signalniveauet falder. Jeg foreslår, at du selv vurderer den for lave signalniveauer.
I den næste artikel vil vi samle en skema, der opdager tilstedeværelsen af en tonal signal med en bestemt frekvens ved hjælp af tone-detektoren. Vi vil også lære at behandle begivenheder genereret af filtrene.
Kilde: habr.com
