Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 4

Nyenzo za kifungu zimechukuliwa kutoka kwangu chaneli ya zen.

Kuunda mita ya kiwango cha ishara

Zamani Ibara ya Tumefafanua usitishaji sahihi wa programu kwa kutumia kipeperushi cha media.

Katika makala hii tutakusanya mzunguko wa mita ya kiwango cha ishara na kujifunza jinsi ya kusoma matokeo ya kipimo kutoka kwa chujio. Wacha tuchunguze usahihi wa kipimo.

Seti ya vichungi vinavyotolewa na kipeperushi cha media ni pamoja na kichujio, MS_VOLUME, ambacho kina uwezo wa kupima kiwango cha RMS cha ishara inayopita ndani yake, kupunguza ishara na kufanya kazi nyingi muhimu na zisizotarajiwa. Tutatoa nakala nzima kwa kichujio hiki baadaye. Lakini kwa sasa tutaitumia kama mita.

Tutatumia jenereta ya toni kama chanzo cha ishara, ishara ambayo itatumwa kwa kichujio cha MS_VOLUME, kwa matokeo ambayo kadi ya sauti imeunganishwa.

Katika mfano huu, tutatumia chujio cha jenereta kwa hali tofauti kidogo - itazalisha ishara ya toni moja kwa ajili yetu, i.e. ishara iliyo na oscillation moja tu ya sinusoidal.

Mbali na marudio na amplitude, tutahitaji kuweka muda ambao ishara itatolewa; lazima iwe ya kutosha ili idadi ya kutosha ya sampuli zipitie kwenye kichujio cha MS_VOLUME kwa kipimo. Ili kuhamisha mipangilio kwa jenereta, muundo wa MSDtmfGenCustomTone hutumiwa:

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;

Ili kuanzisha jenereta, tutatumia mbinu yake ya MS_DTMF_GEN_PLAY_CUSTOM.

Mchoro wa kuzuia usindikaji wa ishara:

Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 4

Msimbo wa programu unaotekeleza mpango huu umeonyeshwa hapa chini.

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

Tunakusanya mfano wetu, kama tulivyofanya hapo awali, kwa kutumia tu jina la faili mstst3. Wacha tuiendeshe na tupate matokeo:

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

Kama unavyoona, matokeo ya kipimo yalilingana na nafasi ya tatu ya desimali na thamani ya kinadharia sawa na mzizi wa mraba wa mbili zilizogawanywa katika nusu: sqr(2)/2=0,7071067811865475

Mkengeuko wa jamaa wa matokeo kutoka kwa thamani ya kweli ulikuwa 0.1%. Tulitathmini hitilafu ya kipimo katika kiwango cha juu cha mawimbi. Ipasavyo, kiwango kinapungua, kosa linapaswa kuongezeka. Ninapendekeza ujitathmini mwenyewe kwa viwango vya chini vya mawimbi.

Katika makala inayofuata tutakusanya mzunguko unaotambua kuwepo kwa ishara ya sauti ya mzunguko uliopewa kwenye pembejeo kwa kutumia detector ya tone. Pia tutajifunza jinsi ya kuchakata matukio yanayotokana na vichujio.

Chanzo: mapenzi.com

Kuongeza maoni