ENSSAT Lannion · IMR-2 · 2025-2026

Réseaux Sans Fil
LTE / 5G-NR

Fiches de révision complètes — Cours + TP Pratique
OFDM Grille Temps/Fréquence PBCH · PDCCH · PDSCH FEC Hamming748 Code Convolutionnel v27 Modulations QAM Synchronisation CAZAC QCM interactif
R. Gerzaguet · robin.gerzaguet@enssat.fr Fiches préparées pour le QCM
1

Concepts fondamentaux

Le pourquoi et le comment du réseau sans fil

Le problème du sans-fil

Plusieurs utilisateurs doivent partager le même médium physique : l'air. Contrairement au filaire, on ne peut pas brancher chacun sur son propre câble.

Solution : on organise qui envoie quoi, quand, et sur quelle fréquence grâce à un multiplexage temps-fréquence.

Les acteurs

  • Station de base (BS / Tx) : l'antenne, côté émetteur. Elle diffuse les données vers tous les terminaux.
  • Terminal mobile (eNodeB / Rx) : le téléphone, côté récepteur.
  • Dans ce cours : transmission descendante (downlink), de l'antenne vers les mobiles.

OFDM — la solution de multiplexage essentiel

OFDM = Orthogonal Frequency Division Multiplexing. L'idée est de diviser la bande de fréquence disponible en un grand nombre de sous-porteuses étroites et orthogonales entre elles.

Avantages OFDM :

  • Résistance aux évanouissements fréquentiels (canal sélectif)
  • Égalisation simple : un seul coefficient par sous-porteuse (Zero-Forcing)
  • Multiplexage facile de plusieurs utilisateurs
  • Flexibilité d'allocation des ressources

Le préfixe cyclique (CP) :

  • Copie de la fin du symbole en début de trame
  • Taille CP = 72 dans le projet
  • Absorbe les échos du canal (multi-trajets)
  • Garantit l'orthogonalité entre sous-porteuses
OFDM génère une grille Temps × Fréquence dans laquelle on place les différents canaux et utilisateurs.

Vue d'ensemble du système

PSCH
Sync primaire
Symbole 1
SSCH
Sync secondaire
Symbole 2
PBCH
Broadcast
Infos cellule
PDCCH
Contrôle
Infos décodage
PDSCH
Données utiles
Payload

Ordre de décodage obligatoire : chaque canal donne les paramètres du suivant. Sans le PBCH, impossible de trouver le PDCCH ; sans le PDCCH, impossible de trouver le PDSCH.

2

Grille Temps / Fréquence

Paramètres numériques et organisation des ressources

Paramètres numériques — à connaître par cœur

Taille FFT
1024
points
Sous-porteuses allouées
624
= 52 RB × 12
Symboles / trame
14
symboles OFDM
Taille CP
72
échantillons
Fréq. d'échantillonnage
8
MHz
Sous-porteuses / RB
12
sous-porteuses
Nombre de RB
52
resource blocks
Waveform
OFDM
standard 5G-NR

Sous-porteuses allouées : pourquoi 624 ?

La FFT de 1024 points génère 1024 sous-porteuses, mais on n'en utilise que 624 (les 312 premières + les 312 dernières) pour centrer le signal autour de la fréquence DC.

-- Formule d'allocation -- Sa = {1 → NRe/2} ∪ {N - NRe/2 + 1 → N} NRe = 624, N = 1024 Sa = {1 → 312} ∪ {713 → 1024} → Sous-porteuses autour du DC allouées
Les 400 sous-porteuses centrales ne sont pas allouées (garde de fréquence autour du DC).

Adressage dans la grille

Tout élément de la grille est repéré par (indice symbole, indice RB) :

  • Symboles indexés de 1 à 14
  • RB indexés de 1 à 52
  • RB-1 : sous-porteuses 1 à 12
  • RB-52 : sous-porteuses 613 à 624
Positions fixes : PSCH = (1, 1→52) ; SSCH = (2, 1→52) ; PBCH commence à (3, 1).

Tailles des matrices Python

