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:
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.