Forum: FPGA, VHDL & Co. Kanalkodierung RS


von WW (Gast)


Lesenswert?

Moin,

ich habe Fragen zum Reed-Solome-Code. Hoffe richtiges Forenabteil, soll 
ja auch aufn FPGA.
Bin grade dabei mich mit Kanalkodierungen zu beschäftigen.
Ich möchte eine Datenübertragung machen die Bits korrigieren kann. Die 
Daten sollen von FPGA zu FPGA versendet werden. Fehler können einzeln 
oder als Bündel auftreten.
Einer der bekanntesten bzw. oft eingesetzten RS-Codes ist wohl der 
RS(255,223).
Das bedeutet aber ja auch, das erst 255 Bits übertragen werden muss, 
damit ich die 223 Nutz-Bits nutzen kann? 16 Bits währen reparierbar?
Weiterhin frage ich mich ob dahinter wirklich eine große Look-Up-Table 
stehen muss oder ob man dafür auch Algorithmus nutzen kann.

Für meinen Anwendungsfall sind nun 223 Nutz-Bits zur Übertragung 
bisschen viel. Vorteil vom RS-Code soll ja auch sein diesen Individuell 
anzupassen.
Ich dachte eher so etwas wie RS(68,64). 64 Nutz Bits und es können bis 
zu 2 Bits in der Übertragung korrigiert werden. Aber war da nicht 
irgendwas mit Primzahlen?
Bei RS(70,64) währen ja sogar 3 Bits korrigierbar?

Ein bisschen eingelesen habe ich mich dementsprechend schon, denke aber 
um Fachliteratur komm ich nicht rum.
Aber bevor ich damit was machen will, was sowieso nicht funktioniert, 
frage ich euch mal um Rat.

Evt. sind ja auch Fire-Codes, CRC-Codes etc besser geeignet.

Gruß
WW

von Polyglotte (Gast)


Lesenswert?

WW schrieb:

Das DSP-Unterforum hier scheint mir geeigneter, weil dergleichen auch 
beim CD-Playern vorkommt.

https://www.ti.com/lit/an/spra686/spra686.pdf

> Ein bisschen eingelesen habe ich mich dementsprechend schon, denke aber
> um Fachliteratur komm ich nicht rum.

Dann schau mal in die Lehrbücher für 
Nachrichtentechnik(Codierungstheorie) oder technische Informatik. Die 
FPGA-hersteller haben auch Applications note dazu. Der ist sehr 
brauchbar ISBN: 978-3486721287

Schau dir mal "Punktierung" an, dass ist ein verfahren um codes an 
Nutzdaten kleiner Wortbreite anzu passen.
https://www.math.uni-bielefeld.de/~baumeist/Codierungstheorie/hauck-Codierungstheorie-1.pdf

> Evt. sind ja auch Fire-Codes, CRC-Codes etc besser geeignet.

Das musste halt selbst bewerten, welche Fehler (Einzeln- ( Unterteil 
nach Hamming-Distanz), Burst) erkennbar sein müßen, welche Hardware zur 
Verfügung steht (Gattergrab, CPLD,FPGA), bitrate, Blocvk oder Stream, 
...

PS:
Nic primzahlen, schau eher nach Galois-Feldern.
PSS:
Wer das Archiv nicht ehrt ist die Auskunft nicht wert ;-)
https://www.google.de/search?q=site%3Amikrocontroller.net+Reed-Solomon&oq=site%3Amikrocontroller.net+Reed-Solomon

von Tim (Gast)


Lesenswert?

WW schrieb:
> Weiterhin frage ich mich ob dahinter wirklich eine große Look-Up-Table
> stehen muss oder ob man dafür auch Algorithmus nutzen kann.

Eine LUT wird für RS wahrscheinlich nicht ausreichen. Das ist 
komplizierter.

WW schrieb:
> Das bedeutet aber ja auch, das erst 255 Bits übertragen werden muss,
> damit ich die 223 Nutz-Bits nutzen kann?

Man muss in der Tat den kompletten Block empfangen haben, um diesen zu 
dekodieren.

Firecodes sind etwas einfacher, können aber auch weniger als RS.

