Java:RS编码和纠错解码

package hustspy;

public class RSCode {
	private static final int MM = 8;
	private static final int NN = 255;
	private static final int TT = 10;
	private static final int KK = 235;
	
	private int[] pp = {1, 0, 1, 1, 1, 0, 0, 0, 1};
	private int[] alphaTo = new int[NN+1];
	private int[] indexOf = new int[NN+1];
	private int[] gg = new int[NN-KK+1];
	public int[] recd = new int[NN];
	public int[] data = new int[KK];
	public int[] bb = new int[NN-KK];
	
	/**
	 * 构造函数RSCode()
	 * 初始化工作,生成GF空间和对应的生成多项式
	 */
	public RSCode() {
		generateGF();
		generatePolynomial();
	}
	
	/**
	 * 函数generateGF()
	 * 生成GF(2^MM)空间
	 */
	public void generateGF() {
		int i, mask;
		mask = 1;
		alphaTo[MM] = 0;
		for(i=0; i<MM; i++){
			alphaTo[i] = mask;
			indexOf[alphaTo[i]] = i;
			if(pp[i] != 0){
				alphaTo[MM] ^= mask;
			}
			mask <<= 1;
		}
		
		indexOf[alphaTo[MM]] = MM;
		mask >>= 1;
		
		for(i=MM+1; i<NN; i++){
			if(alphaTo[i-1] >= mask){
				alphaTo[i] = alphaTo[MM] ^ ((alphaTo[i-1]^mask)<<1);
			}else{
				alphaTo[i] = alphaTo[i-1]<<1;
			}
			indexOf[alphaTo[i]] = i;
		}
		
		indexOf[0] = -1;
		//输出GF空间
/*		System.out.println("GF空间:");
		for(i=0; i<=NN; i++){
			System.out.println(i + "   " + alphaTo[i] + "   " + indexOf[i]);
		}*/
	}//GenerateGF
	
	/**
	 * 函数generatePolynomial()
	 * 产生相应的生成多项式的各项系数
	 */
	public void generatePolynomial() {
		int i, j;
		gg[0] = 2;
		gg[1] = 1;
		for(i=2; i<=NN-KK; i++) {
			gg[i] = 1;
			for(j=i-1; j>0; j--){
				if(gg[j] != 0)
					gg[j] = gg[j-1] ^ alphaTo[(indexOf[gg[j]]+i) % NN];
				else
					gg[j] = gg[j-1];
			}
			gg[0] = alphaTo[(indexOf[gg[0]]+i) % NN];
		}
		
		//转换其到
		for(i=0; i<=NN-KK; i++) {
			gg[i] = indexOf[gg[i]];
		}
		
		//输出生成多项式的各项系数
		System.out.println("生成多项式系数:");
		for(i=0; i<=NN-KK; i++) {
			System.out.println(gg[i]);
		}
	}

	/**
	 * 函数rsEncode()
	 * RS编码
	 */
	public void rsEncode() {
		int i, j;
		int feedback;
		for(i=0; i<NN-KK; i++) {
			bb[i] = 0;
		}
		for(i=KK-1; i>=0; i--) {
			//逐步的将下一步要减的,存入bb(i)
			feedback = indexOf[data[i] ^ bb[NN-KK-1]];
			if(feedback != -1) {
				for(j=NN-KK-1; j>0; j--) {
					if(gg[j] != -1)
						bb[j] = bb[j-1] ^ alphaTo[(gg[j]+feedback)%NN];
					else
						bb[j] = bb[j-1];
				}
				bb[0] = alphaTo[(gg[0]+feedback)%NN];
			}else {
				for(j=NN-KK-1; j>0; j--) {
					bb[j] = bb[j-1];
				}
				bb[0] = 0;
			}
		}
		//输出编码结果
		System.out.println("编码结果:");
		for(i=0; i<NN-KK; i++) {
			System.out.println(bb[i]);
		}
	}
	
