Récepteur SDR DVB-T2 en C++

Software Defined Radio est une méthode permettant de remplacer le travail du métal (qui est en fait bon pour la santé) par le casse-tête de la programmation. Les SDR prédisent un grand avenir et leur principal avantage est considéré comme la suppression des restrictions dans la mise en œuvre des protocoles radio. Un exemple est la méthode de modulation OFDM (Orthogonal Frequency Division Multiplexing), qui n'est rendue possible que par la méthode SDR. Mais le SDR offre également une opportunité supplémentaire, purement technique : la capacité de contrôler et de visualiser un signal en tout point arbitraire avec le moindre effort.

L'une des normes de communication intéressantes est la télévision terrestre DVB-T2.
Pour quoi? Bien sûr, vous pouvez simplement allumer la télé sans vous lever, mais il n'y a absolument rien à regarder là-bas et ce n'est plus mon avis, mais un fait médical.

Sérieusement, le DVB-T2 est conçu avec des capacités très étendues, notamment :

  • application intérieure
  • modulation de QPSK à 256QAM
  • bande passante de 1,7 MHz à 8 MHz

J'ai de l'expérience dans la réception de la télévision numérique en utilisant le principe SDR. La norme DVB-T se trouve dans le projet bien connu GNURadio. Il existe un bloc gr-dvbs2rx pour la norme DVB-T2 (le tout pour le même GNURadio), mais il nécessite une synchronisation préalable du signal et c'est inspirant (un merci spécial à Ron Economos).

Ce que nous avons.

Il existe une norme ETSI EN 302 755 qui détaille l'émission, mais pas la réception.

Le signal est diffusé avec une fréquence d'échantillonnage de 9,14285714285714285714 MHz, modulée par COFDM avec 32768 porteuses, dans une bande de 8 MHZ.

Il est recommandé de recevoir de tels signaux avec le double de la fréquence d'échantillonnage (afin de ne rien perdre) et à la fréquence intermédiaire plus de bande passante (réception superhétérodyne), pour éliminer le décalage du courant continu (DC) et les « fuites » de l'oscillateur local. (LO) à l’entrée du récepteur. Les appareils qui satisfont à ces conditions sont trop chers pour la simple curiosité.

SdrPlay avec 10 Msps 10 bits ou AirSpy avec des caractéristiques similaires est beaucoup moins cher. Il n'est pas question ici de doubler la fréquence d'échantillonnage et la réception ne peut se faire qu'en conversion directe (Zero IF). C'est pourquoi (pour des raisons financières), nous passons du côté des adeptes du SDR « pur » avec un minimum de conversion matérielle.

Il fallait résoudre deux problèmes :

  1. Synchronisation. Découvrez l'écart RF précis en phase et l'écart de fréquence d'échantillonnage.
  2. Réécrivez la norme DVB-T2 à l’envers.

La deuxième tâche nécessite beaucoup plus de code, mais peut être résolue avec persévérance et facilement vérifiée à l’aide de signaux de test.

Les signaux de test sont disponibles sur le serveur BBC ftp://ftp.kw.bbc.co.uk/t2refs/ avec des instructions détaillées.

La solution au premier problème dépend fortement des caractéristiques du dispositif SDR et de ses capacités de contrôle. L'utilisation des fonctions de contrôle de fréquence recommandées, comme on dit, n'a pas abouti, mais a donné beaucoup d'expérience en les lisant. documentation, programmation, visionnage de séries TV, résolution de questions philosophiques..., bref, il n'était pas possible d'abandonner le projet.

La foi dans le « DTS pur » n’a fait que se renforcer.

Nous prenons le signal tel qu'il est, l'interpolons presque en analogique et en retirons un discret, mais similaire au vrai.

Schéma fonctionnel de synchronisation :

Récepteur SDR DVB-T2 en C++

