К ленте

Использование библиотеки rtl-sdr на C и C++

Изучите, как использовать библиотеку rtl-sdr на C и C++ для обработки сигналов с высокой производительностью.

Использование библиотеки rtl-sdr на C и C++

В мире обработки сигналов библиотека rtl-sdr на языках C и C++ представляет собой мощный инструмент, хотя и требует более сложной настройки по сравнению с Python. Тем не менее, для достижения высокой производительности, многие разработчики предпочитают использовать именно эту библиотеку, так как она значительно быстрее в обработке FFT.

Предполагается, что читатели уже имеют базовые навыки программирования и компиляции на C. Если у вас возникнут вопросы по этой теме, вы можете оставить комментарий.

Для начала, библиотеку можно найти здесь. Сначала ее нужно скомпилировать и установить. В комплекте с библиотекой поставляется файл convenience.h, который вы можете найти по указанному пути.

Ниже представлен минималистичный пример кода на C. Рекомендуется начать с этого простого примера, а затем ознакомиться с более подробным файлом rtlsdr.c из библиотеки.

#include <stdio.h>
#include <stdlib.h>

#include "rtl-sdr.h"
#include "lib/rtlsdr/rtl-sdr-master/src/convenience/convenience.h"

#define DEFAULT_SAMPLE_RATE 2048000
#define DEFAULT_FREQ 75000000
#define DEFAULT_BUF_LENGTH (16 * 16384)
#define MINIMAL_BUF_LENGTH 512
#define MAXIMAL_BUF_LENGTH (256 * 16384)

int main(int argc, char **argv) {
    static rtlsdr_dev_t *dev = NULL;
    int ppm_error = 0;
    uint8_t *buffer;
    int n_read;
    int gain = 0;
    int r;
    int dev_index = 0;
    uint32_t out_block_size = DEFAULT_BUF_LENGTH;

    buffer = malloc(out_block_size * sizeof(uint8_t));
    dev_index = verbose_device_search("0");

    if (dev_index < 0) {
        exit(1);
    }

    r = rtlsdr_open(&dev, (uint32_t)dev_index);
    if (r < 0) {
        fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index);
        exit(1);
    }

    /* Set the sample rate */
    verbose_set_sample_rate(dev, DEFAULT_SAMPLE_RATE);

    /* Set the frequency */
    verbose_set_frequency(dev, DEFAULT_FREQ);

    if (0 == gain) {
        /* Enable automatic gain */
        verbose_auto_gain(dev);
    } else {
        /* Enable manual gain */
        gain = nearest_gain(dev, gain);
        verbose_gain_set(dev, gain);
    }

    verbose_ppm_set(dev, ppm_error);

    /* Reset endpoint before we start reading from it (mandatory) */
    verbose_reset_buffer(dev);

    if (out_block_size < MINIMAL_BUF_LENGTH || out_block_size > MAXIMAL_BUF_LENGTH) {
        fprintf(stderr, "Output block size wrong value, falling back to default\n");
        fprintf(stderr, "Minimal length: %u\n", MINIMAL_BUF_LENGTH);
        fprintf(stderr, "Maximal length: %u\n", MAXIMAL_BUF_LENGTH);
        out_block_size = DEFAULT_BUF_LENGTH;
    }

    r = rtlsdr_read_sync(dev, buffer, out_block_size, &n_read);

    rtlsdr_close(dev);
    free(buffer);
}

Этот код представляет собой базовый пример работы с библиотекой rtl-sdr, который может быть расширен для более сложных задач обработки сигналов.