Udforskning af Mediastreamer2 VoIP-motoren. Del 4

Artiklens materiale er hentet fra min zen kanal.

Oprettelse af en signalniveaumåler

I fortiden artiklen Vi har afklaret den korrekte afslutning af programmer ved hjælp af mediestreameren.

I denne artikel vil vi samle et signalniveaumålerkredsløb og lære at aflæse måleresultatet fra filteret. Lad os evaluere målenøjagtigheden.

Sættet af filtre leveret af mediestreameren inkluderer et filter, MS_VOLUME, som er i stand til at måle RMS-niveauet af signalet, der passerer gennem det, dæmpe signalet og udføre en masse nyttige og uventede funktioner. Vi vil afsætte en hel artikel til dette filter senere. Men indtil videre vil vi bruge det som måler.

Vi vil bruge en tonegenerator som en signalkilde, hvorfra signalet sendes til MS_VOLUME-filteret, til hvis udgang lydkortet er tilsluttet.

I dette eksempel vil vi bruge generatorfilteret i en lidt anderledes tilstand - det vil generere et enkelt-tone signal til os, dvs. et signal, der kun indeholder én sinusformet svingning.

Ud over frekvensen og amplituden skal vi indstille den tid, hvor signalet vil blive genereret; det skal være tilstrækkeligt til, at et tilstrækkeligt antal prøver passerer gennem MS_VOLUME-filteret til måling. For at overføre indstillinger til generatoren bruges MSDtmfGenCustomTone-strukturen:

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;

For at starte generatoren bruger vi dens MS_DTMF_GEN_PLAY_CUSTOM metode.

Blokdiagram over signalbehandling:

Udforskning af Mediastreamer2 VoIP-motoren. Del 4

Programkoden, der implementerer denne ordning, er vist 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 kompilerer vores eksempel, ligesom vi gjorde før, kun ved at bruge filnavnet mstest3. Lad os køre det og få resultatet:

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

Som du kan se, faldt måleresultatet sammen med den tredje decimal med den teoretiske værdi svarende til kvadratroden af ​​to delt i halvdelen: sqr(2)/2=0,7071067811865475

Den relative afvigelse af resultatet fra den sande værdi var 0.1 %. Vi vurderede målefejlen ved det maksimale signalniveau. Følgelig, når niveauet falder, bør fejlen stige. Jeg foreslår, at du selv vurderer det for lave signalniveauer.

I den næste artikel vil vi samle et kredsløb, der registrerer tilstedeværelsen af ​​et tonesignal med en given frekvens ved indgangen ved hjælp af en tonedetektor. Vi vil også lære, hvordan man behandler hændelser genereret af filtre.

Kilde: www.habr.com

Tilføj en kommentar