VariableDimensionsExplication
tfMatrix14 × 1024Matrice T/F brute complète (tous symboles, toutes sous-porteuses FFT)
tfMatrix_short14 × 624Après sélection des sous-porteuses allouées uniquement
qamMatrix12 × 624Après suppression des 2 premiers symboles (PSCH + SSCH)
Attention : en Python, les indices commencent à 0. Dans le TP, la ligne 0 de qamMatrix correspond au symbole 3 de la grille (le PBCH).
3

Canaux de synchronisation (PSCH & SSCH)

Séquences CAZAC / Zadoff-Chu

Pourquoi synchroniser ?

Avant de décoder quoi que ce soit, le récepteur doit savoir exactement à quel instant commence la trame et sur quelle fréquence se caler. Une erreur de timing ou de fréquence détruirait l'orthogonalité OFDM.

Séquences CAZAC (Zadoff-Chu) Constant Amplitude Zero AutoCorrelation

Ces séquences ont deux propriétés remarquables :

  • Amplitude constante : idéal pour le PAPR (Peak-to-Average Power Ratio)
  • Autocorrélation nulle sauf à l'instant 0 : permet de détecter précisément l'instant de synchronisation par corrélation
-- PSCH (Primary Sync Channel) -- Spsch[n] = 10^(Pb/20) × exp(j·π·μ·n·(n + mod(NRe, 2)) / NRe) Pb = 3 dB (boost de puissance) μ = 2 (noyau de la séquence ZC) NRe = 624 (nombre de sous-porteuses) -- SSCH (Secondary Sync Channel) -- Sssch[n] = 10^(Pb/20) × exp(-j·π·μ·n·(n + mod(NRe, 2)) / NRe) → La SSCH est le conjugué de la PSCH
Ces séquences sont définies en domaine fréquentiel (dans la grille T/F), puis converties en temporel par FFT pour la synchronisation, et utilisées directement en fréquentiel pour l'égalisation de canal (Zero-Forcing).

Égalisation de canal (ZF — Zero Forcing)

Après synchronisation, les séquences PSCH/SSCH servent aussi à estimer la réponse du canal H[k] pour chaque sous-porteuse k. L'égaliseur ZF divise le signal reçu par l'estimée du canal :

Y[k] = H[k] × X[k] + bruit (modèle du canal) X_eq[k] = Y[k] / H[k] (égalisation ZF : 1 tap par sous-porteuse)
4

Description des canaux physiques

PBCH, PDCCH, PDSCH — structure et contenu

PBCH — Physical Broadcast Channel Modulation fixe : BPSK + Hamming748

Le PBCH est commun à tous les utilisateurs. Il commence au symbole 3. Sa taille dépend du nombre d'utilisateurs : (1 + Nb_users) × 48 bits.

Sous-canalBits transmis (avec FEC)Bits utiles (après FEC)Contenu
Cell & Users Info 48 24 Cell ident (18 bits) + Nombre d'utilisateurs (6 bits)
PBCHU user 1 48 24 User ident (8b) + MCS PDCCH (2b) + Symb PDCCHU (4b) + RB PDCCHU (6b) + HARQ (4b)
PBCHU user 2…N 48 chacun 24 chacun Mêmes champs, pour chaque utilisateur supplémentaire
Convention big-endian : toutes les conversions binaire → entier utilisent le bit le plus significatif en premier (MSB first).

PDCCH / PDCCHU — Physical Downlink Control Channel

Le PDCCH est la concaténation de tous les PDCCHU (un par utilisateur). Sa position est donnée par le PBCH. Chaque PDCCHU fait 72 bits transmis → 36 bits après FEC.

ChampTaille (après FEC)Valeurs
User ident8 bitsIdentifiant unique de l'utilisateur
MCS du PDSCH6 bits0–39 : détermine modulation + FEC du PDSCH (voir table MCS)
Symbole de début du PDSCH4 bits1 à 14
RB de début du PDSCH6 bits1 à 52
Taille en RB10 bitsNombre de RB alloués au PDSCH
Flag CRC2 bits0=CRC8, 1=CRC16, 2=CRC24, 3=CRC32
La modulation du PDCCHU est donnée par le champ MCS (2 bits) du PBCHU : 0 = BPSK+Ham748, 2 = QPSK+Ham748 (dans ce projet).

