Quel schéma de modulation numérique conviendrait pour transmettre des données numériques via la sortie d'une carte son PC

8

J'ai besoin de sortir un flux de données à 40 kbit/sou plus rapidement hors d'un système informatique dont le seul périphérique de sortie accessible est l'interface audio. Cette interface a des spécifications raisonnables,96 kHz taux d'échantillonnage, avec 24-bitrésolution, mais l'étage de sortie est couplé en courant alternatif. Un seul canal de sortie est disponible. Une bonne hypothèse serait qu'il se comporte comme un filtre passe-bande avec un4 Hz à 40 kHz bande passante avec moins de 1 dBatténuation; et qu'il a un90 dBSNR. Je n'ai aucune autre contrainte de complexité sur l'émetteur.

Je n'attends pas de bruit / atténuation supplémentaire sur le câble reliant l'émetteur au récepteur.

Le récepteur est un système embarqué avec 120 MHzCortex-M3 MCU. Si nécessaire, des performances d'acquisition audio similaires peuvent être supposées. Une puce de démodulation dédiée supplémentaire (s'il existe une telle chose pour des fréquences aussi basses) pourrait être une option.

  • Quel schéma de modulation numérique conviendrait à cette situation?
  • Existe-t-il déjà des bibliothèques de code (bibliothèques radio définies par logiciel?) Qui m'empêcheraient de réinventer la roue?
  • Existe-t-il des applications avec des contraintes similaires sur lesquelles je pourrais trouver l'inspiration?
pichenettes
la source
Je suppose que ça ne passera pas par les haut-parleurs?
Jim Clay
Non, juste un court câblage entre la sortie de la carte son et le récepteur.
pichenettes

Réponses:

8

Vous avez un assez bon ensemble de circonstances ici; vous devriez pouvoir atteindre votre objectif sans trop de problèmes. Je ne vois rien dans la description qui éliminerait toute une classe de modulation (par exemple une modulation par déplacement de phase , modulation par déplacement de fréquence , etc.). Certains des facteurs qui entreraient dans le choix d'un format approprié incluraient:

  • L' efficacité spectrale requise (c'est-à-dire le débit de données dont vous avez besoin par rapport à la bande passante disponible)
  • Les exigences de complexité de votre récepteur (qui est généralement la partie la plus compliquée du système)
  • Combien d'efforts êtes-vous prêt à consacrer au développement de la mise en œuvre.
  • Autres circonstances spécifiques à votre application (par exemple, si vous avez une mauvaise précision de synchronisation à l'une ou aux deux extrémités, une interférence connue ou une mauvaise réponse de canal)

Donc, en les cochant un par un pour votre système, nous pouvons trouver quelques directives:

  • Il semble que votre plus grande contrainte soit la réponse de votre canal (qui est limitée par le DAC de votre carte son). Si vous disposez de 40 kHz de bande passante unilatérale, vous allez être limité à un débit de symboles légèrement inférieur. Pour un débit de données cible d'au moins 40 kilobits par seconde, vous aurez besoin d'un schéma qui transmet plusieurs bits par symbole.

  • À condition que votre plate-forme intégrée ne soit pas chargée avec trop d'autres fonctions, un processeur ARM 120 MHz moderne devrait facilement être capable de gérer la démodulation de la plupart des formats dans la plage de dizaines de kilobits par seconde.

    Je ne sais pas précisément avec quel modèle vous exécutez, mais de nombreux processeurs récents offrent une intégration très étroite des ADC intégrés avec la mémoire et le sous-système d'interruption, ce qui vous permet peut-être (sans intervention manuelle du processeur) d'échantillonner automatiquement le signal d'entrée à une fréquence spécifiée taux, stocker les échantillons dans la mémoire embarquée, et déclencher une interruption du processeur uniquement lorsqu'un bloc d'échantillons d'une certaine taille est disponible pour être traité. Je sais que certains appareils Atmel offrent au minimum ce type de fonctionnalité; J'ai eu beaucoup de succès avec eux dans le passé.

  • Je suppose que c'est probablement un composant d'un système plus vaste, donc vous ne voulez pas avoir à construire quelque chose de vraiment complexe pour répondre à vos besoins. Heureusement, sur la base de ce que vous avez dit, je pense que vous devriez être en mesure de mettre en œuvre quelque chose qui répond à vos besoins assez simplement. Je suppose que puisque les deux appareils sont câblés ensemble, vous êtes susceptible d'avoir un rapport signal / bruit très élevé (40 dB ou plus), qui pour les modulations numériques est généralement mesuré commeEbN0. Cela rend la vie beaucoup plus facile, car vous pourriez probablement ignorer des ajouts comme le codage de correction d'erreurs (ou au moins implémenter un schéma très simple qui capturerait les erreurs très rares que vous attendez avec un tel SNR).

  • En ce qui concerne les circonstances spéciales, pour ce système, je ne m'attendrais pas à grand-chose. Je m'attendrais à ce que la précision de l'oscillateur du côté PC soit assez bonne (au minimum contrôlée par cristal , donc vous êtes dans la plage <50 ppm environ; peut-être beaucoup mieux si l'oscillateur est étalonné en utilisant une autre source plus précise ). Le côté intégré est susceptible d'être le même; Je suppose que vous utilisez un oscillateur à cristal comme source d'horloge. Puisque les deux extrémités sont câblées ensemble, je suppose que vous n'avez pas d'interférence notable.

