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٪ هو. اسان وڌ ۾ وڌ سگنل جي سطح تي ماپ جي غلطي جو جائزو ورتو. ان جي مطابق، جيئن سطح گھٽجي ٿي، غلطي وڌڻ گهرجي. مان صلاح ڏيان ٿو ته توهان ان جو جائزو وٺو گهٽ سگنل جي سطح لاءِ.

ايندڙ آرٽيڪل ۾ اسان هڪ سرڪٽ کي گڏ ڪنداسين جيڪو هڪ ٽون ڊيڪٽر استعمال ڪندي ان پٽ تي ڏنل فریکوئنسي جي ٽون سگنل جي موجودگي کي ڳولي ٿو. اسان اهو پڻ سکندا سين ته فلٽرن پاران ٺاهيل واقعن کي ڪيئن پروسيس ڪجي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو