Welches digitale Modulationsschema eignet sich zur Übertragung digitaler Daten über den Ausgang einer PC-Soundkarte?

8

Ich muss einen Datenstrom mit oder schneller aus einem Computersystem ausgeben, dessen einziges zugängliches Ausgabe-Peripheriegerät das Audio-Interface ist. Diese Schnittstelle hat angemessene Spezifikationen, 96  kHz Abtastrate, mit 24 - Bit - Auflösung, aber die Ausgangsstufe ist AC-gekoppelt. Es ist nur ein Ausgangskanal verfügbar. Eine gute Annahme wäre, dass es sich wie ein Bandpassfilter mit einem Durchlassband von 4  Hz bis 40  kHz mit einer Dämpfung von weniger als - 1  dB verhält ; und dass es ein 90  dB SNR hat. Ich habe keine andere Komplexitätsbeschränkung für den Emitter.40 kbit/s96 kHz24bit4 Hz40 kHz1 dB90 dB

Ich erwarte keine zusätzlichen Störungen / Dämpfungen am Kabel, das den Sender mit dem Empfänger verbindet.

Der Empfänger ist ein eingebettetes System mit einer Cortex-M3-MCU. Bei Bedarf kann eine ähnliche Audioerfassungsleistung angenommen werden. Ein zusätzlicher dedizierter Demodulations-Chip (falls es so etwas für so niedrige Frequenzen gibt) könnte eine Option sein.120 MHz

  • Welches digitale Modulationsschema wäre für diese Situation geeignet?
  • Gibt es bereits Codebibliotheken (softwaredefinierte Funkbibliotheken?), Die mich daran hindern würden, das Rad neu zu erfinden?
  • Gibt es Anwendungen mit ähnlichen Einschränkungen, bei denen ich nach Inspiration suchen könnte?
Pichenettes
quelle
Ich nehme an, es wird nicht über Lautsprecher gehen?
Jim Clay
Nein, nur kurze Verkabelung zwischen Soundkartenausgang und Receiver.
Pichenettes

Antworten:

8

Sie haben hier ziemlich gute Umstände; Sie sollten in der Lage sein, Ihr Ziel ohne allzu große Probleme zu erreichen. Ich sehe in Ihrer Beschreibung nichts, was eine ganze Klasse von Modulationen eliminieren würde (z. B. Phasenumtastung , Frequenzumtastung usw.). Einige der Faktoren, die bei der Auswahl eines geeigneten Formats eine Rolle spielen würden, wären:

  • Die erforderliche spektrale Effizienz (dh wie viel Datendurchsatz Sie im Verhältnis zur verfügbaren Bandbreite benötigen)
  • Die Komplexitätsanforderungen für Ihren Empfänger (der normalerweise der komplizierteste Teil des Systems ist)
  • Wie viel Aufwand Sie bereit sind, in die Entwicklung der Implementierung zu investieren.
  • Andere anwendungsspezifische Umstände (z. B. wenn Sie an einem oder beiden Enden eine schlechte Timing-Genauigkeit, bekannte Interferenzen oder eine schlechte Kanalantwort haben)