Donc, en brisant tous ces éléments ensemble dans une seule recommandation, je commencerais probablement le chemin d'une approche en quadrature à décalage de phase (QPSK) à 24 kilosymboles par seconde . À 2 bits par symbole, cela donne un débit de données de 48 kilobits par seconde, ce qui dépasse votre besoin. Ce taux particulier rend votre implémentation un peu plus facile; comme le DAC de sortie tourne à 96 kHz, cela donne 4 échantillons par symbole (il est toujours plus facile de fonctionner avec un nombre entier d'échantillons par temps de symbole). J'essaierais probablement de concevoir le côté intégré pour qu'il échantillonne au même taux de 96 kHz si possible; cela évite d'avoir à rééchantillonner à l'extrémité la plus pauvre en ressources.

Pour éviter tout problème avec l'encoche DC que votre DAC de carte son utilise, vous pouvez moduler le signal QPSK sur une porteuse à 24 kHz. Ensuite, le spectre du signal modulé aurait un zéro à DC, qui s'alignerait avec votre encoche. Il est possible que l'encoche ne finisse pas par être un problème du tout (surtout si elle n'est vraiment que de quelques Hz de large comme vous l'avez suggéré). Dans ce cas, vous pourriez potentiellement vous en tirer avec un schéma encore plus simple qui fonctionne uniquement en bande de base, en contournant complètement la modulation de la porteuse.

QPSK est un bon choix en raison de sa simplicité, tant au niveau de l'émetteur que du récepteur. À votre SNR, vous pourriez obtenir une plus grande efficacité spectrale en utilisant un schéma plus compliqué comme la modulation d'amplitude en quadrature (QAM) , mais la propriété d'enveloppe constante des signaux PSK est attrayante du point de vue de la complexité du récepteur. Notez que si vous avez vraiment besoin de plus de bits par symbole à l'avenir, vous pouvez passer à une constellation PSK d'ordre supérieur comme 8 ou 16 PSK. Cependant, celles-ci sont sous-optimales du point de vue des performances de taux d'erreur binaire par rapport aux constellations QAM.

