Khám phá công cụ VoIP Mediastreamer2. Phần 4

Tài liệu của bài viết được lấy từ tài liệu của tôi kênh thiền.

Tạo máy đo mức tín hiệu

Cuối cùng Bài viết Chúng tôi đã làm rõ việc chấm dứt chính xác các chương trình sử dụng trình truyền phát phương tiện.

Trong bài viết này chúng ta sẽ lắp ráp một mạch đo mức tín hiệu và tìm hiểu cách đọc kết quả đo từ bộ lọc. Hãy đánh giá độ chính xác của phép đo.

Bộ bộ lọc được cung cấp bởi bộ truyền phát phương tiện bao gồm bộ lọc MS_VOLUME, có khả năng đo mức RMS của tín hiệu đi qua nó, làm suy giảm tín hiệu và thực hiện nhiều chức năng hữu ích và không mong muốn. Chúng tôi sẽ dành toàn bộ bài viết cho bộ lọc này sau. Nhưng bây giờ chúng ta sẽ sử dụng nó như một thước đo.

Chúng tôi sẽ sử dụng bộ tạo âm làm nguồn tín hiệu, tín hiệu từ đó sẽ được gửi đến bộ lọc MS_VOLUME, đến đầu ra mà card âm thanh được kết nối.

Trong ví dụ này, chúng tôi sẽ sử dụng bộ lọc trình tạo ở chế độ hơi khác - nó sẽ tạo ra tín hiệu một âm cho chúng tôi, tức là. tín hiệu chỉ chứa một dao động hình sin.

Ngoài tần số và biên độ, chúng ta sẽ cần đặt thời gian mà tín hiệu sẽ được tạo ra; nó phải đủ để có đủ số lượng mẫu đi qua bộ lọc MS_VOLUME để đo. Để chuyển cài đặt sang trình tạo, cấu trúc MSDtmfGenCustomTone được sử dụng:

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;

Để khởi động trình tạo, chúng tôi sẽ sử dụng phương thức MS_DTMF_GEN_PLAY_CUSTOM của nó.

Sơ đồ khối xử lý tín hiệu:

Khám phá công cụ VoIP Mediastreamer2. Phần 4

Mã chương trình thực hiện sơ đồ này được hiển thị bên dưới.

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

Chúng tôi biên dịch ví dụ của mình, giống như chúng tôi đã làm trước đây, chỉ sử dụng tên tệp mstest3. Hãy chạy nó và nhận được kết quả:

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

Như bạn có thể thấy, kết quả đo trùng với chữ số thập phân thứ ba với giá trị lý thuyết bằng căn bậc hai của 2 chia đôi: sqr(2)/0,7071067811865475=XNUMX

Độ lệch tương đối của kết quả so với giá trị thực là 0.1%. Chúng tôi đã đánh giá sai số đo ở mức tín hiệu tối đa. Theo đó, khi mức độ giảm, sai số sẽ tăng lên. Tôi khuyên bạn nên tự đánh giá nó ở mức tín hiệu thấp.

Trong bài viết tiếp theo, chúng tôi sẽ lắp ráp một mạch phát hiện sự hiện diện của tín hiệu âm thanh có tần số nhất định ở đầu vào bằng cách sử dụng bộ dò âm thanh. Chúng ta cũng sẽ tìm hiểu cách xử lý các sự kiện do bộ lọc tạo ra.

Nguồn: www.habr.com

Thêm một lời nhận xét