Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 4

Das Material des Artikels stammt von mir Zen-Kanal.

Erstellen eines Signalpegelmessers

In der Vergangenheit Artikel Wir haben die korrekte Beendigung von Programmen über den Media-Streamer geklärt.

In diesem Artikel bauen wir eine Signalpegelmesserschaltung zusammen und lernen, wie man das Messergebnis vom Filter ablesen kann. Lassen Sie uns die Messgenauigkeit bewerten.

Zu den vom Medienstreamer bereitgestellten Filtern gehört ein Filter, MS_VOLUME, der in der Lage ist, den RMS-Pegel des durchlaufenden Signals zu messen, das Signal zu dämpfen und viele nützliche und unerwartete Funktionen auszuführen. Wir werden diesem Filter später einen ganzen Artikel widmen. Aber jetzt werden wir es als Messgerät verwenden.

Als Signalquelle verwenden wir einen Tongenerator, dessen Signal an den MS_VOLUME-Filter gesendet wird, an dessen Ausgang die Soundkarte angeschlossen ist.

In diesem Beispiel verwenden wir den Generatorfilter in einem etwas anderen Modus – er erzeugt für uns ein Einzeltonsignal, d.h. ein Signal, das nur eine Sinusschwingung enthält.

Zusätzlich zur Frequenz und Amplitude müssen wir die Zeit einstellen, in der das Signal erzeugt wird; sie muss ausreichend sein, damit eine ausreichende Anzahl von Samples den MS_VOLUME-Filter zur Messung passieren kann. Um Einstellungen an den Generator zu übertragen, wird die Struktur MSDtmfGenCustomTone verwendet:

struct _MSDtmfGenCustomTone{
    char tone_name[8];     /* Текстовое название сигнала из 8 букв.*/
    int duration;          /* Длительность сигнала в миллисекундах.*/
    int frequencies[2];    /* Пара частот из которых должен состоять выходной сигнал. */
    float amplitude;       /* Амплитуда тонов, 1.0 соответствует уровню 0 дБ от милливатта на нагрузке 600 Ом.*/
    int interval;          /* Пауза в миллисекундах перед началом повторного проигрывания сигнала.*/
    int repeat_count;      /* Количество повторов.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;

Um den Generator zu starten, verwenden wir seine Methode MS_DTMF_GEN_PLAY_CUSTOM.

Blockschaltbild der Signalverarbeitung:

Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 4

Der Programmcode, der dieses Schema implementiert, ist unten dargestellt.

/* Файл 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);
}

Wir kompilieren unser Beispiel wie zuvor, nur anhand des Dateinamens mstest3. Lassen Sie es uns ausführen und das Ergebnis erhalten:

Амплитуде синуса 1.000000 вольт  соответствует среднеквадратическое значение 0.707733 вольт.

Wie Sie sehen können, stimmte das Messergebnis bis zur dritten Dezimalstelle mit dem theoretischen Wert überein, der der Quadratwurzel aus zwei geteilt durch zwei entspricht: sqr(2)/2=0,7071067811865475

Die relative Abweichung des Ergebnisses vom wahren Wert betrug 0.1 %. Wir haben den Messfehler bei maximalem Signalpegel beurteilt. Dementsprechend sollte der Fehler mit abnehmendem Pegel zunehmen. Ich schlage vor, dass Sie es selbst auf niedrige Signalpegel prüfen.

Im nächsten Artikel werden wir eine Schaltung zusammenbauen, die mithilfe eines Tondetektors das Vorhandensein eines Tonsignals einer bestimmten Frequenz am Eingang erkennt. Außerdem erfahren Sie, wie Sie durch Filter generierte Ereignisse verarbeiten.

Source: habr.com

Kommentar hinzufügen