Mediastreamer2 VoIP ಎಂಜಿನ್ ಅನ್ನು ಅನ್ವೇಷಿಸಲಾಗುತ್ತಿದೆ. ಭಾಗ 4

ಲೇಖನದ ವಸ್ತುವನ್ನು ನನ್ನಿಂದ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ ಝೆನ್ ಚಾನೆಲ್.

ಸಿಗ್ನಲ್ ಮಟ್ಟದ ಮೀಟರ್ ಅನ್ನು ರಚಿಸುವುದು

ಕೊನೆಯಲ್ಲಿ ಲೇಖನ ಮೀಡಿಯಾ ಸ್ಟ್ರೀಮರ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಕಾರ್ಯಕ್ರಮಗಳ ಸರಿಯಾದ ಮುಕ್ತಾಯವನ್ನು ನಾವು ಸ್ಪಷ್ಟಪಡಿಸಿದ್ದೇವೆ.

ಈ ಲೇಖನದಲ್ಲಿ ನಾವು ಸಿಗ್ನಲ್ ಮಟ್ಟದ ಮೀಟರ್ ಸರ್ಕ್ಯೂಟ್ ಅನ್ನು ಜೋಡಿಸುತ್ತೇವೆ ಮತ್ತು ಫಿಲ್ಟರ್ನಿಂದ ಮಾಪನ ಫಲಿತಾಂಶವನ್ನು ಓದುವುದು ಹೇಗೆ ಎಂದು ಕಲಿಯುತ್ತೇವೆ. ಮಾಪನದ ನಿಖರತೆಯನ್ನು ಮೌಲ್ಯಮಾಪನ ಮಾಡೋಣ.

ಮೀಡಿಯಾ ಸ್ಟ್ರೀಮರ್ ಒದಗಿಸಿದ ಫಿಲ್ಟರ್‌ಗಳ ಸೆಟ್ ಫಿಲ್ಟರ್, MS_VOLUME ಅನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ, ಇದು ಅದರ ಮೂಲಕ ಹಾದುಹೋಗುವ ಸಿಗ್ನಲ್‌ನ RMS ಮಟ್ಟವನ್ನು ಅಳೆಯಲು, ಸಿಗ್ನಲ್ ಅನ್ನು ದುರ್ಬಲಗೊಳಿಸಲು ಮತ್ತು ಸಾಕಷ್ಟು ಉಪಯುಕ್ತ ಮತ್ತು ಅನಿರೀಕ್ಷಿತ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದೆ. ನಾವು ನಂತರ ಈ ಫಿಲ್ಟರ್‌ಗೆ ಸಂಪೂರ್ಣ ಲೇಖನವನ್ನು ವಿನಿಯೋಗಿಸುತ್ತೇವೆ. ಆದರೆ ಈಗ ನಾವು ಅದನ್ನು ಮೀಟರ್ ಆಗಿ ಬಳಸುತ್ತೇವೆ.

ನಾವು ಟೋನ್ ಜನರೇಟರ್ ಅನ್ನು ಸಿಗ್ನಲ್ ಮೂಲವಾಗಿ ಬಳಸುತ್ತೇವೆ, ಇದರಿಂದ ಸಿಗ್ನಲ್ ಅನ್ನು MS_VOLUME ಫಿಲ್ಟರ್‌ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ, ಅದರ ಔಟ್‌ಪುಟ್‌ಗೆ ಧ್ವನಿ ಕಾರ್ಡ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ.

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ನಾವು ಜನರೇಟರ್ ಫಿಲ್ಟರ್ ಅನ್ನು ಸ್ವಲ್ಪ ವಿಭಿನ್ನ ಮೋಡ್‌ನಲ್ಲಿ ಬಳಸುತ್ತೇವೆ - ಇದು ನಮಗೆ ಏಕ-ಟೋನ್ ಸಿಗ್ನಲ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ, ಅಂದರೆ. ಕೇವಲ ಒಂದು ಸೈನುಸೈಡಲ್ ಆಂದೋಲನವನ್ನು ಹೊಂದಿರುವ ಸಂಕೇತ.

