int8_t LDPC::LDPC_Check(const uint8_t *Data) // 20 data bytes followed by 6 parity bytes { uint8_t Errors=0; for(uint8_t Row=0; Row<48; Row++) { uint8_t Count=0; const uint8_t *Check = (uint8_t *)LDPC_ParityCheck[Row]; for(uint8_t Idx=0; Idx<26; Idx++) { Count+=u32Count1s(Data[Idx] & pgm_read_byte(Check+Idx)); } if(Count&1) Errors++; } return Errors; }
void LDPC::LDPC_Encode(const uint32_t *Data, uint32_t *Parity, const uint32_t ParityGen[48][5]) { uint8_t ParIdx=0; Parity[ParIdx]=0; uint32_t Mask=1; for(uint8_t Row=0; Row<48; Row++) { uint8_t Count=0; const uint32_t *Gen=ParityGen[Row]; for(uint8_t Idx=0; Idx<5; Idx++) { Count+=u32Count1s(Data[Idx] & pgm_read_dword(Gen+Idx)); } if(Count&1) Parity[ParIdx]|=Mask; Mask<<=1; if(Mask==0) { ParIdx++; Parity[ParIdx]=0; Mask=1; } } }