PDSCH — Physical Downlink Shared Channel (payload)

C'est le canal qui porte les données utiles. Sa position, sa taille et ses paramètres de décodage sont tous définis par le PDCCHU. La chaîne de décodage est :

1. Extraction des symboles QAM (position donnée par PDCCHU) 2. Démodulation QAM → bitstream codé (NF_c bits) 3. Décodage FEC → bitstream brut (N bits) 4. Vérification CRC → suppression des c bits de CRC 5. Conversion ASCII → texte final + clé secrète 🔑
Paramètre CRCFlagTaillePolynôme
CRC-808 bits1 + X + X² + X⁸
CRC-16116 bits1 + X² + X¹⁵ + X¹⁶
CRC-24224 bitsX²⁴ + X²² + … + 1
CRC-32332 bitsX³² + X²⁶ + … + 1
5

Forward Error Correction (FEC)

Hamming748 et Code Convolutionnel v27

Principe général du FEC

On ajoute de la redondance aux données avant transmission. Si des bits sont corrompus, la redondance permet de les reconstruire côté récepteur. Le taux de codage r mesure l'efficacité :

r = bits_information / bits_transmis Hamming748 : r = 1/2 (4 bits → 8 bits) Code conv. : r = 1/2 (N bits → 2N+16 bits)

Hamming(7,4,8) — utilisé dans PBCH et PDCCHU taux 1/2

Pour chaque groupe de 4 bits d'entrée, on produit 8 bits de sortie (4 données + 3 parité Hamming74 + 1 parité globale).

Matrice d'encodage D (4×8) :

D = [1 0 0 0 0 1 1 1] [0 1 0 0 1 0 1 1] [0 0 1 0 1 1 0 1] [0 0 0 1 1 1 1 0] y748 = xT × D (mod 2)

Matrice syndrome H (3×7) pour décoder :

H = [0 0 0 1 1 1 1] [0 1 1 0 0 1 1] [1 0 1 0 1 0 1] ε = H × y74 (mod 2) ε = 000 → pas d'erreur ✓ ε = 001 → bit 1 erroné ε = 011 → bit 3 erroné
Attention : le syndrome s'applique sur les 7 premiers bits (Hamming74). Le 8e bit est la parité globale : si tous les 7 premiers bits somment à la valeur du 8e (mod 2), la transmission est correcte. Si le syndrome est 0 mais le 8e bit est faux → pas d'erreur dans les données, juste dans le bit de parité.

Capacités de correction :

SituationSyndrome ε8e bit (parité)Action
Pas d'erreur000correctAccepter
1 erreur (bits 1–7)≠ 000incorrectCorriger : flip du bit indiqué
Erreur sur le 8e bit000incorrectAccepter (données OK)
2 erreurs≠ 000correctRejeter (retransmission)

Code Convolutionnel v27 taux 1/2, profondeur K=7

Ce code génère 2 bits de sortie pour chaque bit d'entrée, en combinant (XOR) le bit courant avec ses 6 prédécesseurs. Les polynômes générateurs sont :

Stream 1 (polynôme 133 octal) :

Binaire : 1011011 Utilise : x[n], x[n-2], x[n-3], x[n-5], x[n-6]

Stream 2 (polynôme 171 octal) :

Binaire : 1111001 Utilise : x[n], x[n-1], x[n-2], x[n-3], x[n-6]
-- Entrelacement des 2 streams -- y = [y1[1]; y2[1]; y1[2]; y2[2]; ...; y1[end]; y2[end]] Taille de sortie : 2×(N + K + 1) = 2N + 16 bits (K=7 → queue de 14+2=16 bits) -- Exemple : x = [1;1;0;1] -- y = [1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0]
Décodage par l'algorithme de Viterbi (Maximum Likelihood). En Python : cc1 = fec.FECConv(('1011011','1111001'), 6) puis cc1.viterbi_decoder(bits, 'hard').
6

Modulations QAM