ಆವರ್ತನ ಮತ್ತು ವೈಶಾಲ್ಯಕ್ಕೆ ಹೆಚ್ಚುವರಿಯಾಗಿ, ಸಿಗ್ನಲ್ ಅನ್ನು ಉತ್ಪಾದಿಸುವ ಸಮಯವನ್ನು ನಾವು ಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ; ಇದು ಸಾಕಾಗಬೇಕು ಆದ್ದರಿಂದ ಸಾಕಷ್ಟು ಸಂಖ್ಯೆಯ ಮಾದರಿಗಳು ಮಾಪನಕ್ಕಾಗಿ MS_VOLUME ಫಿಲ್ಟರ್ ಮೂಲಕ ಹಾದು ಹೋಗುತ್ತವೆ. ಜನರೇಟರ್‌ಗೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ವರ್ಗಾಯಿಸಲು, 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;

ಜನರೇಟರ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು, ನಾವು ಅದರ MS_DTMF_GEN_PLAY_CUSTOM ವಿಧಾನವನ್ನು ಬಳಸುತ್ತೇವೆ.

ಸಿಗ್ನಲ್ ಸಂಸ್ಕರಣೆಯ ಬ್ಲಾಕ್ ರೇಖಾಚಿತ್ರ:

Mediastreamer2 VoIP ಎಂಜಿನ್ ಅನ್ನು ಅನ್ವೇಷಿಸಲಾಗುತ್ತಿದೆ. ಭಾಗ 4

ಈ ಯೋಜನೆಯನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಪ್ರೋಗ್ರಾಂ ಕೋಡ್ ಅನ್ನು ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ.

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

ನಾವು ನಮ್ಮ ಉದಾಹರಣೆಯನ್ನು ಕಂಪೈಲ್ ಮಾಡುತ್ತೇವೆ, ನಾವು ಮೊದಲು ಮಾಡಿದಂತೆ, ಫೈಲ್ ಹೆಸರನ್ನು ಮಾತ್ರ ಬಳಸುತ್ತೇವೆ mstest3. ಅದನ್ನು ಚಲಾಯಿಸೋಣ ಮತ್ತು ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯೋಣ:

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

ನೀವು ನೋಡುವಂತೆ, ಮಾಪನ ಫಲಿತಾಂಶವು ಮೂರನೇ ದಶಮಾಂಶ ಸ್ಥಾನಕ್ಕೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ ಮತ್ತು ಸೈದ್ಧಾಂತಿಕ ಮೌಲ್ಯವು ಎರಡು ವರ್ಗಮೂಲಕ್ಕೆ ಸಮಾನವಾಗಿರುತ್ತದೆ: sqr(2)/2=0,7071067811865475

ನಿಜವಾದ ಮೌಲ್ಯದಿಂದ ಫಲಿತಾಂಶದ ಸಾಪೇಕ್ಷ ವಿಚಲನವು 0.1% ಆಗಿತ್ತು. ನಾವು ಗರಿಷ್ಠ ಸಿಗ್ನಲ್ ಮಟ್ಟದಲ್ಲಿ ಮಾಪನ ದೋಷವನ್ನು ನಿರ್ಣಯಿಸಿದ್ದೇವೆ. ಅಂತೆಯೇ, ಮಟ್ಟವು ಕಡಿಮೆಯಾದಂತೆ, ದೋಷವು ಹೆಚ್ಚಾಗಬೇಕು. ಕಡಿಮೆ ಸಿಗ್ನಲ್ ಮಟ್ಟಗಳಿಗಾಗಿ ಅದನ್ನು ನೀವೇ ಮೌಲ್ಯಮಾಪನ ಮಾಡಲು ನಾನು ಸಲಹೆ ನೀಡುತ್ತೇನೆ.

ಮುಂದಿನ ಲೇಖನದಲ್ಲಿ ನಾವು ಟೋನ್ ಡಿಟೆಕ್ಟರ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಇನ್‌ಪುಟ್‌ನಲ್ಲಿ ನಿರ್ದಿಷ್ಟ ಆವರ್ತನದ ಟೋನ್ ಸಿಗ್ನಲ್ ಇರುವಿಕೆಯನ್ನು ಪತ್ತೆಹಚ್ಚುವ ಸರ್ಕ್ಯೂಟ್ ಅನ್ನು ಜೋಡಿಸುತ್ತೇವೆ. ಫಿಲ್ಟರ್‌ಗಳಿಂದ ರಚಿಸಲಾದ ಈವೆಂಟ್‌ಗಳನ್ನು ಹೇಗೆ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಬೇಕು ಎಂಬುದನ್ನು ಸಹ ನಾವು ಕಲಿಯುತ್ತೇವೆ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