Entdeckt de Mediastreamer2 VoIP-Motor. Deel 4

D'Material vum Artikel ass aus mengem zen Kanal.

Schafen engem Signal Niveau Meter

An der leschter Artikel Mir hunn d'korrekt Kënnegung vu Programmer mam Media Streamer gekläert.

An dësem Artikel wäerte mir e Signal Niveau Meter Circuit versammele a léiere wéi d'Messresultat vum Filter ze liesen. Loosst eis d'Messgenauegkeet evaluéieren.

D'Set vu Filtere, déi vum Media Streamer geliwwert gëtt, enthält e Filter, MS_VOLUME, deen fäeg ass den RMS Niveau vum Signal ze moossen, deen duerch dat passéiert, d'Signal ze attenuéieren a vill nëtzlech an onerwaart Funktiounen ausféieren. Mir wäerten e ganzen Artikel op dësem Filter spéider widmen. Awer fir de Moment wäerte mir et als Meter benotzen.

Als Signalquell benotze mir en Toungenerator, aus deem d'Signal an de MS_VOLUME-Filter geschéckt gëtt, op den Ausgang vun deem d'Soundkaart ugeschloss ass.

An dësem Beispill wäerte mir de Generatorfilter an engem liicht anere Modus benotzen - et wäert e Single-Tonsignal fir eis generéieren, d.h. e Signal deen nëmmen eng sinusoidal Schwéngung enthält.

Zousätzlech zu der Frequenz an der Amplitude musse mir d'Zäit setzen, während där d'Signal generéiert gëtt, sou datt eng genuch Zuel vu Proben duerch de MS_VOLUME-Filter passéiert fir d'Messung. Fir Astellungen op den Generator ze transferéieren, gëtt d'MSDtmfGenCustomTone Struktur benotzt:

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;

Fir de Generator ze starten, wäerte mir seng MS_DTMF_GEN_PLAY_CUSTOM Method benotzen.

Blockdiagramm vun der Signalveraarbechtung:

Entdeckt de Mediastreamer2 VoIP-Motor. Deel 4

De Programmcode deen dëse Schema implementéiert gëtt hei ënnen gewisen.

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

Mir kompiléieren eist Beispill, grad wéi mir et virdru gemaach hunn, nëmme mam Dateinumm mstest 3. Loosst eis et lafen an d'Resultat kréien:

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

Wéi Dir gesitt, ass d'Miessresultat mat der drëtter Dezimalplaz mat dem theoretesche Wäert gläich wéi der Quadratwurzel vun zwee an der Halschent gedeelt: sqr(2)/2=0,7071067811865475

Déi relativ Ofwäichung vum Resultat vum richtege Wäert war 0.1%. Mir hunn de Miessfehler um maximalen Signalniveau bewäert. Deementspriechend, wéi den Niveau erofgeet, sollt de Feeler eropgoen. Ech proposéieren Iech et selwer fir niddereg Signalniveauen ze evaluéieren.

Am nächsten Artikel wäerte mir e Circuit montéieren deen d'Präsenz vun engem Tonsignal vun enger bestëmmter Frequenz um Input mat engem Tondetektor erkennt. Mir léiere och wéi een Eventer veraarbecht, déi vu Filtere generéiert ginn.

Source: will.com

Setzt e Commentaire