Ich versuche, Binärdaten über einen Audiokanal (Lautsprecher / Mikrofon) von einem Gerät zum anderen zu übertragen. Ich verwende AFSK (Audio Frequency Shift Keying) wie bei Packet Radio, mit und zwei Frequenzen und . Ich habe ein bisschen in Ruby herumgespielt und meine erste Implementierung imitiert einfach einen klassischen inkohärenten Demodulator, der bis jetzt gut funktioniert.
Das Problem ist, ich versuche, dies auf eine mobile Plattform zu portieren, bei der die Leistung ein Problem darstellt und meine aktuelle Lösung zu langsam ist. Ich habe zahlreiche Möglichkeiten gefunden, AFSK in Software zu demodulieren:
- Gleitende DFT (FFT)
- Schiebefilter Görtzel
- Phasenregelkreis
- Nullstelle
Was wäre der richtige Weg? Es stehen einfach zu viele Optionen zur Auswahl. Ich bin sicher, dass es noch mehr Optionen gibt. Vielleicht gibt es noch bessere Lösungen als die oben genannten? Hat jemand überhaupt ein Codebeispiel für mich? Ich mache mir Sorgen um
- Leistung (sollte auf einer mobilen Plattform ausgeführt werden, z. B. einem iOS- oder Android-Gerät)
- Stabilität (sollte etwas Lärm vertragen)
Anregungen und Hinweise werden sehr geschätzt!
quelle
Antworten:
Ich denke, dass Sie die beste Leistung in Bezug auf die Demodulator-Bitfehlerrate (BER) mit einer Phasenregelschleife erzielen können. Sie müssen jedoch schnell sein. Ich denke, Ihre beste Wahl für einen schnellen Algorithmus, der noch einigermaßen gut funktioniert, ist der Nulldurchgang.
Als Randnotiz möchte ich vorschlagen, dass Sie die 2200 Hz in 2400 Hz ändern. Eine naive Implementierung des 1200/2200-Hz-Schemas würde Diskontinuitäten ergeben, wie etwa zwei Drittel in der Darstellung unten zeigen, wo die 2200-Hz auf 1200-Hz übergehen.
Um die Bandbreite, die Sie verwenden, zu minimieren und Diskontinuitäten zu vermeiden, die das Signal verzerren, müssen Sie die Phase kontinuierlich machen. Selbst wenn Sie die Sendephase kontinuierlich machen, wird es immer noch das Problem geben, dass die 2200-Hz-Symbole aufgrund der unterschiedlichen Phasen nicht immer die gleiche Anzahl von Nulldurchgängen aufweisen. Normalerweise haben sie vier Nulldurchgänge, aber manchmal haben sie drei. Die 1200-Hz-Symbole haben dagegen immer zwei Nulldurchgänge, da sich die Baudrate gleichmäßig in die FSK-Frequenz aufteilt.
Sie können beide Probleme lösen, indem Sie 2200 Hz auf 2400 Hz ändern. Dann beginnen und enden die Symbole immer bei 0 Grad (wodurch sie automatisch phasenkontinuierlich werden) und sie haben immer die gleiche Anzahl von Nulldurchgängen - zwei und vier.
quelle
Ich habe einen Decoder für AFSK (Bell 202 Standard) mit Korrelationsempfängern für 1200 Hz und 2200 Hz hergestellt, mit sehr guten Ergebnissen.
Da die Phase des Signals während eines Symbols unbekannt ist, besteht eine Lösung darin, im komplexen Bereich zu arbeiten: anstatt mit reellen Sinuskurven zu multiplizieren, multiplizieren Sie mit komplexen Exponentialen. Dies bedeutet, dass Sie unabhängig mit und multiplizieren , diese dann integrieren und den absoluten (quadratischen) Wert berechnen.Sünde cos
Die resultierende Amplitude ist völlig unabhängig von der Signalphase und das Ausgangs-SNR ist sehr gut.
quelle
Im Fall von RTTY 45.45 Baud haben Sie auch Symbole, die keine ganzzahlige Anzahl von Samples sind. Sie benötigen daher eine Funktion, die jedes Sample aufrufen und dann in ihrem Rückgabewert signalisieren kann, wenn dieses Symbol beendet ist. Und Sie brauchen einen Phasenakkumulator, der die Phase der Sinuswelle genau festhält.
Um Symbole zu senden, deren Länge kein ganzzahliges Vielfaches der Abtastrate ist, benötigen Sie diese Funktion ...
Um es zu verwenden, generieren Sie das nächste Sample der Sinuswelle und rufen Sie diese Funktion auf. Überprüfen Sie dann, ob der Rückgabewert NICHT gleich zwei ist. Wenn es nicht gleich zwei ist, fahren Sie mit dem nächsten Symbol fort und entscheiden Sie, ob Sie eine Leerzeichenmarke senden. Rufen Sie dann diese Funktion innerhalb des Codeblocks erneut auf, der ausgeführt wird, wenn Sie festgestellt haben, dass der Rückgabewert ungleich zwei ist.
Und hier ist der Phasenspeicher aus der Rockbox-Firmware mit einer Änderung, um Änderungen in der Amplitude zu ermöglichen (die volle Lautstärke beträgt 32767, die volle Lautstärke ist um 180 Grad phasenverschoben -32768).
quelle