En ce qui concerne une implémentation de bibliothèque, je ne suis au courant de rien que vous pourriez simplement y déposer et y aller, en particulier pour une plate-forme intégrée. L'implémentation de votre récepteur est susceptible d'être liée à l'interface matérielle dans une certaine mesure. Vous pourrez peut-être trouver des implémentations existantes pour les différentes étapes requises pour le démodulateur, mais vous devrez au moins modifier ce que vous pourriez trouver pour bien fonctionner sur votre plate-forme. Le projet GNU Radio est un bon endroit à regarder si vous voulez simplement voir les implémentations C ++ de nombreuses opérations de traitement du signal de communication différentes, et il pourrait même fournir un cadre utile pour implémenter l'émetteur à bord de votre PC. En résumé, les étapes de haut niveau que votre récepteur devrait effectuer comprendraient:

  • Si une fréquence porteuse non nulle a été utilisée:

    • Synchronisation de fréquence: localisez et suivez le décalage de fréquence de la porteuse en raison de l'inadéquation de l'oscillateur entre l'émetteur et le récepteur (dans de nombreux cas, ce décalage de fréquence sera approximativement constant dans le temps)
    • Démodulation de porteuse: traduire le signal en bande de base, produisant deux signaux en phase et en quadrature (I / Q) (souvent exprimés comme un signal complexe en bande de base ).
  • Filtrage adapté: faites passer le signal de bande de base à travers un filtre adapté à la forme d'impulsion utilisée au niveau de l'émetteur (vous pouvez probablement vous en sortir avec une impulsion rectangulaire)
  • Synchronisation de synchronisation: localisez et suivez les heures qui correspondent aux transitions de symboles; cela peut être fait en suivant les emplacements des pics dans le module de sortie du filtre adapté le temps du symbole
  • Découpage de bits: convertissez les sorties de filtre adaptées aux moments d'échantillonnage des symboles en décisions de bits durs
  • Sérialisation: assurez-vous d'écrire les multiples bits par symbole dans le bon ordre!

Cela peut sembler un processus compliqué, mais la construction d'un récepteur pratique même pour une situation simple comme celle-ci peut être très éclairante. Commentez simplement s'il y a autre chose que j'ai omis.

Jason R
la source
Merci pour les pointeurs! J'ai quelque chose qui fonctionne bien dans la simulation, maintenant à porter sur les plates-formes réelles. J'ai commencé avec QPSK et j'ai vu jusqu'où je pouvais pousser les choses avec 256-QAM. 256-QAM semble être robuste au type de bruit que j'attendrais en utilisant simplement le DAC SAR intégré à mon MCU plutôt qu'un codec audio externe. Je vais utiliser DMA pour cela, donc il remplit directement un tampon en RAM et je traite les données par blocs de 16 échantillons à la fois. La partie la plus difficile consistait à aligner mes signaux Q / I locaux. J'ai ajouté une séquence de synchronisation périodique dans le protocole pour résoudre l'incertitude pi / 2 à ce sujet.
pichenettes
Heureux d'apprendre que vous avez réussi à le simuler. Je vais vous avertir que les constellations QAM d'ordre élevé peuvent nécessiter des implémentations de récepteur complexes à moins que vous n'ayez un canal très bien comporté. Les points de constellation sont si denses que votre système finit par devenir très sensible à la précision de synchronisation de divers types, comme la fréquence / phase de porteuse et la fréquence / phase de synchronisation des symboles. Vous voudrez également vous assurer que vous avez un SNR à une décision difficile d'au moins ~ 25 dB ou plus si vous voulez un faible (inférieur à106) taux d'erreur sur les bits sans correction d'erreur.
Jason R
De plus, si vous utilisez QAM (ou tout autre schéma contenant une modulation d'amplitude), il y a un autre bloc majeur à ajouter à la liste à la fin de ma réponse: vous aurez besoin d'une sorte de mécanisme de contrôle de gain. Fondamentalement, vous devrez décider où dans l'avion placer les régions de décision pour chaque valeur de symbole. Une approche consiste à utiliser une boucle de contrôle de gain automatique pour forcer la puissance moyenne du signal à une certaine valeur, puis structurer les régions de décision en conséquence pour ce niveau de puissance moyen.
Jason R