Wenn Sie diese für Ihr System einzeln ankreuzen, können wir einige Richtlinien erstellen:

  • Es scheint, dass Ihre größte Einschränkung Ihre Kanalantwort ist (die durch den DAC Ihrer Soundkarte begrenzt wird). Wenn Sie eine einseitige Bandbreite von 40 kHz zur Verfügung haben, sind Sie auf eine Symbolrate beschränkt, die etwas darunter liegt. Für eine Zieldatenrate von mindestens 40 Kilobit pro Sekunde benötigen Sie ein Schema, das mehrere Bits pro Symbol überträgt.

  • Vorausgesetzt, Ihre eingebettete Plattform ist nicht mit zu vielen anderen Funktionen belastet, sollte ein moderner 120-MHz-ARM-Prozessor die Demodulation fast aller Formate im Bereich von zehn Kilobit pro Sekunde problemlos verarbeiten können.

    Ich bin mir nicht sicher, mit welchem ​​Modell Sie arbeiten, aber viele neuere Prozessoren bieten eine sehr enge Integration der integrierten ADCs in das Speicher- und Interrupt-Subsystem, sodass Sie möglicherweise (ohne manuelle CPU-Intervention) das Eingangssignal automatisch an einem bestimmten Wert abtasten können Speichern Sie die Samples im Onboard-Speicher und lösen Sie einen Prozessor-Interrupt nur aus, wenn ein Sample-Block bestimmter Größe zur Verarbeitung verfügbar ist. Ich weiß, dass zumindest einige Atmel-Geräte diese Art von Funktionalität bieten. Ich habe in der Vergangenheit gute Erfolge mit ihnen erzielt.

  • Ich gehe davon aus, dass dies wahrscheinlich eine Komponente eines größeren Systems ist, sodass Sie nicht etwas wirklich Komplexes erstellen müssen, um Ihre Anforderungen zu erfüllen. Glücklicherweise sollten Sie, basierend auf dem, was Sie gesagt haben, in der Lage sein, etwas zu implementieren, das Ihren Anforderungen ziemlich einfach entspricht. Ich gehe davon aus, dass Sie wahrscheinlich ein sehr hohes Signal-Rausch-Verhältnis (40 dB oder mehr) haben, das für digitale Modulationen normalerweise als gemessen wird, da die beiden Geräte miteinander verkabelt sindEbN0

  • Was die besonderen Umstände angeht, würde ich für dieses System nicht viel erwarten. Ich würde erwarten, dass die Oszillatorgenauigkeit auf der PC-Seite ziemlich gut ist (bei einem Minimum kristallgesteuert , also im Bereich von <50 ppm oder so; möglicherweise viel besser, wenn der Oszillator mit einer anderen präziseren Quelle kalibriert wird ). Die eingebettete Seite ist wahrscheinlich dieselbe. Ich gehe davon aus, dass Sie einen Quarzoszillator als Taktquelle verwenden. Da die beiden Enden miteinander verkabelt sind, gehe ich davon aus, dass Sie keine nennenswerten Störungen haben.

Wenn ich all dies zu einer einzigen Empfehlung zusammenfasse, würde ich wahrscheinlich den Weg eines Quadratur-Phasenumtastungs-Ansatzes (QPSK) mit 24 Kilosymbolen pro Sekunde beschreiten . Bei 2 Bit pro Symbol ergibt sich eine Datenrate von 48 Kilobit pro Sekunde, die Ihre Anforderungen übersteigt. Diese spezielle Rate erleichtert Ihre Implementierung ein wenig. Da der Ausgangs-DAC mit 96 kHz läuft, ergeben sich 4 Abtastwerte pro Symbol (es ist immer einfacher, mit einer ganzzahligen Anzahl von Abtastwerten pro Symbolzeit zu arbeiten). Ich würde wahrscheinlich versuchen, die eingebettete Seite so zu gestalten, dass sie wenn möglich mit derselben 96-kHz-Rate abtastet. Dies vermeidet die Notwendigkeit, ein Resampling am ressourcenarmen Ende durchzuführen.

Um Probleme mit der DC-Kerbe zu vermeiden, die Ihr Soundkarten-DAC verwendet, können Sie das QPSK-Signal mit 24 kHz auf einen Träger modulieren. Dann würde das Spektrum des modulierten Signals bei DC eine Null haben, was mit Ihrer Kerbe übereinstimmen würde. Es ist möglich, dass die Kerbe überhaupt kein Problem darstellt (insbesondere, wenn sie wirklich nur ein paar Hz breit ist, wie Sie vorgeschlagen haben). In diesem Fall könnten Sie möglicherweise mit einem noch einfacheren Schema auskommen, das nur im Basisband funktioniert und die Trägermodulation insgesamt umgeht.

QPSK ist aufgrund seiner Einfachheit sowohl beim Sender als auch beim Empfänger eine gute Wahl. Bei Ihrem SNR könnten Sie mit einem komplizierteren Schema wie der Quadraturamplitudenmodulation (QAM) eine größere spektrale Effizienz erzielen , aber die Eigenschaft der konstanten Hüllkurve von PSK-Signalen ist vom Standpunkt der Empfängerkomplexität aus attraktiv. Wenn Sie in Zukunft wirklich mehr Bits pro Symbol benötigen, können Sie zu einer PSK-Konstellation höherer Ordnung wie 8- oder 16-PSK wechseln. Diese sind jedoch im Hinblick auf die Leistung der Bitfehlerrate im Vergleich zu QAM-Konstellationen suboptimal.

