Mediastreamer2 VoIP mühərriki araşdırılır. 4-ci hissə

Məqalənin materialı məndən götürülmüşdür zen kanalı.

Siqnal səviyyəsini ölçən cihaz yaradın

Sonda məqalə media streamerdən istifadə edərək proqramların düzgün dayandırılmasını aydınlaşdırdıq.

Bu yazıda biz siqnal səviyyəsinin sayğacının dövrəsini yığacağıq və ölçmə nəticəsini filtrdən oxumağı öyrənəcəyik. Ölçmə dəqiqliyini təxmin edək.

Media strimeri tərəfindən təqdim edilən filtrlər dəstinə ondan keçən siqnalın RMS səviyyəsini ölçməyə, siqnalı zəiflətməyə və bir çox faydalı və gözlənilməz funksiyaları yerinə yetirməyə qadir olan MS_VOLUME filtri daxildir. Daha sonra bütün məqaləni bu filtrə həsr edəcəyik. Amma indi onu sayğac kimi istifadə edəcəyik.

Bir siqnal mənbəyi olaraq, səs kartının qoşulduğu çıxışa MS_VOLUME filtrinə göndərəcəyimiz siqnal olan bir ton generatorundan istifadə edəcəyik.

Bu nümunədə generator filtrini bir az fərqli rejimdə istifadə edəcəyik - o, bizim üçün tək tonlu bir siqnal yaradacaq, yəni. yalnız bir sinus dalğası olan siqnal.

Tezliyə və amplitudaya əlavə olaraq, siqnalın yaranacağı vaxtı təyin etməliyik, ölçmə üçün MS_VOLUME filtrindən kifayət qədər nümunənin keçməsi üçün kifayət olmalıdır. MSDtmfGenCustomTone strukturu parametrlər generatorunu ötürmək üçün istifadə olunur:

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;

Generatoru işə salmaq üçün onun MS_DTMF_GEN_PLAY_CUSTOM metodundan istifadə edəcəyik.

Siqnal emalının blok diaqramı:

Mediastreamer2 VoIP mühərriki araşdırılır. 4-ci hissə

Bu sxemi həyata keçirən proqram kodu aşağıda göstərilmişdir.

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

Biz nümunəmizi əvvəllər etdiyimiz kimi, yalnız fayl adından istifadə edərək tərtib edirik mtest3. İcra üçün işə salın və nəticəni əldə edin:

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

Gördüyünüz kimi, ölçmə nəticəsi ikiyə bölünən kvadrat kökə bərabər nəzəri dəyərlə üçüncü onluq yerinə qədər üst-üstə düşdü: sqr(2)/2=0,7071067811865475

Nəticənin həqiqi dəyərdən nisbi kənarlaşması 0.1% təşkil edib. Maksimum siqnal səviyyəsində ölçmə xətasını təxmin etdik. Müvafiq olaraq, səviyyə azaldıqca səhv artmalıdır. Aşağı siqnal səviyyələri üçün bunu özünüz qiymətləndirməyi təklif edirəm.

Növbəti məqalədə bir ton detektorundan istifadə edərək girişdə verilmiş tezlik tonunun mövcudluğunu aşkar edən bir dövrə yığacağıq. Biz həmçinin filtrlər tərəfindən yaradılan hadisələri idarə etməyi öyrənəcəyik.

Mənbə: www.habr.com

Добавить комментарий