packet_receiver_new

Création d'un récepteur de trame.

Namespace: dsp::telecom

Prototype

sptr<PacketReceiver> packet_receiver_new(const PacketReceiverConfig &rc)

Description

Un récepteur est constitué de trois sous-blocs suivant :

  • Une détecteur d'en-tête de synchronisation.
  • Un interpolateur, permettant de passer au rythme symbole et dont le retard est réglé d'après celui mesuré par le détecteur.
  • Un démodulateur fonctionnant à la fréquence symbole (pas de de correction d'horloge), dont la boucle de correction de phase (ainsi que la CAG) est initialisée en fonction des paramètres RF détectés sur le motif de synchronisation.
  • Description détaillée du fonctionnement

    L'implémentation (src/telecom/recepteur.cc) réalise les opérations suivantes :

  • Les données reçues sont d'abord découpées en bloc de \(N_e\) échantillons (méthode "step()" appelée depuis l'extérieur), traités ensuite par la méthode "step_Ne()".
  • Le détecteur de motif (voir détecteur_création()) est appelé sur chaque bloc
  • Pour chaque motif de synchronisation trouvé par le détecteur, les échantillons I/Q correspondant au début des données utiles sont extraits, puis dans la méthode step_demod() :
  • Appel de l'interpolateur (correction d'horloge)
  • Appel du filtre adapté
  • Décimation au rythme symbole
  • Calage du premier échantillon sur le milieu du premier symbole
  • Appel du démodulateur (voir démodulateur_création())
  • Note
    Dans une future version, les étapes 3a, 3b et 3c seront fusionnées en un seul filtre d'interpolation polyphase, basé sur le filtre de mise en forme.


    Exemple

    
      // Configuration de l'émetteur
      ÉmetteurConfig ec;
      // En-tête de synchonisation (13 bits)
      ec.format.entete = code_Barker(13);
      // Nombre de bits utiles
      ec.format.nbits  = 16;
      // Facteur de sur-échantillonnage = 8
      ec.format.modulation.fsymb  = 1;
      ec.format.modulation.fe     = 8;
      // BPSK, avec filtre SRRC (60 % de dépassement)
      ec.format.modulation.forme_onde = forme_onde_bpsk(SpecFiltreMiseEnForme::rcs(0.6));
    
      // Instanciation de l'émetteur
      soit tx = émetteur_création(ec);
    
      RécepteurConfig rc;
      rc.format = ec.format;
    
      soit rx = récepteur_création(rc);
    
      // 16 bits alternés (101010...)
      soit data = BitStream::altern(16);
    
      // Emission d'une trame
      soit iq = tx->step(data);
    
      // Note : flush du signal (car le récepteur réagit avec du retard)
      soit trames = rx->step(iq | Veccf::zeros(2000));
    
      Figures f;
      f.subplot(141).plot(ec.format.entete.array(), "|bo", "En-tête de synchronisation");
      f.subplot(142).plot(data.array(), "|go", "Données envoyées");
      f.subplot(143).plot(iq, "-m");
      f.gcf().titre("Trame modulée (en-tête + données)");
      si(!trames.empty())
        f.subplot(144).plot(trames[0].bs.array(), "|go", "Données décodées");
    
    

    See also

    émetteur_création(), détecteur_création()