የ Mediastreamer2 VoIP ሞተርን ማሰስ። ክፍል 4

የጽሁፉ ይዘት ከኔ የተወሰደ ነው። የዜን ቻናል.

የምልክት ደረጃ መለኪያ መፍጠር

በመጨረሻው ጽሑፍ የሚዲያ ዥረት ማሰራጫውን በመጠቀም የፕሮግራሞችን ትክክለኛ ማቋረጥ አብራርተናል።

በዚህ ጽሑፍ ውስጥ የሲግናል ደረጃ ሜትር ወረዳን እንሰበስባለን እና የመለኪያ ውጤቱን ከማጣሪያው እንዴት ማንበብ እንደሚችሉ እንማራለን. የመለኪያውን ትክክለኛነት እንገምግም.

በመገናኛ ብዙሃን ዥረት አቅራቢው የቀረበው የማጣሪያዎች ስብስብ ማጣሪያ MS_VOLUME በውስጡ የሚያልፈውን የሲግናል RMS ደረጃ ለመለካት, ምልክቱን ለማዳከም እና ብዙ ጠቃሚ እና ያልተጠበቁ ተግባራትን የሚያከናውን ማጣሪያን ያካትታል. አንድ ሙሉ መጣጥፍ በኋላ ለዚህ ማጣሪያ እናቀርባለን። አሁን ግን እንደ ሜትር እንጠቀማለን.

የቶን ጀነሬተርን እንደ የምልክት ምንጭ እንጠቀማለን ፣ ምልክቱ ወደ MS_VOLUME ማጣሪያ ይላካል ፣ የድምፅ ካርዱ የተገናኘበት ውፅዓት።

በዚህ ምሳሌ, የጄነሬተር ማጣሪያውን ትንሽ ለየት ባለ ሁኔታ እንጠቀማለን - ነጠላ-ቶን ምልክት ያመነጫልናል, ማለትም. አንድ የ sinusoidal oscillation ብቻ የያዘ ምልክት.

ከድግግሞሽ እና ስፋት በተጨማሪ ምልክቱ የሚፈጠርበትን ጊዜ መወሰን አለብን፤ በቂ መጠን ያለው ናሙና በ 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% ነበር። የመለኪያ ስህተቱን በከፍተኛው የሲግናል ደረጃ ገምግመናል። በዚህ መሠረት, ደረጃው እየቀነሰ ሲሄድ, ስህተቱ መጨመር አለበት. ለዝቅተኛ የሲግናል ደረጃዎች እራስዎን እንዲገመግሙት እመክራለሁ.

በሚቀጥለው ርዕስ ውስጥ የድምፅ ማወቂያን በመጠቀም በመግቢያው ላይ የአንድ የተወሰነ ድግግሞሽ የድምፅ ምልክት መኖሩን የሚያውቅ ወረዳን እንሰበስባለን ። እንዲሁም በማጣሪያዎች የተፈጠሩ ክስተቶችን እንዴት እንደምናስተናግድ እንማራለን።

ምንጭ: hab.com

አስተያየት ያክሉ