	/**
	 * 函数rsDecode()
	 * RS解码
	 */
	public void rsDecode() {
		int i, j, u, q;
		int[][] elp = new int[NN-KK+2][NN-KK];
		int[] d = new int[NN-KK+2];
		int[] l = new int[NN-KK+2];
		int[] u_lu = new int[NN-KK+2];
		int[] s = new int[NN-KK+1];
		
		int count = 0;
		int syn_error = 0;
		int[] root = new int[TT];
		int[] loc = new int[TT];
		int[] z = new int[TT+1];
		int[] err = new int[NN];
		int[] reg = new int[TT+1];
		
		//转换成GF空间
		for(i=0; i<NN; i++) {
			if(recd[i] == -1)
				recd[i] = 0;
			else
				recd[i] = indexOf[recd[i]];
		}
		
		//求伴随多项式
		for(i=1; i<=NN-KK; i++) {
			s[i] = 0;
			for(j=0; j<NN; j++) {
				if(recd[j] != -1)
					s[i] ^= alphaTo[(recd[j]+i*j)%NN];
			}
			if(s[i] != 0)
				syn_error = 1;
			s[i] = indexOf[s[i]];
		}
		System.out.println("syn_error=" + syn_error);
		
		//如果有错,则进行纠正
		if(syn_error == 1) {
			//BM迭代求错误多项式的系数
			d[0] = 0;
			d[1] = s[1];
			elp[0][0] = 0;
			elp[1][0] = 1;
			for(i=1; i<NN-KK; i++) {
				elp[0][i] = -1;
				elp[1][i] = 0;
			}
			l[0] = 0;
			l[1] = 0;
			u_lu[0] = -1;
			u_lu[1] = 0;
			u = 0;
			do {
				u++;
				if(d[u] == -1) {
					l[u+1] = l[u];
					for(i=0; i<=l[u]; i++) {
						elp[u+1][i] = elp[u][i];
						elp[u][i] = indexOf[elp[u][i]];
					}
				}else {
					q = u-1;
					while((d[q]==-1) && (q>0)) {
						q--;
					}
					if(q > 0) {
						j = q;
						do {
							j--;
							if((d[j] != -1) && (u_lu[q] < u_lu[j])) {
								q = j;
							}
						}while(j > 0);
					}
					
					if(l[u] > l[q] + u - q) {
						l[u+1] = l[u];
					}else {
						l[u+1] = l[q] + u -q;
					}
					
					for(i=0; i<NN-KK; i++) {
						elp[u+1][i] = 0;
					}
					for(i=0; i<=l[q]; i++) {
						if(elp[q][i] != -1)
							elp[u+1][i+u-q] = alphaTo[(d[u]+NN-d[q]+elp[q][i])%NN];
					}
					
					for(i=0; i<=l[u]; i++) {
						elp[u+1][i] ^= elp[u][i];
						elp[u][i] = indexOf[elp[u][i]];
					}
				}
				u_lu[u+1] = u-l[u+1];
				
				if(u < NN-KK) {
					if(s[u+1] != -1) {
						d[u+1] = alphaTo[s[u+1]];
					}else {
						d[u+1] = 0;
					}
					
					for(i=1; i<=l[u+1]; i++) {
						if((s[u+1-i] != -1) && (elp[u+1][i] != 0)) {
							d[u+1] ^= alphaTo[(s[u+1-i]+indexOf[elp[u+1][i]])%NN];
						}
					}
					d[u+1] = indexOf[d[u+1]];
				}
			}while((u<NN-KK) && (l[u+1]<=TT));
			u++;
			System.out.println("错误数目:" + l[u]);
			
			//求错误位置,以及改正错误
			if(l[u] <= TT) {
				for(i=0; i<= l[u]; i++) {
					elp[u][i] = indexOf[elp[u][i]];
				}
				//求错误位置多项式的根
				for(i=1; i<= l[u]; i++) {
					reg[i] = elp[u][i];
				}
				count = 0;
				for(i=1; i<=NN; i++) {
					q = 1;
					for(j=1; j<=l[u]; j++) {
						if(reg[j]!=-1) {
							reg[j] = (reg[j] + j)%NN;
							q ^= alphaTo[reg[j]];
						}
					}
					
					if(q==0) {
						root[count] = i;
						loc[count] = NN-i;
						System.out.println("错误位置:" + loc[count]);
						count++;						
					}
				}
				
				//
				if(count == l[u]) {
					for(i=1; i<=l[u]; i++) {
						if((s[i]!=-1) && elp[u][i]!=-1) {
							z[i] = alphaTo[s[i]] ^ alphaTo[elp[u][i]];
						}else if((s[i]!=-1) && (elp[u][i]==-1)) {
							z[i] = alphaTo[s[i]];
						}else if((s[i]==-1) && (elp[u][i]!=-1)) {
							z[i] = alphaTo[elp[u][i]] ;
						}else {
							z[i] = 0;
						}
						
						for(j=1; j<i; j++) {
							if((s[j]!=-1) && (elp[u][i-j]!=-1)) {
								z[i] ^= alphaTo[(elp[u][i-j] + s[j])%NN];
							}
						}
						
						z[i] = indexOf[z[i]];
					}
					
					//计算错误图样
					for(i=0; i<NN; i++) {
						err[i] = 0;
						if(recd[i] != -1)
							recd[i] = alphaTo[recd[i]];
						else
							recd[i] = 0;
					}
					for(i=0; i<l[u]; i++) {
						err[loc[i]] = 1;
						for(j=1; j<=l[u]; j++) {
							if(z[j] != -1)
								err[loc[i]] ^= alphaTo[(z[j]+j*root[i])%NN];
						}
						
						if(err[loc[i]] != 0) {
							err[loc[i]] = indexOf[err[loc[i]]];
							q = 0;
							for(j=0; j<l[u]; j++) {
								if(j!=i)
									q += indexOf[1^alphaTo[(loc[j]+root[i])%NN]];
							}
							q = q%NN;
							err[loc[i]] = alphaTo[(err[loc[i]]-q+NN)%NN];
							recd[loc[i]] ^= err[loc[i]];
						}
					}
				}else {
					//错误太多,无法改正
					for(i=0; i<NN; i++) {
						if(recd[i] != -1)
							recd[i] = alphaTo[recd[i]];
						else
							recd[i] = 0;
					}
				}
			}else {
				//错误太多,无法改正
				for(i=0; i<NN; i++) {
					if(recd[i] != -1)
						recd[i] = alphaTo[recd[i]];
					else
						recd[i] = 0;
				}
			}
		}else {
			for(i=0; i<NN; i++) {
				if(recd[i] != -1)
					recd[i] = alphaTo[recd[i]];
				else
					recd[i] = 0;
			}
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RSCode rs = new RSCode();
		
		//输入要编码的数据
		int i;
		for(i=0; i<KK; i++) {
			rs.data[i] = 0;
		}
		for(i=0; i<10; i++) {
			rs.data[i] = 48 + i;
		}
		
		//编码
		rs.rsEncode();
		
		for(i=0; i<NN-KK; i++)
			rs.recd[i] = rs.bb[i];
		for(i=0; i<KK; i++)
			rs.recd[i+NN-KK] = rs.data[i];
		
		//主动弄点错误
		for(i=0; i<6; i++)
			rs.recd[i] = 1;
		
		//解码,纠错
		rs.rsDecode();
		
		//输出正确编码和纠错后的编码
		System.out.println("i  data  recd");
		for(i=0; i<NN-KK; i++) {
			System.out.println(i + "   " + rs.bb[i] + "   " + rs.recd[i]);
		}
		for(i=NN-KK; i<NN; i++) {
			System.out.println(i + "   " + rs.data[i-NN+KK] + "   " + rs.recd[i]);
		}
	}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值