Hallo zusammen,
ich überlege mir gerade eine Übertragungsart für serielle Daten über
eine Audioleitung. Momentaner Stand ist, dass ich die logischen Pegel
einer einfachen 1200 Baud UART mittels FSK moduliere und entsprechend
beim Empfänger wieder demodulieren möchte.
Jetzt das Problem: Wie erkenne ich beim Empfänger, dass ein Startbit
vorliegt? Die Detektion der beiden Spektralkomponenten geschieht über 2
Goertzel-Filter. Allerdings ist mir nicht klar, über wieviele Samples N
ich die Filter laufen lassen soll, um nichts zu "verpassen" und dennoch
die Synchronisation bzgl. nachfolgender Bits zu gewährleisten?
Meine bisherige Idee wäre, N zunächst möglichst klein zu wählen und
sobald das Filter eine Frequenz (=Startbit) erkennt, N auf die Anzahl
der Samples pro Symbol bei gegebener Abtastrate zu setzen. Wäre das ein
praktikabler Weg?
Vielleicht noch wichtig zu wissen: Die UART wird nicht auf einem µC
implementiert, sondern in einer PC-Software.
Beste Grüße
hier Beitrag "Digitale FSK Demodulation mit Goertzel Algorithmus" wird ein
anderer, aber aus meiner Sicht interessanter Ansatz verfolgt:
IQ-Demodulator, Drehung der Phase (welche sich ganz ohne trigonometrie
bestimmen lässt) ist bereits dein Nutzsignal
Danke für den Tipp. Leider sind bei mir alle Frequenzen fest vorgeben:
Baudrate: 1225
Logisch 0: 4900 Hz
Logisch 1: 7350 Hz
Abtastrate: 44100, 48000 oder 96000 Hz, je nach Umgebung.
Damit fällt - zumindest nach meinem Verständnis - ein I&Q-Verfahren
raus. Ich lasse mich da aber sehr gerne eines Besseren belehren!
ich denke das sollte trotzdem gehen...
Mittenfrequenz: (4900+7350)/2 = 6125 Hz
4-fach abtasten: 24500Hz
andersrum: 48000 Hz, jedes zweite Sample verwenden: 24000 Hz, dividiert
durch 4 = 6000 Hz, nicht weit daneben. Damit liefe halt die Phase in
eine Richtung schneller als in die andere...
Blöderweise habe ich nicht die Wahl zwischen 44.1, 48 und 96 KHz, das
kann sich von System zu System ändern.
Ich habe trotzdem mal deine Beispielrechnung simuliert mit MATLAB (Code
aus deinem vorherigen Link):
Das Ergebnis (siehe Plot) ist zumindest für 44.1 KHz so nicht zu
gebrauchen, da werde ich wohl doch bei meinen Goertzeln bleiben.
Hättest du denn eventuell eine Idee, wie ich ein Startbit anständig mit
Goertzel-Filtern detektieren könnte?
ich kenn mich leider mit matlab genau gar nicht aus, aber könnte dein
Fehler hier liegen: im Original wird jedes 4. Sample für I verwendet
(4*n) und jedes (4*n+1)te für Q. Du solltest aber doppelt so schnell
abtasten, also 8*n bzw. 8*n+2 (note the "+2")
Ansonsten lass ich mal den Signalverarbeitern hier den Vortritt :-)
Michael Reinelt schrieb:> Du solltest aber doppelt so schnell abtasten
Das tue ich bereits, indem ich nicht deine rechnerischen 24.5 KHz als
Samplingfrequenz nehme sondern eben 44.1 KHz.
Dennoch vielen Dank für deine Gedanken!
Trakuna schrieb:> Michael Reinelt schrieb:>> Du solltest aber doppelt so schnell abtasten>> Das tue ich bereits, indem ich nicht deine rechnerischen 24.5 KHz als> Samplingfrequenz nehme sondern eben 44.1 KHz.
Ja! Aber wenn du doppelt so schnell abtastest, musts du auch die
Auswertung von 4*n bzw 4*n+1 verdoppeln auf 8*n bzw 8*n+2
Hmm, einleuchtend! :-D
Dennoch sind die Ergebnisse unbrauchbar, die Abweichung von der idealen
Abtastrate ist zu groß, die Fehler sind leider nicht ignorierbar.
Wenn du schon mit FSK arbeiten willst, dann solltest du dir merken, daß
dein Dekodieralgorithmus lediglich das ursprüngliche Sendesignal
wiederherstellen kann, also hi oder lo
-->Modulator-->Transmission-->Demodulator--> hi oder lo. Mehr nicht,
auch keine Startbiterkennung. Was dann ein anschließender
Protokoll-Detektor draus macht, kommt dahinter und ist wirklich ein
anderes Thema als deine FSK-Modulation.
W.S.
W.S. schrieb:> Was dann ein anschließender> Protokoll-Detektor draus macht, kommt dahinter und ist wirklich ein> anderes Thema als deine FSK-Modulation.
Dem stimme ich zu. Nach der FSK-Demodulation kommen die Nullen und
Einsen raus und die musst du dekodieren!
Für die Startbit-Detektion siehe
Beitrag "Woran erkennt ein UART eigentlich das Startbit?"
W.S. schrieb:> Was dann ein anschließender> Protokoll-Detektor draus macht, kommt dahinter und ist wirklich ein> anderes Thema als deine FSK-Modulation.
Gut, das sehe ich natürlich ein. Dann stufe ich meine Frage mal ein
klein wenig zurück: Welche Fenstergröße macht Sinn für eine
Demodulation? Ich fange mit meiner Frequenzerkennung ja leider nicht
passgenau zu Signalbeginn an.
Ich hab mich jetzt nochmal etwas mit dem IQ-Demodulator gespielt. Da ich
Mathematica weder habe noch bedienen kann, hab ich eine kleine
Simulation in Perl programmiert.
Wenn ich da keinen groben Schnitzer eingebaut habe, spricht das Ergebnis
für sich: das funktioniert nicht nur gut, sondern saugut!
Blau ist dein Nutzsignal, abgetastet mit 48kHz. Wechselt zwischen 4900Hz
und 7350Hz mit einer Rate von 1225 Hz. X-Achse ist skaliert auf die
Baudrate.
Rot ist der erkannte Phasor. Verschoben primär deshalb, weil die
Erkennung nur alle 8 samples läuft.