récepteur_création

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

Espace de nom : tsd::telecom

Prototype

sptr<Récepteur> récepteur_création(const RécepteurConfig &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.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format.lien non trouvé : [structtsd_1_1telecom_1_1_trame_format_1a81d8500fe602da6b9589a1d5f7701fa2]entete = code_Barker(13);
      // Nombre de bits utiles
      ec.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format.lien non trouvé : [structtsd_1_1telecom_1_1_trame_format_1aab240a66c4b5d7f3fa38c726a0f810fe]nbits  = 16;
      // Facteur de sur-échantillonnage = 8
      ec.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format.lien non trouvé : [structtsd_1_1telecom_1_1_trame_format_ac7880c92728eeee06e3448dbab3a8381_1ac7880c92728eeee06e3448dbab3a8381]modulation.lien non trouvé : [structtsd_1_1telecom_1_1_mod_config_1a70eb9291612719b24f2ac92996cb9fa4]fsymb  = 1;
      ec.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format.lien non trouvé : [structtsd_1_1telecom_1_1_trame_format_ac7880c92728eeee06e3448dbab3a8381_1ac7880c92728eeee06e3448dbab3a8381]modulation.lien non trouvé : [structtsd_1_1telecom_1_1_mod_config_1a27ee82b08ade399e2cb8cd05241e7c11]fe     = 8;
      // BPSK, avec filtre SRRC (60 % de dépassement)
      ec.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format.lien non trouvé : [structtsd_1_1telecom_1_1_trame_format_ac7880c92728eeee06e3448dbab3a8381_1ac7880c92728eeee06e3448dbab3a8381]modulation.lien non trouvé : [structtsd_1_1telecom_1_1_mod_config_1a7ab39be2bea9353c45ef8bc657fce175]forme_onde = forme_onde_bpsk(lien non trouvé : [structtsd_1_1telecom_1_1_spec_filtre_mise_en_forme_1ade0567b3c8300e63cb0a477dba0a60a1]SpecFiltreMiseEnForme::rcs(0.6));
    
      // Instanciation de l'émetteur
      soit tx = émetteur_création(ec);
    
      RécepteurConfig rc;
      rc.lien non trouvé : [structtsd_1_1telecom_1_1_r_xC3_xA9cepteur_config_1ad04b1e1a8ecb5d1ef54eb253c328b57a]format = ec.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format;
    
      soit rx = récepteur_création(rc);
    
      // 16 bits alternés (101010...)
      soit data = lien non trouvé : [classtsd_1_1telecom_1_1_bit_stream_1adc6e6a9b8faa01e1017be415ad5368be]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.lien non trouvé : [structtsd_1_1telecom_1_1_xC3_x89metteur_config_1ae100290dc28b30ce1876de55c758d0bc]format.lien non trouvé : [structtsd_1_1telecom_1_1_trame_format_1a81d8500fe602da6b9589a1d5f7701fa2]entete.lien non trouvé : [classtsd_1_1telecom_1_1_bit_stream_1ac495fc01f7eddc3294118d570558e541]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");
    
    

    Voir aussi

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