BPSK, QPSK, 16-QAM, 64-QAM — mapping et régions de Voronoï

Principe : bits → symboles complexes

La modulation associe un groupe de m bits à un symbole complexe. Plus m est grand, plus le débit est élevé, mais plus le signal est fragile face au bruit. Le codage de Gray garantit que deux symboles voisins ne diffèrent que d'1 bit.

BPSK
1
bit/symbole
QPSK
2
bits/symbole
16-QAM
4
bits/symbole
64-QAM
6
bits/symbole

BPSK (2-QAM) — 1 bit/symbole

bit = 0 → symbole = -1 (partie réelle négative) bit = 1 → symbole = +1 (partie réelle positive) Démodulation : bit = 1 si Re(s) > 0 bit = 0 si Re(s) < 0 Exemple : [1,0,0,1,1,0] → [+1, -1, -1, +1, +1, -1]

Seuil de décision = 0. Canal le plus robuste, utilisé pour PBCH et PDCCH basse qualité.

QPSK (4-QAM) — 2 bits/symbole

bits [b1,b2] → symbole complexe : 00 → -1 - j (Q3 : Re<0, Im<0) 01 → -1 + j (Q2 : Re<0, Im>0) 10 → +1 - j (Q4 : Re>0, Im<0) 11 → +1 + j (Q1 : Re>0, Im>0) Démodulation : b1 = 1 si Re(s) > 0 (sinon 0) b2 = 1 si Im(s) > 0 (sinon 0)

4 régions de Voronoï délimitées par Re=0 et Im=0. Utilisé en PDCCH (MCS=2) et PDSCH.

16-QAM — 4 bits/symbole

16 points sur une grille 4×4. Les seuils de décision sont aux valeurs ±2 (partie réelle et imaginaire).

Démodulation 16-QAM (Gray coding) : Partie réelle → 2 bits (MSB) Partie imaginaire → 2 bits (LSB) Seuils : -2, 0, +2 (3 seuils → 4 régions par axe) Exemple de mapping : 1000 → (-3-3j) | 1001 → (-3-1j) | 0001 → (-1-3j) | ...
Pour 64-QAM et 256-QAM : même principe avec des grilles 8×8 et 16×16. Seuils aux valeurs paires. Non implémentés dans le TP.
7

Calculs types & Formules

Comment les effectuer étape par étape

Calcul 1 — Taille du PBCH

Le PBCH se décode en premier. Sa taille totale (en bits transmis) est :

Taille totale PBCH = (1 + Nb_users) × 48 bits car chaque sous-canal fait 48 bits (avec FEC Hamming748) Exemple : 4 utilisateurs → (1 + 4) × 48 = 240 bits Nombre de symboles BPSK (1 bit/symbole) : → 240 symboles Nombre de RB (12 sous-porteuses/RB, BPSK → 12 bits/RB) : → 240 / 12 = 20 RB

Calcul 2 — Encodage Hamming748 à la main

Encoder x = [1, 0, 1, 1] avec la matrice D :

On sélectionne les lignes de D correspondant aux bits = 1 : x[0]=1 → ligne 1 : [1 0 0 0 0 1 1 1] x[2]=1 → ligne 3 : [0 0 1 0 1 1 0 1] x[3]=1 → ligne 4 : [0 0 0 1 1 1 1 0] XOR (addition mod 2) des lignes sélectionnées : [1 0 0 0 0 1 1 1] ⊕ [0 0 1 0 1 1 0 1] ⊕ [0 0 0 1 1 1 1 0] = [1 0 1 1 0 1 0 0] y748 = [1, 0, 1, 1, 0, 1, 0, 0] ← 8 bits pour 4 bits d'entrée

Calcul 3 — Taille du PDSCH (bits codés)

À partir des infos du PDCCHU :

