Het materiaal van dit artikel is afkomstig van mijn .
We maken een signaalniveau-meter
In het verleden We hebben verduidelijkt hoe programma's die gebruik maken van een mediastreamer correct kunnen worden afgesloten.
In dit artikel zullen we het schema van de signaalniveau-meter samenstellen en leren hoe we de meetresultaten van het filter kunnen aflezen. We zullen de meetnauwkeurigheid evalueren.
In de set filters die door de mediastreamer worden geleverd, is er een filter, MS_VOLUME, dat in staat is om het effectieve niveau van het signaal dat er doorheen gaat te meten, het signaal te attenueren en een aantal nuttige en verrassende functies uit te voeren. Later zullen we dit filter in een compleet artikel bespreken. Maar nu zullen we het gebruiken als een meetinstrument.
Als signaalbron gebruiken we een toon-generator, waarvan het signaal naar het filter MS_VOLUME gaat, waaraan een geluidskaart is aangesloten.
In dit voorbeeld zullen we de filtergenerator in een iets andere modus gebruiken — hij zal voor ons een monotoon signaal genereren, dat wil zeggen, een signaal dat alleen uit één sinusgolf bestaat.
Naast frequentie en amplitude moeten we de tijd opgeven waarin het signaal wordt gegenereerd, deze moet voldoende zijn zodat er genoeg metingen door het filter MS_VOLUME gaan. Voor het doorgeven van instellingen aan de generator wordt de structuur MSDtmfGenCustomTone gebruikt:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Naam van het signaal bestaande uit 8 letters.*/
int duration; /* Duur van het signaal in milliseconden.*/
int frequencies[2]; /* Paar frequenties waaruit het uitvoersignaal moet bestaan. */
float amplitude; /* Amplitude van de tonen, 1.0 komt overeen met het niveau van 0 dB vanaf een milliwatt bij een belasting van 600 Ohm.*/
int interval; /* Pauze in milliseconden voordat het signaal opnieuw wordt afgespeeld.*/
int repeat_count; /* Aantal herhalingen.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Om de generator te starten, zullen we zijn methode MS_DTMF_GEN_PLAY_CUSTOM gebruiken.
Structurele schema van signaalverwerking:
![]()
De code van het programma die dit schema implementeert, is hieronder weergegeven.
/* Файл 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);
}We compileren ons voorbeeld zoals we eerder deden, maar nu met de bestandsnaam mstest3. We voeren het uit en krijgen het resultaat:
Een sinusamplitude van 1.000000 volt komt overeen met een effectieve waarde van 0.707733 volt.Zoals u kunt zien, komt het meetresultaat tot op de derde decimaal overeen met de theoretische waarde, die gelijk is aan de vierkantswortel van twee gedeeld door twee: sqr(2)/2=0,7071067811865475
De relatieve afwijking van het resultaat ten opzichte van de werkelijke waarde was 0,1%. We hebben de meetfout geëvalueerd bij het maximale signaalniveau. Bij een verlaagd niveau zal de fout toenemen. Ik stel voor dat u deze zelf inschat voor lage signaalniveaus.
In het volgende artikel zullen we een schema samenstellen dat de aanwezigheid van een tonaal signaal met een bepaalde frequentie aan de ingang detecteert met behulp van een toonontvanger. Daarnaast leren we hoe we de gebeurtenissen die door de filters worden gegenereerd, kunnen verwerken.
Bron: habr.com