Tout ici est conforme au manuel. La suite est un peu plus compliquée. Les écarts doivent être calculés. Il existe de nombreuses publications et articles de recherche comparant les avantages et les inconvénients des différentes méthodes. Parmi les classiques, il s'agit de « Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Part I and II ». Mais je n'ai rencontré aucun ingénieur qui puisse et veuille compter, c'est pourquoi une approche technique a été utilisée. En utilisant la même méthode de synchronisation, un désaccord a été introduit dans le signal de test. En comparant différentes mesures avec des écarts connus (il les a lui-même introduits), les meilleures ont été sélectionnées pour leurs performances et leur facilité de mise en œuvre. L'écart de fréquence de réception est calculé en comparant l'intervalle de garde et sa partie répétitive. La phase de la fréquence de réception et la fréquence d'échantillonnage sont estimées à partir de l'écart de phase des signaux pilotes et ceci est également utilisé dans un égaliseur linéaire simple d'un signal OFDM.

Caractéristique de l'égaliseur :

Récepteur SDR DVB-T2 en C++

Et tout cela fonctionne bien si vous savez quand démarre la trame DVB-T2. Pour ce faire, le symbole de préambule P1 est transmis dans le signal. La méthode de détection et de décodage du symbole P1 est décrite dans la Spécification Technique ETSI TS 102 831 (il existe également de nombreuses recommandations utiles pour la réception).

Autocorrélation du signal P1 (point le plus haut en début de trame) :

Récepteur SDR DVB-T2 en C++

Première photo (il ne reste que six mois avant l'image en mouvement...) :

Récepteur SDR DVB-T2 en C++

Et c'est là que nous apprenons ce que sont le déséquilibre IQ, le décalage DC et la fuite LO. En règle générale, la compensation de ces distorsions propres à la conversion directe est implémentée dans le pilote de périphérique SDR. Il a donc fallu beaucoup de temps pour comprendre : éliminer les étoiles de la sympathique constellation QAM64 est le travail des fonctions de compensation. J'ai dû tout éteindre et écrire mon vélo.

Et puis l'image a bougé :

Récepteur SDR DVB-T2 en C++

Modulation QAM64 avec rotation de constellation spécifique dans la norme DVB-T2 :

Récepteur SDR DVB-T2 en C++

En bref, c'est le résultat du retour de la viande hachée dans le hachoir à viande. La norme prévoit quatre types de mélange :

  • entrelacement de bits
  • entrelacement de cellules (mélange de cellules dans un bloc de codage)
  • entrelacement temporel (c'est aussi dans le groupe des blocs d'encodage)
  • entrelacement de fréquence (mélange de fréquence dans un symbole OFDM)

En conséquence, nous avons le signal suivant en entrée :

Récepteur SDR DVB-T2 en C++

Tout cela est une lutte pour l'immunité au bruit du signal codé.

Total

Nous pouvons désormais voir non seulement le signal lui-même et sa forme, mais également les informations de service.
Il y a deux multiplexes à l'antenne. Chacun dispose de deux canaux physiques (PLP).

Une bizarrerie a été remarquée dans le premier multiplex - le premier PLP est étiqueté « multiple », ce qui est logique, puisqu'il y en a plus d'un dans le multiplex, et le deuxième PLP est étiqueté « unique » et c'est une question.
La deuxième bizarrerie du deuxième multiplex est encore plus intéressante: tous les programmes sont dans le premier PLP, mais dans le deuxième PLP, il y a un signal de nature inconnue à faible vitesse. Au moins le lecteur VLC, qui comprend une cinquantaine de formats vidéo et la même quantité d'audio, ne le reconnaît pas.

Le projet lui-même peut être trouvé ici.

Le projet a été créé dans le but de déterminer la possibilité même de décoder le DVB-T2 à l'aide de SdrPlay (et maintenant d'AirSpy.), ce n'est donc même pas une version alpha.

PS Alors que j'écrivais l'article avec difficulté, j'ai réussi à intégrer PlutoSDR dans le projet.

Quelqu'un dira immédiatement qu'il n'y a que 6 Msps pour le signal IQ à la sortie USB2.0, mais vous avez besoin d'au moins 9,2 Msps, mais c'est un sujet distinct.

Source: habr.com

Ajouter un commentaire