-- Bits codés (NF_c) -- NF_c = nb_RB × 12 × log₂(q) où q = taille constellation (BPSK→2, QPSK→4, 16QAM→16) Exemple : 10 RB, QPSK (q=4) NF_c = 10 × 12 × log₂(4) = 10 × 12 × 2 = 240 bits -- Bits payload brut (avant FEC) -- Cas Hamming (taux r = 1/2) : N = NF_c × r = 240 × 0.5 = 120 bits Cas Convolutionnel CC (taux r = 1/2) : NF_c = (1/r) × N + 16 → N = (NF_c - 16) × r N = (240 - 16) × 0.5 = 112 bits -- Bits payload utile (après suppression CRC) -- CRC16 → c = 16 bits Payload utile = N - c = 112 - 16 = 96 bits = 12 octets = 12 caractères

Calcul 4 — Décodage du syndrome Hamming

Vérifier si un mot reçu y = [1,0,1,1,0,1,0,0] est correct :

On extrait les 7 premiers bits (Hamming74) : y74 = [1, 0, 1, 1, 0, 1, 0] Calcul du syndrome ε = H × y74 (mod 2) : H = [0 0 0 1 1 1 1] → ε[0] = 0·1+0·0+0·1+1·1+1·0+1·1+1·0 = 0 (mod2) [0 1 1 0 0 1 1] → ε[1] = 0·1+1·0+1·1+0·1+0·0+1·1+1·0 = 0 (mod2) [1 0 1 0 1 0 1] → ε[2] = 1·1+0·0+1·1+0·1+1·0+0·1+1·0 = 0 (mod2) ε = [0, 0, 0] → Pas d'erreur ✓ Vérifier le 8e bit (parité globale) : Somme mod2 des 7 premiers = 1⊕0⊕1⊕1⊕0⊕1⊕0 = 0 = y74[7]=0 ✓

Calcul 5 — Conversion binaire → décimal (big-endian)

Big-endian : le bit le plus à gauche est le MSB (poids fort) Exemple : [1, 0, 1, 1, 0, 0] → ? = 1×2⁵ + 0×2⁴ + 1×2³ + 1×2² + 0×2¹ + 0×2⁰ = 32 + 0 + 8 + 4 + 0 + 0 = 44 En Python (fonction bin2dec du TP) : "0b101100" = int("0b101100", 2) = 44

Calcul 6 — Sous-porteuses allouées (rappel formule)

Sa = {1 → NRe/2} ∪ {N - NRe/2 + 1 → N} = {1 → 312} ∪ {713 → 1024} En Python (extraction depuis la matrice T/F) : tfMatrix_short = np.concatenate([ tfMatrix[:, 0:312], # sous-porteuses 1 à 312 tfMatrix[:, 712:1024] # sous-porteuses 713 à 1024 ], axis=1) → shape : (14, 624)
8

Tables MCS — Modulation & Coding Scheme

Correspondance valeur MCS → modulation + FEC

MCS du PDCCH (2 bits — dans le PBCHU)

Valeur MCSModulationFECProjet ?
0BPSKHamming748Oui ✓
1BPSKPolar 1/3Non
2QPSKHamming748Oui ✓
3QPSKPolar 1/3Non

MCS du PDSCH (6 bits — dans le PDCCHU) avec Code Convolutionnel

Taux \ ConstellationBPSKQPSK16-QAM64-QAM256-QAM
1/301234
1/256789
2/31011121314
3/41516171819
Valeurs les plus importantes du projet : MCS 6 (CC 1/2 + QPSK) et MCS 7 (CC 1/2 + 16-QAM).

MCS du PDSCH (6 bits) avec Hamming

Code Hamming \ ConstellationBPSKQPSK16-QAM64-QAM256-QAM
1/3 (Ham124)2021222324
1/2 (Ham748)2526272829
2/3 (Ham128)3031323334
3/4 (Ham2416)3536373839
Dans le TP, le PDSCH utilise principalement Hamming748 ou CC 1/2. Mémorise : Ham748 = MCS 25-29, CC 1/2 = MCS 5-9.
9

QCM d'auto-évaluation

15 questions — clique sur "Voir la réponse" pour chaque question

Mode d'emploi : Lis chaque question, choisis ta réponse mentalement, puis clique sur "Voir la réponse" pour vérifier. La bonne réponse est surlignée en vert avec une explication.
0 / 15 répondues