CRC. "Frame prüfen und wiederholen" ist ein klassisches und einfaches 
Verfahren, dem man einer FEC vorzieht, solange man kann. Aber du willst 
dich ja mit FECs beschäftigen.

Ich empfehle dir noch Hamming-Codes, die u.a. in ECC-Memories verwendet 
werden.

Bevor es in den FPGA geht, sollte der Algorithmus in Matlab/Python 
stehen. Dann siehst du auch den Implementierungsaufwand.

von Polyglotte (Gast)


Lesenswert?

Tim schrieb:
> Eine LUT wird für RS wahrscheinlich nicht ausreichen. Das ist
> komplizierter.

Grösser, nicht unbedingt komplizierter.
Da was für lattice-FPGA:

https://www.latticesemi.com/~/media/LatticeSemi/Documents/UserManuals/RZ/ReedSolomonEncoderUsersGuide.PDF?document_id=5930

Es braucht dort ein paar hundert LUT's und ein paar hundert FF, also nix 
besonders grosses, eher medium advanced Pillepalle.

von schlappohr (Gast)


Lesenswert?

Polyglotte schrieb:
> medium advanced Pillepalle.

Der Encoder ja, aber der Decoder ist massiv komplizierter. Nicht ohne 
Grund hat mein Arbeitgeber einen deutlich fünfstelligen Betrag für ein 
RS Encoder/Decoder-Paar auf den Tisch gelegt (allerdings mit ein paar 
Anpassungen an unsere Sonderwünsche)

von Polyglotte (Gast)


Lesenswert?

schlappohr schrieb:
> Polyglotte schrieb:
>> medium advanced Pillepalle.
>
> Der Encoder ja, aber der Decoder ist massiv komplizierter. Nicht ohne
> Grund hat mein Arbeitgeber einen deutlich fünfstelligen Betrag für ein
> RS Encoder/Decoder-Paar auf den Tisch gelegt (allerdings mit ein paar
> Anpassungen an unsere Sonderwünsche)

Naja, bei einem dreistelligen Stundensatz ist man schon vor Ablauf von 4 
Wochen bei einem fünfstelligen Betrag. ;-) +MwSt.

Und zur Entwicklung kommt noch ausgiebiger Test, Doku und Laboraufwände 
...

Das sehen manche Chef's nicht und setzen dann einen fachfremdes 
Greenhorn an das Thema ... so wird dann auch aus Pillepalle ein 
Jahresprojekt (unvollenset).

von Vancouver (Gast)


Lesenswert?

Polyglotte schrieb:
> so wird dann auch aus Pillepalle ein
> Jahresprojekt

Ja, das kommt vor. Aber ein RS-Decoder ist ziemlich nicht-trivial, auch 
für einen erfahrenen Entwickler. Wir haben lange überlegt, ob wir die 
Entwicklung selbst machen sollen un dann entschieden, dass wir das in 
einer akzeptablen Zeit nicht hinbekommen und dann das Teil lieber 
eingekauft.

von dfIas (Gast)


Lesenswert?

Vancouver schrieb:
> Ja, das kommt vor. Aber ein RS-Decoder ist ziemlich nicht-trivial, auch
> für einen erfahrenen Entwickler. Wir haben lange überlegt, ob wir die
> Entwicklung selbst machen sollen un dann entschieden, dass wir das in
> einer akzeptablen Zeit nicht hinbekommen und dann das Teil lieber
> eingekauft.
Falls ihr kein universell konfigurierbares Produkt, was Symbol- und 
Datenwortbreiten, Anzahl korrigierbarer Symbole, Pipeline-Konfiguration 
des Dekoders etc. angeht, eingekauft habt, müsst ihr beim nächsten 
Projekt wieder Geld ausgeben. Gerade beim Dekodieren ist die Einbindung 
in eine Pipeline-Architektur wichtig - das kann man kaum vorab 
spezifizieren, bis der ganze Rest drumrum steht. Ohne Pipeline schafft 
man bei großen Wortbreiten den Spagat zwischen Frequenz und 
Gatterverbrauch kaum.

von M. Н. (Gast)


Lesenswert?

