Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 4

Ang materyal sa artikulo gikuha gikan sa akong zen channel.

Paghimo og signal level meter

Sa ulahi artikulo Among giklaro ang hustong pagtapos sa mga programa gamit ang media streamer.

Niini nga artikulo magtigum kami usa ka circuit meter sa lebel sa signal ug mahibal-an kung giunsa pagbasa ang resulta sa pagsukod gikan sa filter. Atong susihon ang katukma sa pagsukod.

Ang hugpong sa mga filter nga gihatag sa media streamer naglakip sa usa ka filter, MS_VOLUME, nga makahimo sa pagsukod sa lebel sa RMS sa signal nga moagi niini, pagpahinay sa signal ug paghimo sa daghang mapuslanon ug wala damha nga mga gimbuhaton. Atong igahin ang tibuok artikulo niini nga filter sa ulahi. Apan sa pagkakaron gamiton nato kini isip metro.

Gigamit namon ang usa ka generator sa tono ingon usa ka gigikanan sa signal, ang signal gikan diin ipadala sa filter sa MS_VOLUME, sa output diin konektado ang sound card.

Niini nga pananglitan, atong gamiton ang generator filter sa usa ka gamay nga lahi nga mode - kini makamugna og usa ka tono nga signal alang kanato, i.e. usa ka signal nga adunay usa lamang ka sinusoidal oscillation.

Dugang pa sa frequency ug amplitude, kinahanglan natong itakda ang oras sa paghimo sa signal; kini kinahanglan nga igo aron adunay igo nga gidaghanon sa mga sample nga moagi sa MS_VOLUME filter alang sa pagsukod. Aron mabalhin ang mga setting sa generator, gigamit ang istruktura sa MSDtmfGenCustomTone:

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;

Sa pagsugod sa generator, atong gamiton ang MS_DTMF_GEN_PLAY_CUSTOM nga pamaagi.

Block diagram sa pagproseso sa signal:

Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 4

Ang code sa programa nga nagpatuman niini nga laraw gipakita sa ubos.

/* Π€Π°ΠΉΠ» 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);
}

Among gitipon ang among panig-ingnan, sama sa among gibuhat kaniadto, gamit lang ang ngalan sa file mstest3. Atong daganon kini ug makuha ang resulta:

АмплитудС синуса 1.000000 Π²ΠΎΠ»ΡŒΡ‚  соотвСтствуСт срСднСквадратичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.707733 Π²ΠΎΠ»ΡŒΡ‚.

Sama sa imong makita, ang resulta sa pagsukod mitakdo sa ikatulo nga decimal nga dapit nga adunay theoretical value nga katumbas sa square root sa duha nga gibahin sa tunga: sqr(2)/2=0,7071067811865475

Ang relatibong pagtipas sa resulta gikan sa tinuod nga bili mao ang 0.1%. Gisusi namon ang sayup sa pagsukod sa labing taas nga lebel sa signal. Tungod niini, samtang ang lebel mikunhod, ang sayup kinahanglan nga modaghan. Gisugyot ko nga imong susihon kini sa imong kaugalingon alang sa ubos nga lebel sa signal.

Sa sunod nga artikulo magtigom kita ug sirkito nga makamatikod sa presensya sa signal sa tono sa gihatag nga frequency sa input gamit ang tone detector. Makakat-on usab kami kung giunsa pagproseso ang mga panghitabo nga gihimo sa mga pagsala.

Source: www.habr.com

Idugang sa usa ka comment