Description du challenge : Years have passed since our satellite was designed, and the Systems Engineers didnât do a great job with the documentation. Partial information was left behind in the user documentation and we donât know what power level we should configure the Telemetry transmitter to ensure we have 10 dB of Eb/No margin over the minimum required for BER (4.4 dB).
Le challenge est disponible Ă cette adresse.
Le but est de compléter un bilan de liaison (budget link) afin de terminer une documentation pour aider des ingénieurs.
Un bilan de liaison compte lâentieretĂ© des gains et pertes dâun Ă©metteur jusquâĂ un rĂ©cepteur dans un systĂšme de communication. En pratique, on en fait un pour la liaison montante et un autre pour la liaison descendante. Ce bilan permet ainsi dâĂ©valuer la performance de son systĂšme.
Lançons le challenge :
> docker run --rm -i -e FLAG=pouet linky:challenge
...
Here's the information we have captured
************** Global Parameters *****************
Frequency (Hz): 12100000000.0
Wavelength (m): 0.025
Data Rate (bps): 10000000.0
************* Transmit Parameters ****************
Transmit Line Losses (dB): -1
Transmit Half-power Beamwidth (deg): 26.30
Transmit Antenna Gain (dBi): 16.23
Transmit Pointing Error (deg): 10.00
Transmit Pointing Loss (dB): -1.74
*************** Path Parameters ******************
Path Length (km): 2831
Polarization Loss (dB): -0.5
Atmospheric Loss (dB): -2.1
Ionospheric Loss (dB): -0.1
************** Receive Parameters ****************
Receive Antenna Diameter (m): 5.3
Receive Antenna Efficiency: 0.55
Receive Pointing Error (deg): 0.2
Receive System Noise Temperature (K): 522
Receive Line Loss (antenna to LNA) (dB): -2
Receive Demodulator Implementation Loss (dB): -2
Required Eb/No for BER (dB): 4.4
Calculate and provide the receive antenna gain in dBi:
Ok, ça fait pas mal dâinformations. PremiĂšre question, on doit calculer le gain de lâantenne rĂ©ceptrice.
1. Calcul du gain
Pour calculer le gain, on va utiliser la formule G = 10log(n4Ïa/λ^2)
(lien formule).
n
-> lâefficacitĂ© de rĂ©ception de lâantenne. Ăa correspond au rapport entre lâĂ©nergie Ă©lectromagnĂ©tique captĂ©e et lâĂ©nergie rĂ©ellement transmise au rĂ©cepteur. Ăa dĂ©pend nottament des matĂ©riaux utilisĂ©s pour fabriquer la parabole, son design et dâautres trucs. Dans notre cas, elle nous est donnĂ©e, elle vaut0.55
.λ
-> la longueur dâonde. On lâa aussi, elle vaut0.025m
.a
-> la surface dâaperture physique de la parabole. Alors, ça on lâa pas mais on peut le calculer facilement. Câest juste la surface rĂ©elle qui capte les ondes. On nous donne le diamĂštre de notre parabole donc au final, sa surface physique, câest juste son aire qui se calcule avec la formuleÏ*r^2
avecr
le rayon.
On peut à présent faire les calculs en Python
par exemple.
>>> import np as np
>>> r = 5.3/2 #m
>>> a = np.pi * r**2 #mÂČ
>>> λ = 0.025 #m
>>> n = 0.55
>>> gain = 10 * np.log10((n * 4 * np.pi * a) / (λ**2)) # dB
>>> print(gain)
53.873341567400146
Entrons cette valeur arrondi pour passer Ă lâĂ©tape suivante :
> docker run --rm -i -e FLAG=pouet linky:challenge
...
Calculate and provide the receive antenna gain in dBi: 53.9
Good job. You get to continue
Receive Antenna Gain (dBi): 54.00
Receive Half-power Beamwidth (deg): 0.33
Receive Pointing Error (deg): 0.2
Receive Pointing Loss (dB): -4.48
Okay, now we know the receive antenna gain.
Calculate and provide the ground terminal G/T (dB/K):
Prochaine tùche, on doit calculer le rapport gain sur température de bruit (G/T) de la station de sol.
2. Calcul du G/T (Gain-To-Noise Temperature)
Le G/T est une mesure de performance dâune antenne, exprimant le gain de lâantenne par rapport au bruit thermique gĂ©nĂ©rĂ©e par les composants internes dâun systĂšme.
Cette fois-ci, on peut utiliser la formule G/T = G - 10log(N)
(lien formule).
G
-> lâantenna gain, on lâa calculĂ© avant, mais attention, on veut le G/T de la station de sol (ground terminal), pas juste de lâantenne donc il faut aussi prendre en compte les pertes de transmission qui nous sont donnĂ©sReceive Line Loss (antenna to LNA) (dB): -2
.N
-> le system noise temperature nous est donnĂ© Ă522K
.
On calcule tout ça :
>>> g = 54
>>> rx_line_loss = -2 #dB
>>> temp = 522 #K
>>> g_t = g + rx_line_loss - 10 * np.log10(temp)
>>> print(g_t)
24.696636537377525
Entrons-la valeur pour passer Ă la suite :
> docker run --rm -i -e FLAG=pouet linky:challenge
...
Calculate and provide the ground terminal G/T (dB/K): 24.7
Nicely done. Let's keep going.
Determine the transmit power (in W) to achieve 10dB of Eb/No margin (above minimum for BER):
SUPER ! On peut passer Ă la derniĂšre Ă©tape.
3. Calcul du Transit Power
Ă prĂ©sent, on doit calculer la puissance dâĂ©mission (transit power) en W
pour atteindre une marge de 10dB
de Eb/No au-dessus du minimum requis pour le taux dâerreur binaire (BER).
Pour la calculer, on va se servir la formule de la PIRE (Puissance Isotrope RayonnĂ©e Ăquivalente) : PIRE = P - L + G
avec :
PIRE
-> endBW
(EIRP en anglais). Ăa sert globalement Ă calculer lâefficacitĂ© dâun systĂšme dâĂ©mission en prenant en compte la puissance de lâĂ©metteur, lâantenne, et la ligne qui relie les deux.P
-> la puissance dâĂ©mission endBW
. (Câest ce que lâon cherche)L
-> les pertes de ligne endB
.G
-> le gain de lâantenne Ă©mettrice endB
.
Voici un exemple de calcul de PIRE :
Retournons la formule pour isoler la puissance dâĂ©mission : PIRE = P - L + G <=> P = PIRE + L - G
.
Malheuresement, la PIRE ne nous ai pas donnĂ© mais on peut la calculer avec le RSSI qui reprĂ©sente le niveau de puissance en rĂ©ception dâun signal. Ce dernier est dĂ©finit par la formule suivante : RSSI = PIRE - L
avec L
les pertes de propagation.
Donc PIRE = RSSI + L
.
3.1 Calculer le RSSI
Le RSSI tient compte du SNR, des pertes de pointages, du G/T et de la constante de Boltzmann. On va chacun les étudier séparément.
3.1.1 SNR
Dans un premier temps, il nous faut calculer le S/N
ou SNR
qui mesure le rapport entre la puissance du signal et le bruit.
Câest lui qui dĂ©termine la qualitĂ© du signal et on peut le calculer avec la formule S/N = Eb/No * 10log(Rb/B)
(lien formule).
Le BER (Bit Error Rate) câest le rapport de bits reçus avec des erreurs par rapport au nombre total de bits transmis. Par exemple :
Le Eb/No quant Ă lui permet de mesurer la qualitĂ© dâun signal numĂ©rique. Câest aussi un rapport mais entre lâĂ©nergie nĂ©cessaire Ă envoyĂ© pour 1 bit
et le bruit. Donc plus le Eb/No est élevée, plus le BER diminue et plus la transmission est fiable.
- Le Eb/No pour le BER, on nous le donne, câest
4.4dB
. DâaprĂšs la question, on sait quâon a une marge de10dB
donc le Eb/No vaudra14.4dB
. - Pour le dĂ©bit binaire, pareil, on nous le donne, câest
10000000.0bps
donc10Mbps
. - Aussi, il faut penser Ă enlever dĂšs maintenant les pertes de dĂ©modulation dues aux imperfections de lâimplĂ©mentation de la dĂ©modulation. Elles nous sont donnĂ©es par
Receive Demodulator Implementation Loss (dB): -2
.
On peut à présent faire le calcul :
>>> import np as np
>>> eb_no = 14.4 #dB
>>> bitrate = 10e6 #bps
>>> demodulator_loss = -2 #dB
>>> s_n = eb_no + 10 * np.log10(bitrate) - demodulator_loss #dB
>>> print(s_n)
86.4
Ce qui nous donne un S/N
de 86.4dB
.
3.1.2 Pertes de pointage de lâantenne rĂ©ceptrice
Lorsque lâantenne nâest pas parfaitement alignĂ©e avec la source du signal, une partie de lâĂ©nergie est perdue. Cette perte doit ĂȘtre prise en compte pour ajuster le calcul de la puissance reçue. Ces pertes peuvent se calculer ainsi : pertes de pointages = -12 * (erreur de pointage/largeur de faisceau)^2
(lien formule).
Pour récupérer la largeur de faisceau de la parabole réceptrice (beam width) on aura besoin de cette formule : BW=(λ/D)*70
avec λ
la longueur dâonde en m
et D
le diamĂštre de la parabole en m
(lien formule).
Enfin, on peut calculer les pertes de pointages :
>>> λ = 0.025 #m
>>> d = 5.3 #m
>>> beamwidth = (λ/d)*70 #m
>>> rx_pointing_error = 0.2
>>> rx_pointing_loss = -12*(rx_pointing_error/rx_beamwidth)**2 #dB
>>> print(rx_pointing_loss)
-4.402677551020408
Ce qui nous donne des pertes de pointage dâĂ peu prĂšs -4.4dB
.
3.1.3 Calcul final du RSSI
à présent, on peut passer au calcul de notre RSSI définit par RSSI = s_n - pointing_loss + boltzmann - G/T
:
>>> import np as np
>>> rx_pointing_loss = -4.4 #dB
>>> boltzmann_j_k = 1.38065e-23 # J/K
>>> boltzmann = 10*np.log10(boltzmann_j_k) #dBW_K
>>> rssi = s_n - rx_pointing_loss + boltzmann - g_t #dBW
>>> print(rssi)
-162.49580056501418
Notre RSSI vaut donc environ -162.5dBW
.
3.2 Calculer les pertes de propagation
On a plusieurs pertes dĂ©jĂ donnĂ©es, il faut juste calculer en plus les pertes de parcours. Elles reprĂ©sentent lâattĂ©nuation naturelle dâun signal lorsquâil se propage due Ă la dispersion de lâĂ©nergie sur une surface de plus en plus grande avec la distance.
La formule est la suivante : Pertes de parcours = -20*log10(λ/(4*Ï*D)
avec λ
la longueur dâonde en m
et D
la distance du parcours en m
(lien formule).
Calculons tout ça :
>>> import np as np
>>> λ = 0.025 #m
>>> d = 2831*1E3 #m
>>> path_loss = 20*np.log10(λ/(4*np.pi*d)) #dB
>>> print(path_loss)
-183.06419449430322
Les pertes Ă prendre en compte sont donc :
Path Loss (dB) : -183 <- qu'on vient de calculer
Polarization Loss (dB): -0.5
Atmospheric Loss (dB): -2.1
Ionospheric Loss (dB): -0.1
Transmit Pointing Loss (dB): -1.74 <- à ne pas confondre avec le Receive Poiting Loss qu'on a calculé plus tÎt pour le RSSI
3.3 Calcul final de la PIRE
Rappellons la formule PIRE = RSSI - toutes les pertes de propagation
et passons aux calculs :
>>> polarization_loss = -0.5 #dB
>>> atmospheric_loss = -2.1 #dB
>>> ionospheric_loss = -0.1 #dB
>>> tx_pointing_loss = -1.74 #dB
>>> tx_eirp = rssi - path_loss - polarization_loss - atmospheric_loss - ionospheric_loss - tx_pointing_loss #dbW
>>> print(tx_eirp)
25.008393929289046
Super, notre PIRE vaut 25dBW
.
3.4 Calcul final du Transit Power
Allez, on y est presque, on rappelle que pour calculer la puissance dâĂ©mission, on doit appliquer cette formule : P = PIRE + L - G
. tx_line_loss
nous est donné égal à -1
. Sa valeur Ă©tant dĂ©jĂ nĂ©gative puisque câest une perte, il faut la soustraire dans notre formule au lieu de lâadditioner. Elle devient donc P = PIRE - L - G
.
>>> tx_line_loss = -1 #dB
>>> tx_antenna_gain = 16.23 #dB
>>> transit_power_dbW = tx_eirp - tx_line_loss - tx_antenna_gain #dBW
>>> transit_power_W = 10**(transit_power_dbW/10) #W
>>> print(transit_power_W)
9.502533141159013
Entrons la valeur :
> docker run --rm -i -e FLAG=pouet linky:challenge
...
Determine the transmit power (in W) to achieve 10dB of Eb/No margin (above minimum for BER): 9.7
Winner Winner Chicken Dinner
...
You got it! Here's your flag:
pouet
Et ça marche, on obtient le flag !
Alors, oui, si vous observez bien, jâai mis 9.7
alors que jâavais trouvĂ© 9.5
. En fait, cette valeur ne fonctionnait pas et je ne trouvais pas oĂč Ă©tait lâerreur. Jâai donc essayĂ© des valeurs voisines et 9.7
a fonctionnĂ© đ.
En rĂ©alitĂ©, si on observe le code source du challenge, on voit quâen fonction de ce que lâon entre comme valeur, les rĂ©ponses peuvent ĂȘtre diffĂ©rentes. Par exemple, la solution officielle utilise comme gain 54
, 24.8
comme G/T et 9.5
comme transmit power. Mais bref, on sâen fiche, lâessentiel, câest dâavoir bien compris comment jouer avec toutes ces valeurs :)