Использование библиотеки 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, который может быть расширен для более сложных задач обработки сигналов.



