Geschätzes Forum,
ich habe mal RDS-Rohdaten mitgeschnitten und in der XLS-Datei etwas
aufbereitet.
Meine Frage:
Wie kann man die Prüfbits bzw. CRC berechnen, mit der Norm EN50067
(s.Anhang) werde ich nicht schlau.
Vielleicht könnt Ihr mir mal einfach erklären, wie die Berechnung
erfolgt.
Die Prüfbittberechnung ist ein Teil von diesem Projekt:
Beitrag "RDS DECODER analog Schaltung ohne IC gesucht, für Rohdatengewinnung"
Danke
Bernhard
@alle
zu einer kleinen Erkenntnis kam ich.
Beim Gruppentyp "D" ist mir etwas aufgefallen,
wenn alle 16 Datenbits NULL sind,
dann sind die Prüfbits (Checkword und Offset) gleich dem
Tabelleneintrag im Annex A im Page59 der EN50067.
@Detlef Kunz
ich danke Dir, hab mal geschaut, leider blieb der "Aha"-Efekt noch aus.
Bernhard
@Detlef
@alle
wenn ich es richtig deute, dann befindet sich die 2.Schleife in der
1.Schleife.
D.h. bei jedem Schleifendurchlauf der 1.Schleife, wird 10 mal die
2.Schleife durchlaufen?
Mich wundert das gemeinsame "i", beienflussen sich die beiden "i" nicht
gegenseitig?
Bernhard
Nein, das sind zwei seperate Schleifen.
Nur die Klammern sind beim CopyPaste aus irgendeinen Grund verschoben.
Die ganze Einrückung des Textes sieht etwas merkwürdig aus. :(
Bernhard S. schrieb:> Danke für die schnelle Antwort, ich versuch's gerade im Excel> nachzuvollziehen.>> Bernhard
Vergiß nicht die Xor-Verknüpfung des Ergebnis mit dem Offset_Word zum
Schluß!
Das müsste die erste Schleife sein, wenn ich es richtig gedeutet habe.
Ich hoffe es hat sich kein Fehler eingschlichen, denn bis jetzt habe ich
keine Kontrollmöglichkeit.
Detlef, könntest Du mir mal die Zwischenergebnisse der Schleife 1 und 2
zur Verfügung stellen, wenn Data x8000 also 0b1000000000000000 ist?
Die Daten und CRC stammen von einem RDS Mittschnitt, müsste fehlerfrei
sein.
>Vergiß nicht die Xor-Verknüpfung des Ergebnis mit dem Offset_Word zum>Schluß!
ok, ich denke dran ;-)
Bernhard
>Du benutzt aber XNOR
Du hast Recht, hab's geändert.
Hab noch einen 2 Fehler in der Excel-Tabelle:
Bit 10 muss auf "1" getestet werden ich teste Bit 9.
@alle
ein kleiner RDS CRC Prüfbit Rechner Calculator in Excel.
Die 16-Bit Daten können hexadzimal eingegeben werden z.B. D4F1.
Im Ergebnis der Berechnung werden die Prüfsummen für alle Gruppentypen /
RDS Gruppen ausgegeben.
@Detlef
könntest Du mir mal bitte diesen Rechner für x01 bis x20 testen. Habe
jetzt tagelang RDS-Daten mitgeschnitten, aber solche Datenbits wurden
nicht gesendet.
Bernhard
Ja, ich bin begeistert :-)
Der Prüfbit Calculator funktioniert fehlerfrei
Danke
Noch eine Frage, hast Du Dich schon mit dem Matrixverfahren beschäftigt?
Bernhard
>Du willst die Fehlerkorrektur in Excel machen?
Ich dachte die H-Matrix dient auch zur Prüfbitermittlung?
Probieren würde ich es gern in Excel, bevor ich mich an die
Assembler-Programmierung wage.
Bernhard
@alle
Eine VBA Visual Basic Variante.
Ein Datenstring von 26 Bites wird an die Funktion übergeben als Antwort
erhält man eine 0 für Error (z.B. CRC Error), 1 für Gruppe-A, 2 für
Gruppe-B, 3 für Gruppe-C, 4 für die Gruppe-D.
Public Function BERECHNUNG_CRC(INP As String) As Byte
' INPUT: STRING 26 BYTES
' z.B. ("10000000000000000111000011")
' ("11010100111100011010001111")
' OUT:
' 0= Error
' 1=Gruppe A
' 2=Gruppe B
' 3=Gruppe C
' 4=Gruppe D
Dim i As Integer
Dim ZWISCHENERGEBNIS1
Dim ZWISCHENERGEBNIS2
Dim DATA As Double
Dim CRC_OLD As Double
Dim CRC As Double
Dim CRC_GRUPPE_A
Dim CRC_GRUPPE_B
Dim CRC_GRUPPE_C
Dim CRC_GRUPPE_D
'-----------------------------------------------------------------------
------------------
' Länge-Check
If Len(INP) <> 26 Then Exit Function
' DATA UMWANDELN
For i = 0 To 15
DATA = DATA + Mid(INP, 16 - i, 1) * 2 ^ i
Next i
' CRC-OLD UMWANDELN
For i = 0 To 9
CRC_OLD = CRC_OLD + Mid(INP, 26 - i, 1) * 2 ^ i
Next i
'-----------------------------------------------------------------------
------------------
' 1. Schleife 16xDatenbits behandeln
For i = 0 To 15
DATA = DATA * 2 ' DATA 1 x links
If DATA > &HFFFF& Then ' mehr als 16 Bits ?
CRC = CRC * 2 + 1 ' 1 x links und 1 reinschieben
Else
CRC = CRC * 2 ' 1 x links und 0 reinschieben
End If
If CRC > &H3FF& Then
CRC = CRC Xor &H5B9& ' XOR Polynom 0x5B9
End If
DATA = DATA And &HFFFF& ' größer 16 BIT abschneiden
Next i
ZWISCHENERGEBNIS1 = Hex(CRC)
'-----------------------------------------------------------------------
------------------
' 2. Schleife 10xCRC-Bits behandeln
For i = 0 To 9
CRC = CRC * 2 ' CRC 1 x links
If CRC > &H3FF& Then ' mehr als 10 Bits ?
CRC = CRC Xor &H5B9& ' XOR Polynom 0x5B9
End If
CRC = CRC And &H3FF& ' größer 10 BIT abschneiden
Next i
ZWISCHENERGEBNIS2 = Hex(CRC)
'-----------------------------------------------------------------------
------------------
' MASTER-WORD
CRC_GRUPPE_A = CRC Xor &HFC&
CRC_GRUPPE_B = CRC Xor &H198&
CRC_GRUPPE_C = CRC Xor &H168&
CRC_GRUPPE_D = CRC Xor &H1B4&
'-----------------------------------------------------------------------
------------------
' CRC vergleich CRC mit CRC_OLD
BERECHNUNG_CRC = 0
If CRC_GRUPPE_A = CRC_OLD Then BERECHNUNG_CRC = 1
If CRC_GRUPPE_B = CRC_OLD Then BERECHNUNG_CRC = 2
If CRC_GRUPPE_C = CRC_OLD Then BERECHNUNG_CRC = 3
If CRC_GRUPPE_D = CRC_OLD Then BERECHNUNG_CRC = 4
End Function
Naja, es ist nur die Umsetztung dieser CRC-Routine in AVR.
Das Problem: Die Sache der Decodierung ist viel komplexer.
Du solltes doch nochmal in den Source schauen, was dazu alles nötig ist:
https://www.cgran.org/wiki/RDS
>Das Problem: Die Sache der Decodierung ist viel komplexer.
Die einzelnen Gruppen und Blöcke kann ich in Assembler und VBA schon
ganz brauchbar zusammenfügen. Bei vernünftigem RDS-Empfang wird der
Datenstrom nach spätestens 107 Byte synchronisiert
Hab mich mal mit der Fehlerkorrektur beschäftigt und folgendes Programm
geschrieben:
Wenn die CRC-Bits einer Gruppe nicht zu den beiden DATEN-Bits passen,
dann wird nacheinander jedes einzelne Daten und CRC-Bit (26Bit)
invertiert und der CRC-Check durchgeführt.
Die Gruppen-Errors nahmen sofort ab, aber es entstanden plötzlich auch
falsche Grubben und sogar falsche Blöcke.
Bin noch am überlegen, ob sich die Fehlerkorrektur wirklich lohnt, keine
Daten können besser sein als falsche.