Was eine Bibliotheksimplementierung angeht, ist mir nichts bekannt, was Sie einfach vorbeischauen könnten, insbesondere für eine eingebettete Plattform. Ihre Empfängerimplementierung ist wahrscheinlich in gewissem Maße mit der Hardwareschnittstelle verbunden. Möglicherweise finden Sie einige vorhandene Implementierungen für die verschiedenen Schritte, die für den Demodulator erforderlich sind, aber Sie müssen mindestens das anpassen, was Sie möglicherweise finden, um auf Ihrer Plattform gut zu funktionieren. Das GNU Radio- Projekt ist ein guter Ort, um nach C ++ - Implementierungen vieler verschiedener Kommunikationssignalverarbeitungsvorgänge zu suchen, und es bietet möglicherweise sogar einen nützlichen Rahmen für die Implementierung des Senders an Bord Ihres PCs. Zusammenfassend umfassen die allgemeinen Schritte, die Ihr Empfänger ausführen müsste, Folgendes:

  • Wenn eine Trägerfrequenz ungleich Null verwendet wurde:

    • Frequenzsynchronisation: Lokalisieren und verfolgen Sie den Trägerfrequenzversatz aufgrund von Oszillatorfehlanpassungen zwischen Sender und Empfänger (in vielen Fällen ist dieser Frequenzversatz über die Zeit ungefähr konstant).
    • Trägerdemodulation: Übersetzen Sie das Signal in das Basisband und erhalten Sie zwei gleichphasige und Quadratursignale (I / Q) (häufig als komplexes Basisbandsignal ausgedrückt ).
  • Angepasste Filterung: Leiten Sie das Basisbandsignal durch ein Filter, das an die am Sender verwendete Impulsform angepasst ist (Sie können wahrscheinlich mit einem Rechteckimpuls davonkommen).
  • Zeitsynchronisation: Lokalisieren und verfolgen Sie die Zeiten, die Symbolübergängen entsprechen. Dies kann durch Verfolgen der Spitzenpositionen in der angepassten Filterausgabe modulo der Symbolzeit erfolgen
  • Bit Slicing: Konvertieren Sie die angepassten Filterausgaben zu Symbolabtastzeiten in harte Bitentscheidungen
  • Serialisierung: Stellen Sie sicher, dass Sie die mehreren Bits pro Symbol in der richtigen Reihenfolge ausschreiben!

Dies mag nach einem komplizierten Prozess klingen, aber der Bau eines praktischen Empfängers für eine einfache Situation wie diese kann sehr aufschlussreich sein. Kommentieren Sie einfach, ob ich noch etwas ausgelassen habe.

Jason R.
quelle
Danke für die Hinweise! Ich habe etwas, das in der Simulation gut funktioniert, jetzt auf die eigentlichen Plattformen zu portieren. Ich habe mit QPSK angefangen und gesehen, wie weit ich mit 256-QAM gehen kann. 256-QAM scheint robust gegenüber der Art von Rauschen zu sein, die ich erwarten würde, wenn ich nur den in meiner MCU integrierten SAR-DAC anstelle eines externen Audio-Codecs verwenden würde. Ich werde dafür DMA verwenden, also füllt es direkt einen Puffer im RAM und ich verarbeite Daten mit Blöcken von jeweils 16 Abtastwerten. Am schwierigsten war es, meine lokalen Q / I-Signale auszurichten. Ich habe dem Protokoll eine periodische Synchronisierungssequenz hinzugefügt, um die pi / 2-Inertude zu beheben.
Pichenettes
106
Wenn Sie QAM verwenden (oder ein anderes Schema, das Amplitudenmodulation enthält), müssen Sie der Liste am Ende meiner Antwort einen weiteren wichtigen Block hinzufügen: Sie benötigen eine Art Verstärkungsregelungsmechanismus. Grundsätzlich müssen Sie entscheiden, wo in der Ebene die Entscheidungsbereiche für jeden Symbolwert platziert werden sollen. Ein Ansatz besteht darin, einen automatischen Verstärkungsregelkreis zu verwenden, um die durchschnittliche Leistung des Signals auf einen bestimmten Wert zu zwingen, und dann die Entscheidungsbereiche für diesen durchschnittlichen Leistungspegel entsprechend zu strukturieren.
Jason R