Free Sky

RTLSDR #C

La libray rtl-sdr en c ou c++ est plus compliquée à mettre en place mais pour un souci de performance j’ai décidé de l’utiliser afin de remplacer mon programme en python trop lent pour les FFT.

Nous partons du principe que vous savez programmer et compiler en C, si vous avez besoin de conseils sur ce sujet vous pouvez poster un commentaire.

Pour commencer vous trouverez la library ici. Compilez-la, installez là.

convenience.h est livré avec la library j’ai laissé le chemin pour vous montrer ou la trouver.

Voici un bout de code C le plus minimaliste possible. Commencez par ce petit programme puis reprenez le fichier rtlsdr.c de la library qui est plus détaillé.

 

#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, "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);
}