예제 #1
0
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; 
}
예제 #2
0
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;
        }
    }
}