Mediastreamer2 VoIP එන්ජිම ගවේෂණය කිරීම. 4 කොටස

ලිපියේ ද්‍රව්‍ය මගේ වෙතින් ලබාගෙන ඇත සෙන් නාලිකාව.

සංඥා මට්ටමේ මීටරයක් ​​නිර්මාණය කිරීම

අන්තිමට ලිපියයි මාධ්‍ය ප්‍රවාහය භාවිතයෙන් වැඩසටහන් නිවැරදිව අවසන් කිරීම අපි පැහැදිලි කර ඇත්තෙමු.

මෙම ලිපියෙන් අපි සංඥා මට්ටමේ මීටර් පරිපථයක් එක්රැස් කර ෆිල්ටරයෙන් මිනුම් ප්රතිඵලය කියවීමට ඉගෙන ගන්නෙමු. මිනුම් නිරවද්‍යතාවය තක්සේරු කරමු.

මාධ්‍ය ප්‍රවාහකය විසින් සපයන ලද පෙරහන් කට්ටලයට MS_VOLUME පෙරහනක් ඇතුළත් වන අතර, එය හරහා ගමන් කරන සංඥාවේ RMS මට්ටම මැනීමට, සංඥාව දුර්වල කිරීමට සහ ප්‍රයෝජනවත් සහ අනපේක්ෂිත කාර්යයන් රාශියක් සිදු කිරීමට හැකියාව ඇත. අපි පසුව මෙම පෙරහන සඳහා සම්පූර්ණ ලිපියක් කැප කරන්නෙමු. නමුත් දැනට අපි එය මීටරයක් ​​ලෙස භාවිතා කරමු.

අපි සංඥා ප්‍රභවයක් ලෙස නාද උත්පාදක යන්ත්‍රයක් භාවිතා කරන්නෙමු, එම සංඥාව MS_VOLUME පෙරහන වෙත යවනු ලැබේ, ශබ්ද කාඩ්පත සම්බන්ධ කර ඇති ප්‍රතිදානය වෙත.

මෙම උදාහරණයේ දී, අපි උත්පාදක පෙරහන තරමක් වෙනස් ආකාරයකින් භාවිතා කරනු ඇත - එය අපට තනි නාද සංඥාවක් ජනනය කරනු ඇත, i.e. එක් sinusoidal දෝලනය පමණක් අඩංගු සංඥාවක්.

සංඛ්‍යාතයට සහ විස්තාරයට අමතරව, අපට සංඥාව ජනනය වන කාලය සැකසීමට අවශ්‍ය වනු ඇත; මැනීම සඳහා ප්‍රමාණවත් සාම්පල සංඛ්‍යාවක් 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 вольт.

ඔබට පෙනෙන පරිදි, මිනුම් ප්‍රති result ලය තුන්වන දශම ස්ථානයට සමපාත වූ අතර න්‍යායාත්මක අගය දෙකේ වර්ගමූලයට සමාන වන අතර එය අඩකින් බෙදනු ලැබේ: වර්ග(2)/2=0,7071067811865475

සැබෑ අගයෙන් ප්රතිඵලයේ සාපේක්ෂ අපගමනය 0.1% කි. අපි උපරිම සංඥා මට්ටමේ මිනුම් දෝෂය තක්සේරු කළා. ඒ අනුව, මට්ටම අඩු වන විට, දෝෂය වැඩි විය යුතුය. අඩු සංඥා මට්ටම් සඳහා එය ඔබම ඇගයීමට මම යෝජනා කරමි.

මීළඟ ලිපියෙන් අපි ටෝන අනාවරකයක් භාවිතයෙන් ආදානයේදී දෙන ලද සංඛ්‍යාතයක නාද සංඥාවක් පවතින බව හඳුනා ගන්නා පරිපථයක් එකලස් කරමු. පෙරහන් මගින් ජනනය කරන ලද සිදුවීම් සකසන ආකාරය ද අපි ඉගෙන ගනිමු.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න