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

نیا تبصرہ شامل کریں