mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 09:07:27 -05:00
edac: correct Golay(24,12) words that are not at the start of the message (#2631)
Golay24.checkAndCorrect indexed the word from bit 0 (getInt(0, 22), xor(12, ...), flip(index)) and took the parity over the whole message, so it was only right for a message that is exactly one 24-bit word. P25 TDULC words 2-12 and the DMR voice superframe words at 24 and 48 were "corrected" in the wrong bits. Decode any other word in a 24-bit copy and write it back. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -68,6 +68,29 @@ public class Golay24
|
||||
*/
|
||||
public static int checkAndCorrect(CorrectedBinaryMessage message, int startIndex)
|
||||
{
|
||||
//The correction below indexes the word from bit 0 and takes the parity over the whole message, so it is only
|
||||
//correct for a message that is exactly the 24-bit word. Decode any other word in a 24-bit copy.
|
||||
if(startIndex != 0 || message.size() != 24)
|
||||
{
|
||||
CorrectedBinaryMessage word = new CorrectedBinaryMessage(24);
|
||||
int original = message.getInt(startIndex, startIndex + 23);
|
||||
word.load(0, 24, original);
|
||||
int result = checkAndCorrectWord(word);
|
||||
int corrected = word.getInt(0, 23);
|
||||
message.load(startIndex, 24, corrected);
|
||||
message.incrementCorrectedBitCount(Integer.bitCount(original ^ corrected));
|
||||
return result;
|
||||
}
|
||||
|
||||
return checkAndCorrectWord(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Error detection and correction of a message that is exactly one 24-bit word.
|
||||
*/
|
||||
private static int checkAndCorrectWord(CorrectedBinaryMessage message)
|
||||
{
|
||||
int startIndex = 0;
|
||||
boolean parityError = message.cardinality() % 2 != 0;
|
||||
|
||||
int syndrome = getSyndrome(message, startIndex);
|
||||
|
||||
Reference in New Issue
Block a user