Première étape
Pour décoder ce signal, je l’ai ouvert dans gnu-radio et j’ai vu que le signal était plutôt propre, on avait une belle constellation… J’ai trouvé la doc officielle et ait essayé de le décoder complètement sous GNU radio avant de réaliser que ce n’était pas possible il manquait des blocs. Je me suis donc tourné vers leansdr qui a un décodeur natif de leandvb.
Après avoir un peu joué avec les différentes options (je ne me souviens plus exactement de ce que j’avais fait), j’ai compris qu’il fallait préciser
- la fréquence d’échantillonage :
-f - la fréquence de symboles :
--sr - le format du fichier:
--f32 - le ratio du code :
--cr
On n’a pas la fréquence d’échantillonnage donc l’essentiel est de garder un facteur constant entre ça et la fréquence de symboles, donc ici j’ai choisi de mettre la même chose, avec un facteur de code de 1/2
./leandvb -f 1000000 --sr 1000000 --cr 1/2 --f32 < ../../../lookup.iq > ../../../output.ts
On décode la première vidéo (ici vous voyez un mp4 et pas le stream mpeg mais c’est la même vidéo)
Deuxième moitié
Félicitations ! Pour cette deuxième étape, le signal est nettement plus bruité et n’est plus en bande de base, il y a également plusieurs échantillons par symboles. Pour limiter la taille du signal, le taux de code 3/4 a été utilisé.
Cette deuxième partie était nettement plus challengeant.
Pour le décoder il faut déjà nettoyer le signal.
Filtrer la porteuse
Encore une fois toutes les valeurs qui suivent dépendent de la valeur de ma fréquence d’échantillonage, je l’ai mise à samp_rate = 1MHz
Je l’ai ouvert sous GNU radio et ait commencé par ouvrir son spectre par FFT. Je vois qu’il est centré sur shift_freq = 135KHz donc j’ai rajouté un rotateur qui incrémentait d’une phase de 2*pi* -shift_freq / samp_rate.
Récuperer la fréquence des symboles
Ensuite la grande complexité était de réussir à trouver la fréquence des symboles. La méthode classique, quand ce n’est pas trop compliqué est d’utiliser un symbol sync une boucle de Costas et d’ajuster leurs valeurs jusqu’à obtenir une belle constellation. Ici je n’y arrivais pas.
Après quelques recherches je trouve qu’on peut la voir en utilisant Complex to Mag couplé à un (classique)QT GUI SINK, on peut observer l’enveloppe du signal. Cette enveloppe nous dit à quelle fréquence on a des changements de symboles. Si le bruit est blanc on devrait avoir une répartition homogène sur l’ensemble du spectre sauf à l’endroit où on a des changements de symboles qui devrait un tout petit peu changer du lot.
On obtient que la fréquence pour lequel on a une bande est de 333kHz donc pour 1/3 de mon samp_rate. On a donc un samples par symbol sps = 3.
Voici une capture d’écran de mon spectre de l’enveloppe du signal centré.

Une fois que j’ai fait ça j’ai à nouveau essayé de mettre mon symbol sync et ma boucle de Costas, je n’obtenais toujours pas du tout une constellation, ni même un disque, juste une patatoïde.
Nettoyer le signal
Passe bas
Quand on observe le spectre du signal on constate quand même beaucoup de bruit, mais qu’il y a une bande qui nous intéresse les -150kHz ; 150kHz donc on va mettre un filtre passe bas qui va couper au dessus à 250kHz. Pourquoi cette valeur, je voulais une valeur au dessus de 150kHz puisque un filtre qui coupe comme un mur n’existe pas, et je ne voulais pas trop atténuer la partie utile.
Voici donc en haut le signal filtré et en dessous le signal d’origine

FFL Band-edge
Ensuite puisque le signal n’arrivait toujours pas à se stabiliser j’ai utilisé un FFL band edge pour essayer de synchroniser la fréquence. Je me disais que ma mesure de fréquence de la porteuse (135 kHz) était peut-être pas si précis que cela, et j’ai trouvé que cette “boîte” pouvait permettre de recentrer le signal plus précisément.
Amplificateur
A ce moment quand je regardais mes spectres j’ai vu que j’avais beaucoup perdu en gain, j’ai donc mis un AGC avant de poursuivre mon traitement.
filtre de FFT RRC
Puisque je n’arrivais toujours pas à faire converger mes symboles j’ai mis un filtre de FFT-RRC pour essayer de minimiser l’interférence entre les symboles pour faciliter le travail du bloc de synchronisation des symboles derrière.
Les paramètre utilisés étaient un roll-off de 0.35 pour favoriser la robustesse, essayer de récuperer les symboles.
Le nombre de taps utilisé était à la discretion de mon LLM qui m’a dit que la valeur standard est de 11*sps, je ne sais pas encore pourquoi.
De ce que j’ai vu en ligne je n’aurais pas du en utiliser un puisque le Symbol sync en a aussi un en entrée et quand on en combine deux on perd en précision, mais bon c’était la seule façon pour moi de réussir à obtenir un symbol sync qui me donne une constellation qui ne soit plus une patate mais un disque et qu’ensuite ma Costas loop puisse la synchroniser et voir un QPSK.
Il va falloir que j’investigue ce point aussi.
Enregistrer le signal nettoyé
leandvb utilise lui aussi un symbol sync et une boucle de Costas, donc il ne faut pas que je lui donne le signal synchronisé en entrée, mais le signal en sortie de mon FFT RRC
J’obtiens donc ce superbe schéma sur GNU radio :

Qui me donne cette constellation

que je peux ensuite traiter avec leandvb et récupérer le stream mpeg. Les options que j’ai utilisé sont
- la fréquence d’échantillonage (encore une fois arbitraire mais doit être cohérente avec le reste)
-f 1000000 - le format
--f32 - le signal rate
--sr 333333 - le ration du code
--cr 3/4 - le flag de debug
-d - encore une aide pour nettoyer le signal si je l’ai mal centré
--drift - viterbi pour réussir à décoder
--viterbimême si le signal est moche
cat noisy-2.iq | ./leandvb --f32 -f 1000000 --sr 333333 --cr 3/4 --drift --viterbi -d > output.ts
J’obtiens donc la vidéo décodée
Merci aux orgas pour ce chall très intéressant qui m’aura fait beaucoup progresser en traitement du signal ! Je pense qu’il y a de nombreuses choses que j’ai utilisées qui ne sont pas encore parfaitement comprises, notamment le fonctionnement exact du RRC sous le capot, mais bon pour une prochaine fois.