Der Inhalt dieses Artikels stammt von meinem .
Wir erstellen ein Signalstärke-Messgerät
Im letzten Wir haben Klarheit über das ordnungsgemäße Beenden von Programmen geschaffen, die den Mediastreamer verwenden.
In diesem Artikel werden wir das Schema eines Signalstärke-Messgeräts zusammenstellen und lernen, wie man das Messergebnis aus dem Filter abliest. Wir werden die Messgenauigkeit bewerten.
Im Set der Filter, die der Mediastreamer bereitstellt, gibt es den Filter MS_VOLUME, der in der Lage ist, den RMS-Wert des durch ihn hindurchgehenden Signals zu messen, das Signal zu dämpfen und viele nützliche und unerwartete Funktionen auszuführen. Später werden wir diesem Filter einen ganzen Artikel widmen. Aber jetzt verwenden wir ihn als Messgerät.
Als Signalquelle werden wir einen Tonsignal-Generator verwenden, dessen Signal zum Filter MS_VOLUME geleitet wird, an dessen Ausgang eine Soundkarte angeschlossen ist.
In diesem Beispiel werden wir den Filter des Generators in einem etwas anderen Modus verwenden – er wird ein einfarbiges Signal für uns erzeugen, d.h. ein Signal, das nur eine sinusförmige Schwingung enthält.
Neben Frequenz und Amplitude müssen wir die Zeit angeben, während der das Signal generiert wird. Sie sollte ausreichend sein, damit durch den Filter MS_VOLUME genügend Zählwerte für eine Messung gehen. Zur Übertragung der Einstellungen an den Generator wird die Struktur MSDtmfGenCustomTone verwendet:
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* Textbezeichnung des Signals mit 8 Buchstaben.*/
int duration; /* Dauer des Signals in Millisekunden.*/
int frequencies[2]; /* Paar von Frequenzen, aus denen das Ausgangssignal bestehen soll. */
float amplitude; /* Amplitude der Töne, 1.0 entspricht 0 dB von Milliwatt an einer Last von 600 Ohm.*/
int interval; /* Pause in Millisekunden vor dem Beginn der Wiederholung des Signals.*/
int repeat_count; /* Anzahl der Wiederholungen.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;Um den Generator in Betrieb zu nehmen, verwenden wir seine Methode MS_DTMF_GEN_PLAY_CUSTOM.
Das strukturelle Schema der Signalverarbeitung:
![]()
Der Programmcode, der dieses Schema implementiert, ist 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, wie wir es zuvor gemacht haben, nur mit dem Dateinamen mstest3. Starten Sie die Ausführung und wir erhalten das Ergebnis:
Der Amplitude des Sinus von 1,000000 Volt entspricht ein quadratischer Mittelwert von 0,707733 Volt.Wie Sie sehen können, stimmt das Messresultat bis zur dritten Dezimalstelle mit dem theoretischen Wert überein, der dem Quadratwurzel von zwei geteilt durch zwei entspricht: sqr(2)/2=0,7071067811865475
Die relative Abweichung des Ergebnisses vom tatsächlichen Wert beträgt 0,1 %. Wir haben die Messfehler bei maximalem Signalniveau bewertet. Daher sollte der Fehler mit abnehmendem Signalniveau zunehmen. Ich schlage vor, dass Sie diesen selbst für kleine Signalniveaus bewerten.
Im nächsten Artikel werden wir ein Schema zusammenstellen, das das Vorhandensein eines Tonsignals mit einer bestimmten Frequenz am Eingang mithilfe eines Tonerkennungsdetektors erkennt. Außerdem lernen wir, die von den Filtern generierten Ereignisse zu verarbeiten.
Quelle: habr.com
