Binciko injin Mediastreamer2 VoIP. Kashi na 4

An ɗauko kayan labarin daga nawa zen channel.

Ƙirƙirar mitar matakin sigina

A karshe labarin Mun fayyace madaidaicin ƙarewar shirye-shirye ta amfani da mai raɗaɗin watsa labarai.

A cikin wannan labarin za mu haɗa da'irar matakin sigina kuma mu koyi yadda ake karanta sakamakon auna daga tacewa. Bari mu kimanta daidaiton ma'auni.

Saitin tacewa wanda mai watsa shirye-shiryen watsa labarai ya samar ya haɗa da tacewa, MS_VOLUME, wanda ke da ikon auna matakin RMS na siginar da ke wucewa ta cikinta, rage siginar da kuma yin ayyuka masu amfani da ba zato ba tsammani. Za mu keɓe gaba ɗaya labarin ga wannan tace daga baya. Amma a yanzu za mu yi amfani da shi azaman mita.

Za mu yi amfani da janareta na sautin a matsayin tushen sigina, siginar daga abin da za a aika zuwa matatar MS_VOLUME, zuwa fitarwar da aka haɗa katin sauti.

A cikin wannan misali, za mu yi amfani da filtatar janareta a wani yanayi daban-daban - zai haifar mana da siginar sautin guda ɗaya, watau. sigina mai ɗauke da oscillation sinusoidal ɗaya kawai.

Baya ga mitar da girma, muna buƙatar saita lokacin da za a samar da siginar; dole ne ya isa don isashen adadin samfuran su wuce ta hanyar tace MS_VOLUME don aunawa. Don canja wurin saituna zuwa janareta, ana amfani da tsarin 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;

Don fara janareta, za mu yi amfani da hanyar MS_DTMF_GEN_PLAY_CUSTOM.

Toshe zane na sarrafa sigina:

Binciko injin Mediastreamer2 VoIP. Kashi na 4

An nuna lambar shirin da ke aiwatar da wannan makirci a ƙasa.

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

Muna tattara misalinmu, kamar yadda muka yi a baya, muna amfani da sunan fayil kawai mstest3. Bari mu gudanar da shi mu sami sakamako:

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

Kamar yadda kuke gani, sakamakon ma'aunin ya zo daidai da wuri na goma na uku tare da ƙimar ka'idar daidai da tushen murabba'in biyu zuwa rabi: sqr(2)/2=0,7071067811865475

Bambancin dangi na sakamakon daga ƙimar gaskiya shine 0.1%. Mun kimanta kuskuren auna a matsakaicin matakin sigina. Saboda haka, yayin da matakin ya ragu, kuskure ya kamata ya karu. Ina ba da shawarar ku kimanta shi da kanku don ƙananan matakan sigina.

A cikin kasida ta gaba za mu haɗu da kewayawa wanda ke gano kasancewar siginar sauti na mitar da aka bayar a wurin shigarwa ta amfani da na'urar gano sautin. Za mu kuma koyi yadda ake aiwatar da abubuwan da masu tacewa ke samarwa.

source: www.habr.com

Add a comment