Receveur SDR DVB-T2 en C++

La Radio Défini par Logiciel (Software Defined Radio) est une méthode qui remplace le travail de métal (ce qui, en principe, est bénéfique pour la santé) par la douleur de la programmation. L'SDR est promis à un grand avenir, et son principal avantage réside dans la suppression des restrictions sur la mise en œuvre des protocoles radio. Un exemple est la méthode de modulation OFDM (Orthogonal frequency-division multiplexing), qui n'est devenue possible que grâce à la méthode SDR. Cependant, l'SDR offre également une autre possibilité purement technique : la capacité de contrôler et de visualiser le signal à n'importe quel point arbitraire avec un minimum d'efforts.

L'un des standards de communication intéressants est la télévision terrestre DVB-T2.
Pourquoi faire ? Bien sûr, on peut simplement allumer la télévision sans se lever, mais il n'y a absolument rien à regarder et cela n'est pas seulement mon opinion, c'est un fait médical.

Si on parle sérieusement, le DVB-T2 a été développé avec des capacités très larges, y compris :

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

Il existe une expérience de réception de télévision numérique selon le principe SDR. Le standard DVB-T est présent dans le projet connu GNURadio. Il existe un bloc gr-dvbs2rx pour le standard DVB-T2 (tout cela pour GNURadio), mais nécessitant une synchronisation préalable du signal et il est inspirant (merci spécial à Ron Economos).

Qu'avons-nous ?

Il existe une norme ETSI EN 302 755, décrivant en détail la transmission, mais pas la réception.

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

Il est recommandé de recevoir de tels signaux avec une fréquence d'échantillonnage double (pour ne rien perdre) et à une fréquence intermédiaire supérieure à la largeur de bande (réception par superhétérodyne), afin d'éliminer le décalage en courant continu (DC) et le "fuite" de l'oscillateur local (LO) à l'entrée du récepteur. Les dispositifs respectant ces conditions sont trop coûteux pour une simple curiosité.

SdrPlay avec 10Msps 10bit ou AirSpy avec des caractéristiques similaires est beaucoup moins cher. Ici, il n'est pas question de fréquence d'échantillonnage double et la réception ne peut se faire qu'avec une conversion directe (Zero IF). Par conséquent, (pour des raisons financières) nous passons du côté des adeptes du "pur" SDR avec un minimum de conversion matérielle.

Il était nécessaire de résoudre deux tâches :

  1. Synchronisation. Déterminer le décalage exact de la fréquence radio avec une précision de phase et le décalage de la fréquence d'échantillonnage.
  2. Réécrire la norme DVB-T2 à l'envers.

La deuxième tâche nécessite beaucoup plus de code, mais elle est résolvable par la persévérance et peut être facilement vérifiée à l'aide de signaux de test.

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

La solution de la première tâche dépend fortement des caractéristiques de l'appareil SDR et des capacités de contrôle. Utiliser les fonctions de contrôle de fréquence recommandées, comme on dit, n'a pas réussi, mais cela a permis d'acquérir beaucoup d'expérience en lecture de documentation technique, en programmation, en regardant des séries, en résolvant des questions philosophiques..., en gros, il n'a pas été possible d'abandonner le projet.

La foi en « pure SDR » n'a fait que se renforcer.

Nous prenons le signal tel quel, l'interpolons pratiquement jusqu'à un analogue et en extrayons ainsi un discret, mais ressemblant à l'original.

Schéma de synchronisation :

Receveur SDR DVB-T2 en C++

Ici, tout est selon le manuel. Ensuite, c'est un peu plus compliqué. Il est nécessaire de calculer les écarts. Il existe de nombreuses littératures et articles de recherche comparant les avantages et les inconvénients des différentes méthodes. Dans la classique, c'est « Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Part I et II ». Cependant, je n'ai jamais rencontré d'ingénieur capable et désireux de faire des calculs, donc une approche ingénierie a été appliquée. La même méthode de synchronisation a introduit des perturbations dans le signal de test. En comparant différentes métriques avec des écarts connus (je les ai moi-même introduits), les meilleures pour la performance et la simplicité de mise en œuvre ont été choisies. L'écart de fréquence de réception est calculé en comparant l'intervalle de protection et sa partie répétée. La phase de fréquence de réception et la fréquence d'échantillonnage sont évaluées en fonction de l'écart de phase des signaux pilotes, et cela est également utilisé dans un égaliseur OFDM simple et linéaire.

Caractéristiques de l'égaliseur :

Receveur SDR DVB-T2 en C++

Et tout cela fonctionne bien si l'on sait quand commence un cadre DVB-T2. Pour cela, un 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 y a aussi de nombreuses recommandations utiles pour la réception).

Autocorrélation du signal P1 (le point le plus élevé au début du cadre) :

Receveur SDR DVB-T2 en C++

La première image (il ne reste plus que six mois avant l'image en mouvement...) :

Receveur SDR DVB-T2 en C++

C'est ici que nous découvrons ce qu'est le déséquilibre IQ, le décalage DC et la fuite LO. En général, la compensation de ces distorsions spécifiques à la conversion directe est réalisée dans le pilote du dispositif SDR. Il a donc fallu beaucoup de temps pour comprendre que le fait de sortir les étoiles d'une constellation QAM64 bien ordonnée est le travail des fonctions de compensation. Il a fallu tout déconnecter et écrire sa propre solution.

Et voilà, l'image a commencé à bouger :

Receveur SDR DVB-T2 en C++

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

Receveur SDR DVB-T2 en C++

En résumé, c'est le résultat de faire passer une viande hachée à travers un hachoir à viande. La norme prévoit quatre types de mélange :

  • bit interleaving (mélange de bits avec torsion des colonnes)
  • cell interleaving (mélange des cellules dans le bloc de codage)
  • time interleaving (mélange dans le groupe de blocs de codage)
  • frequency interleaving (mélange des fréquences dans le symbole OFDM)

Au final, nous avons ce type de signal en entrée :

Receveur SDR DVB-T2 en C++

Tout cela est une lutte pour la résistance aux interférences du signal codé.

Conclusion

Maintenant, nous pouvons voir non seulement le signal lui-même et sa forme, mais aussi les informations de service.
Il y a deux multiplexeurs à l'air. Chacun avec deux canaux physiques (PLP).

Une bizarrerie a été remarquée dans le premier multiplexe — le premier PLP a l'étiquette «multiple», ce qui est logique, car il n'est pas seul dans le multiplexe, tandis que le second PLP a l'étiquette «single» et c'est une question.
Encore plus intéressant, la seconde bizarrerie du second multiplexe — tous les programmes sont dans le premier PLP, tandis que dans le second PLP à faible vitesse, il y a un signal d'une nature inconnue. Du moins, le lecteur VLC, qui comprend environ une cinquantaine de formats vidéo et autant d'audio, ne le reconnaît pas.

Le projet 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 aussi d'AirSpy), donc ce n'est même pas une version alpha.

P.S. Pendant que l'article était difficile à écrire, il a été possible d'intégrer dans le projet le PlutoSDR.

Certaines personnes diront tout de suite qu'il n'y a que 6 Msps pour le signal IQ sur la sortie USB2.0, alors qu'il en faut au moins 9,2 Msps, mais c'est un sujet distinct.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster