До стрічки

Використання бібліотеки rtl-sdr у C/C++ для обробки сигналів

Досліджуйте, як використовувати бібліотеку rtl-sdr на C/C++ для ефективної обробки сигналів, замінивши повільні програми на Python.

Використання бібліотеки 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;
    int dev_given = 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, "Не вдалося відкрити пристрій rtlsdr #%d.\n", dev_index);
        exit(1);
    }

    /* Встановлення частоти дискретизації */
    verbose_set_sample_rate(dev, DEFAULT_SAMPLE_RATE);

    /* Встановлення частоти */
    verbose_set_frequency(dev, DEFAULT_FREQ);

    if (0 == gain) {
        /* Увімкнення автоматичного посилення */
        verbose_auto_gain(dev);
    } else {
        /* Увімкнення ручного посилення */
        gain = nearest_gain(dev, gain);
        verbose_gain_set(dev, gain);
    }

    verbose_ppm_set(dev, ppm_error);

    /* Скидання буфера перед початком читання з нього (обов'язково) */
    verbose_reset_buffer(dev);

    if (out_block_size < MINIMAL_BUF_LENGTH || out_block_size > MAXIMAL_BUF_LENGTH) {
        fprintf(stderr, "Неправильне значення розміру виходу, повертаємося до значення за замовчуванням\n");
        fprintf(stderr, "Мінімальна довжина: %u\n", MINIMAL_BUF_LENGTH);
        fprintf(stderr, "Максимальна довжина: %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, включаючи налаштування частоти, частоти дискретизації та управління посиленням сигналу. Це може стати відправною точкою для тих, хто прагне глибше зануритися в обробку радіосигналів.