WW schrieb:
> Einer der bekanntesten bzw. oft eingesetzten RS-Codes ist wohl der
> RS(255,223).
> Das bedeutet aber ja auch, das erst 255 Bits übertragen werden muss,
> damit ich die 223 Nutz-Bits nutzen kann? 16 Bits währen reparierbar?

Ja. Du musst alle bits übertragen.

WW schrieb:
> Ich dachte eher so etwas wie RS(68,64). 64 Nutz Bits und es können bis
> zu 2 Bits in der Übertragung korrigiert werden. Aber war da nicht
> irgendwas mit Primzahlen?
> Bei RS(70,64) währen ja sogar 3 Bits korrigierbar?

Im Grunde kannst du dir das ganz so zusammenbasteln, wie du willst.
Das mit den Primzahlen bezieht sich auf das Galois Feld, auf dem die 
Rechenoiperationen ausgeführt werden.

Vereinfacht gesagt funktioniert RS ja über einene Polynominterpolation 
über deine Datenpunkte. Du hast bspw 5 Datenpunkte. Durch 5 Punkte 
kannst du jetzt ein Polynom 5ter Ordnung setzen, das eindeutig bestimmt 
ist. Da gibt es funktional zwei Ansätze: Entweder du legst deine Daten 
d0 bis d4 in ein Koordinatensystem an die stellen (0, d0), (1, d1), ... 
(4,d4) und interpolierst darüber ein Polynom. Oder du nutzt gleich die 
Koeffizienten des Polynoms als Datenträger: also d0*x^5 + d1*x^4 etc...

Mathematisch erstmal egal. Du bekommst auf jedenfall mit beiden Methoden 
ein eindeutiges Polynom (nicht das gleiche, aber eindeutig für jedes 
Verfahren). Für die Redundanzdaten setzt du jetzt in dieses Polynom 
einfach weitere Punkte ein und übermittelst die mit.
Egal welche bits jetzt verloren gehen bzw kaputt gehen, du kannst aus 5 
beliebigen Punkten wieder eindeutlig das Polynom rückrechnen und deine 
Daten rückgewinnen.

Das ist das grobe Prinzip. Das funktioniert so ganz ohne Galois Felder 
und den ganzen Hokus-Pokus. Das Problem daran ist jetzt nur, dass je 
nach Daten es schön wäre, wenn der Wertebereich dieser Koeffizienten 
etc. irgendwie begrenzt wäre. Und da kommen jetzt Galois-Felder ins 
Spiel. Man stellt jetzt fest, dass die ganze schöne Mathematik auch auf 
einem endlichen Zahlenraum funktioniert, wenn man einfach alles mod p 
rechnet. Also bspw. Auf dem Galois-Feld GF(3). Alles mod 3 rechnen und 
gut ist. Wichtig hierbei ist, dass es nur funktioniert, wenn p eine 
Primzahl ist. Leider sind jetzt Primzahlen etwas blöd, weil wir 
theoretisch einen Zahlenraum von 0 bis 255 haben von einem Byte. Und 
"mod 256" ist leider keine Primzahl. Man kann jetzt aber wunderbar 
feststellen, dass die ganze Aktion auch (nahezu) funktioniert, wenn man 
"mod p^n" rechnet. Also eine Potenz einer Primzahl. 2 Ist eine Primzahl 
und 2^8= 256. Also kann man das auf diesem Feld rechnen. Es ändern sich 
ein paar Dinge, damit das mathematisch mit der Modulo-Arithmetik 
weiterhin komplett hinhaut. Aber es geht.

Das ist quasi schon die ganze Magie. Und eigentlich auch alles was du 
brauchst um zu kodieren. Die Fehler-Erkennung ist deutlich aufwendiger, 
da man vereinfacht nicht weiß, welche Punkt ein den Daten kaputt sind. 
Wüsste man das, könnte man einfach schnell durch den Rest wieder ein 
Polynom durchlegen und den kaputten Punkt rückrechnen. Um dieses Problem 
anzugehen, ist im Dekoder bspw. dieses Verfahren notwendig: 
https://en.wikipedia.org/wiki/Berlekamp%E2%80%93Welch_algorithm

Diese Vorlesung ist imho ziemlich gut: 
https://www.youtube.com/watch?v=AjJKl5rsTow

