Hallo,
ich möchte die Daten die ich mit einem RFM12 Modul übertrage vorher
durch einen Scrambler schieben, um ein gleichanteilsfreies Signal zu
haben. Recherchen im Netz haben ergeben dass man so etwas mit linear
rückgekoppelten Schieberegistern (LFSR) macht.
http://de.wikipedia.org/wiki/Scrambler_%28Telekommunikation%29
Es gibt auch noch verschiedene Untertypen (additive und multiplikative)
Scrambler, nur bin ich mir unschlüssig welcher Typ und welche
Polynomlänge für meinen Zweck der geeignete ist. Es gibt seit langem
einen "prominenten" Vertreter, nämlich den G3RUH Scrambler für 9k6
Packet Radio im Amateurfunk. In einer Beschreibung dieses Scramblers
heißt es dass "der Scrambler als rückgekoppeltes Schieberegister
realisiert wird, der Descrambler als nicht-rückgekoppeltes". Wie
funktioniert das?
>Willst du die Daten selbst modulieren? Das macht doch alles dein RFM 12
Ja, der RFM12 moduliert die Daten die ihm gegeben werden als FSK. Das
funktioniert meines Erachtens folgendermaßen; man hat eine
Mittenfrequenz f0, z.B. 434,700 MHz. Würde man nun eine Dauer-0 senden,
so hätte man im Frequenzspektrum einen Strich, ausgehend von 180 kHz
Frequenzhub, bei 434,610 MHz, bei einer Dauer-1 bei 434,790 MHz. Der
Empfänger muss nun anhand des empfangenen Signals entscheiden, ob es
sich um eine 1 oder eine 0 handelt. Da f0 von TX und RX nie gleich sind
(Quarz, Temperatur, Toleranzen...), gibt es im RX eine AFC (automatische
Frequenznachführung). Diese AFC funktioniert aber nicht, wenn der RX die
ganze Zeit nur eine Dauer-0 oder 1 empfangen würde, weil der RX dann f0
nicht "sieht". Genau aus diesem Grund gibt es auch die Präambel (0xAA)
am Anfang, damit die AFC schon mal einregeln kann. Bei langen 0- oder
1-Folgen driftet also der RX weg, weshalb man versucht das zu sendende
Signal "gleichanteilsfrei" zu machen. Eine Dauer-0 oder 1 wäre quasi DC,
0xAA oder 0x55 die höchste vorkommende Frequenz im Spektrum des
Datensignals. Ein Scrambler macht nun aus den Eingangsdaten des TX (auch
z.B. Dauer-0) eine Pseudozufallsfolge, um das Spektrum im unteren
Frequenzbereich zu beschränken.
Eigentlich ist das ganze um o.g. Link schon ganz gut erklärt, nur ist
mir die Ausführung noch etwas unklar, nach der ich hier gefragt habe...
Bei selber Bitrate wirst Du immer ein Muster finden, welches nur 1en
oder 0en am Ausgang erzeugt. Oder Du benötigst auf Empfängerseite eine
Glaskugel ...
Gruß
Jobst
Statt viel Aufwand in den Scrambler zu stecken, würde ich lieber mehr
Prüfzahlen verschicken um kaputte Datenpakete rechtzeitig zu erkennen.
Das ist zwar nicht Deine Lösung, aber die Erkenntnis, daß verschlüsseln
und scrambeln auch Zeit kostet und mehr Fehlermöglichkeiten bietet.
>Ein Scrambler macht nun aus den Eingangsdaten des TX (auch>z.B. Dauer-0) eine Pseudozufallsfolge, um das Spektrum im unteren>Frequenzbereich zu beschränken.
Ein Scrambler vertauscht lediglich Datenpakete in der Reihenfolge
ähnlich wie bei einer Permutation. Das nützt die aber nichts. Für deine
Zwecke reicht es völlig aus, wenn du die zu übertragenden Bytes statisch
mit einer alterniernden Bitzahlenfolge verknüpfst (xor). Die einfachste
Form wäre das 1. Byte mit 0x55 zu verbinden und das zweite mit 0xaa.
Besser ist es mehrere Bytes zu definieren, z.B. 8 Bytes in einer Tabelle
oder eben den LFSR (bzw. ein CRC-Summengenerator) zu benutzen. Ich
empfehle dir einfach 8 Zufallsbytes die du statisch wählen kannst.
Mal ein ganze blöde Idee:
Du willst doch nur dauer 1sen und dauer 2en vermeiden wegen der
Frequenznachführung.
Warum machst du nicht einfach eine RLE Kompression? Dann sparst Du bei
vielen 1 oder 0 sogar extrem Zeit und RLE ist sehr einfach zu
implementieren und braucht wenig Rechenzeit.
Edit: Mit der gesparten Zeit kannst Du dann ggf. noch mit den hier schon
beschriebenen Methoden zusätzlich eine noch bessere Gleichverteilung
erzielen.
Edit2: Du kannst natürlich auch bessere Kompressionsverfahren nutzen.
Die haben dann die angenehme Eigenschaft, daß man eher verteilte 1sen
und 0en bekommt, brauchen halt aber auch mehr Rechenzeit und
Programmieraufwand.
>Besser ist es mehrere Bytes zu definieren, z.B. 8 Bytes in einer Tabelle>oder eben den LFSR (bzw. ein CRC-Summengenerator) zu benutzen.
Genau das meine ich; es geht ja darum, dass die Warscheinlichkeit, dass
nach dem Scrambler nur noch Nullen oder Einsen rauskommen möglichst
gering ist, und das geht mit einem Scrambler am "vollendetsten". Einfach
mit 0xAA55 verxodern ist vom Prinzip her das Gleiche, nur primitiver, so
dass die o.g. Warscheinlichkeit viel größer ist. Ausserdem sollte doch
durch vernünftiges Scrambeln die Biterrorrate geringer werden?
Mal ganz konkret gefragt, wie implementiert man das hier am besten in C
(irgendwie krieg ich's auch hin, die Betonung liegt hier auf "am
besten"), und vor allem das Wichtigste, womit muss das LFSR
initialisiert werden?
http://www.amsat.org/amsat/articles/g3ruh/109/fig03.gif
Schönen Gruß
Peterle
Schau mal auf Seite 32 vom Datenblatt des CC1100.
Dort nennt sich das Verfahren "Data Whitening". Es wird eine 9-bit
Pseudo-Zufallssequenz benutzt. Die 9 Bit werden alle mit 1
initialisiert.
Zur Implementierung in C steht etwas bei Wikipedia (die englische!)
unter "Linear Feedback Shift Register".
In C sind Galois LFSR wohl besonders effizient zu implementieren.
Die oben von mir genannte EFM ist genau für den Zweck entwickelt worden.
8-Bit Information werden in 14-Bit untergebracht.
Dabei hat man Mindest- und Maximalzeiten bei den Pegeln.
Mindestzeit ist 3 Bits, Maximalzeit 11 Bits.
Die Mindestzeit legt damit die höchste Frequenz und die Maximalzeit die
niedrigste Frequenz fest.
Da die Mindestzeit 3 Bit beträgt, kann die Maximale Kanalbitrate 6mal so
hoch sein, wie die höchste übertragbare Frequenz. Durch die
Kanalcodierung erhält man allerdings keine großartig höhere Datenrate.
Gesichert ist aber in jedem Fall der Wechsel des Pegels nach 11-Bit.
Eine weitere Methode, die mir gerade im Kopf umherschwirrt, ist die
Übermittlung eines 9. Bits zu den 8 Datenbits, welches die Polarität der
Daten anzeigt.
Der Sender entscheidet anhand der vorherigen Daten und des aktuellen
Datenworts, ob er dieses Invertiert oder nicht.
Gruß
Jobst