예제 #1
0
파일: reedsolomon.c 프로젝트: ARSekkat/gpac
int
correct_errors_erasures (unsigned char codeword[],
                         int csize,
                         int nerasures,
                         int erasures[])
{
	int r, i, j, err;

	/* If you want to take advantage of erasure correction, be sure to
	   set NErasures and ErasureLocs[] with the locations of erasures.
	   */
	NErasures = nerasures;
	for (i = 0; i < NErasures; i++) ErasureLocs[i] = erasures[i];

	Modified_Berlekamp_Massey();
	Find_Roots();


	if ((NErrors <= NPAR) && NErrors > 0) {

		/* first check for illegal error locs */
		for (r = 0; r < NErrors; r++) {
			if (ErrorLocs[r] >= csize) {
				if (RS_DEBUG) fprintf(stderr, "Error loc i=%d outside of codeword length %d\n", i, csize);
				return(0);
			}
		}

		for (r = 0; r < NErrors; r++) {
			int num, denom;
			i = ErrorLocs[r];
			/* evaluate Omega at alpha^(-i) */

			num = 0;
			for (j = 0; j < MAXDEG; j++)
				num ^= gmult(Omega[j], gexp[((255-i)*j)%255]);

			/* evaluate Lambda' (derivative) at alpha^(-i) ; all odd powers disappear */
			denom = 0;
			for (j = 1; j < MAXDEG; j += 2) {
				denom ^= gmult(Lambda[j], gexp[((255-i)*(j-1)) % 255]);
			}

			err = gmult(num, ginv(denom));
			if (RS_DEBUG) fprintf(stderr, "Error magnitude %#x at loc %d\n", err, csize-i);

			codeword[csize-i-1] ^= err;
		}
		return(1);
	}
	else {
		if (RS_DEBUG && NErrors) fprintf(stderr, "Uncorrectable codeword\n");
		return(0);
	}
}
예제 #2
0
int CReedSolomon::correct_errors_erasures (unsigned char codeword [], int csize, int nerasures, int erasures []) {

	int i, err;

	m_NErasures = nerasures;
	for (i = 0; i < m_NErasures; i ++) {
		m_ErasureLocs [i] = erasures [i];
	}
	Modified_Berlekamp_Massey ();
	Find_Roots ();

	if ((m_NErrors <= m_iCorrectCodeSize) && m_NErrors > 0) { 

		/* first check for illegal error locs */
		for (int r = 0; r < m_NErrors; r ++) {
			if (m_ErrorLocs [r] >= csize) {
				return(0);
			}
		}

		for (int r = 0; r < m_NErrors; r ++) {
			int num, denom;
			i = m_ErrorLocs [r];
			/* evaluate m_Omega at alpha^(-i) */

			num = 0;
			for (int j = 0; j < MAX_LENGTH; j ++) {
				num ^= gmult (m_Omega [j], byExpToInt [((255 - i) * j) % 255]);
			}
			/* evaluate m_Lambda' (derivative) at alpha^(-i) ; all odd powers disappear */
			denom = 0;
			for (int j = 1; j < MAX_LENGTH; j += 2) {
				denom ^= gmult (m_Lambda [j], byExpToInt [((255 - i) * (j - 1)) % 255]);
			}
			err = gmult (num, ginv (denom));
			codeword [csize - i - 1] ^= err;
	    }
		return 1;
	} else {
		return 0;
	}

}