Der Artikelinhalt stammt von meinem .
Wir erstellen ein Signalpegelmesser
Letzte Woche Wir haben Klarheit über den richtigen Abschluss von Programmen, die den Medienstreamer verwenden, geschaffen.
In diesem Artikel werden wir das Schaltbild des Signalpegelmessers zusammenstellen und lernen, das Messergebnis aus dem Filter abzulesen. Wir werden die Messgenauigkeit bewerten.
Im Filterset, das vom Medienstreamer bereitgestellt wird, gibt es einen Filter, MS_VOLUME, der in der Lage ist, den effektiven Wert des durch ihn hindurchgehenden Signals zu messen, das Signal abzuschwächen und eine Vielzahl nützlicher und überraschender Funktionen auszuführen. Später werden wir diesem Filter einen ganzen Artikel widmen. Aber jetzt verwenden wir ihn als Messgerät.
Als Signalquelle verwenden wir einen Tonsignal-Generator, dessen Signal wir an den Filter MS_VOLUME weiterleiten, dessen Ausgang mit einer Soundkarte verbunden ist.
In diesem Beispiel werden wir den Generatorfilter in einem etwas anderen Modus verwenden – er wird für uns ein Ein-Ton-Signal erzeugen, d.h. ein Signal, das nur eine sinusförmige Schwingung enthält.
Neben der Frequenz und Amplitude müssen wir die Zeit angeben, in der das Signal generiert wird. Diese muss ausreichend sein, damit genügend Abtasten durch den Filter MS_VOLUME für die Messung fließen. Die Struktur MSDtmfGenCustomTone wird verwendet, um die Einstellungen an den Generator zu übermitteln:
struct _MSDtmfGenCustomTone{
char tone_name[8];
int duration;
int frequencies[2];
float amplitude;
int interval;
int repeat_count;
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Um den Generator in Betrieb zu setzen, verwenden wir seine Methode MS_DTMF_GEN_PLAY_CUSTOM.
Strukturschema zur Signalverarbeitung:
![]()
Der Code des Programms, das dieses Schema umsetzt, wird unten gezeigt.
/* Файл 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);
}Kompilieren Sie unser Beispiel, genauso wie wir es zuvor gemacht haben, nur unter Verwendung des Dateinamens mstest3. Starten Sie die Ausführung, um das Ergebnis zu erhalten:
Der Amplitude des Sinus von 1.000000 Volt entspricht ein quadratischer Mittelwert von 0.707733 Volt.Wie Sie sehen, stimmte das Messergebnis bis zur dritten Nachkommastelle mit dem theoretischen Wert überein, der gleich der Quadratwurzel aus zwei geteilt durch zwei ist: sqr(2)/2=0,7071067811865475
Die relative Abweichung des Ergebnisses vom tatsächlichen Wert betrug 0,1 %. Wir haben die Messgenauigkeit bei maximalem Signalpegel bewertet. Entsprechend sollte die Abweichung bei sinkendem Pegel zunehmen. Ich schlage vor, dass Sie diese selbst für niedrige Signalpegel bewerten.
Im nächsten Artikel werden wir eine Schaltung zusammenstellen, die das Vorhandensein eines tonalen Signals mit einer bestimmten Frequenz am Eingang mittels eines Ton-Detektors erkennt. Außerdem werden wir lernen, die von den Filtern erzeugten Ereignisse zu verarbeiten.
Quelle: habr.com