Das erklärt das rechnen auf dem endlichen Zahlenkörper und was man da 
machen muss.

von J. S. (engineer) Benutzerseite


Lesenswert?

Polyglotte schrieb:
>> Der Encoder ja, aber der Decoder ist massiv komplizierter. Nicht ohne
>> Grund hat mein Arbeitgeber einen deutlich fünfstelligen Betrag für ein
>> RS Encoder/Decoder-Paar auf den Tisch gelegt (allerdings mit ein paar
>> Anpassungen an unsere Sonderwünsche)
>
> Naja, bei einem dreistelligen Stundensatz ist man schon vor Ablauf von 4
> Wochen bei einem fünfstelligen Betrag. ;-) +MwSt.

Nun ja, es gibt auch Leute, die das in der Kiste haben und für die 
Hälfte anbieten.

Was mich wundert:

Kein einziger hat bisher das Wichtigste nachgefragt, nämlich die 
Bandbreite? Und was sonst noch so alles rein muss.

Erst wenn das feststeht, kann man entscheiden, ob das (wie 
vorgeschlagen) ein Controller kann oder man einen fertigen Chip nimmt, 
oder man einen FPGA mit Core oder einen FPGA mit selbst gebautem  VHDL 
nimmt.

Ich bin erstaunt, dass trotzdem jeder zu wissen scheint, wie die 
optimale Lösung ist.

von alterweissermann (Gast)


Lesenswert?

Jürgen S. schrieb:
> Kein einziger hat bisher das Wichtigste nachgefragt, nämlich die
> Bandbreite?

Für die reine Kodierung ist die Bandbreite nebensächlich, siehe (Audio-) 
CompactDisc. Wobei bei der CD noch weitere Verfahren neben RS (bspw. 
Interleave) hinzukommen, damit diese Fehler wie Löcher bis 2 mm ⌀ 
wegsteckt.

👴

von WW (Gast)


Lesenswert?

Erstmal vielen Dank an alle. Hab mir mitlerweile auch schon viel dazu 
durchgelesen und auch verstanden. Bin natürlich auch schon am Punkt der 
Fehlerpunkterkennung und Gewichtung. (habs da auch nicht so eilig)

M. H. schrieb:
> Das ist quasi schon die ganze Magie. Und eigentlich auch alles was du
> brauchst um zu kodieren. Die Fehler-Erkennung ist deutlich aufwendiger,
> da man vereinfacht nicht weiß, welche Punkt ein den Daten kaputt sind.
> Wüsste man das, könnte man einfach schnell durch den Rest wieder ein
> Polynom durchlegen und den kaputten Punkt rückrechnen. Um dieses Problem
> anzugehen, ist im Dekoder bspw. dieses Verfahren notwendig:
> https://en.wikipedia.org/wiki/Berlekamp%E2%80%93Welch_algorithm

Jou, da bin ich dabei. Da gibts ja mehrere Dekoder um den Fehlerpunkt zu 
bestimmen. Der BMA baut ja eher auf ein Schieberegister auf um mir das 
Fehlerstellenpolynom zu geben. Bin aktuell am überlegen, auf ein anderes 
auszuweichen, weil ich nicht bit für bit an Daten reinbekomme, sondern 
direkt schon ein Stream an Bytes.
Der Peter-Ziegler wäre für viele Fehlerstellen zu aufwändig und der 
erweiterte Euklidische Divisions Algorithmus hab ich noch nicht genau 
verstanden. Etwas, was gut zu Pipelinen wäre, wäre praktisch, da mir die 
Latenz nicht so wichtig ist.

M. H. schrieb:
> Diese Vorlesung ist imho ziemlich gut:
> https://www.youtube.com/watch?v=AjJKl5rsTow

Ja hat mir den Einstieg sehr vereinfacht, gibt auch noch ne Anschluss 
Vorlesung (glaube aber nur auf deren HP), wird aber auch abgebrochen 
wenn es zur Fehlerstellenerkennung geht.

von J. S. (engineer) Benutzerseite


Lesenswert?

alterweissermann schrieb:
> Für die reine Kodierung ist die Bandbreite nebensächlich,

ich bezog mich auf den Umstand, dass hier u.a. Microcontroller empfohlen 
wurden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.