资源描述
.
信道编码
姓名:郭宇琦学号:xxx2009xxx
一、 实验目的
1. 复习巩固BCH码编码译码知识。
2. 使用matlab进行实践编写BCH,了解实际应用中BCH的编码译码过程。
3. 结合实践验证所学BCH码知识。
二、 实验原理
BCH 码是用于校正多个随机错误的多级、循环、错误校正、变长数字编码,是循环码的子类。本原BCH码编码原理如下:
1. 确定n、m、t.
2. 用函数构造扩域,q=2取二进制,
3. 取本原元,根据纠错能力t,确定连续根。通过逐个验证每个元素来找出每一个根的全部共轭根系。根据计算最小多项式。
4. 所有非共轭根系的最小多项式乘积得到生成多项式
5. 利用系统码编码方程,进行编码。
BCH码译码方法主要有Peterson译码法和Berlekamp迭代译码法等,其中Peterson译码方法如下:
1. 计算伴随式。已知接受向量,则
2.求解错误位置。引入错误位置多项式,将求解错误位置的问题转化为求解线性方程组的问题
3.用Peterson译码方法译码,解出错误位置多项式系数和错误图样,得到估值码字。
(1).假设e=t,计算S行列式M的值。M=0则降阶,e=e-1,同样计算直到M≠0.
(2)将上面得到的2t个连续根代入试根,求上述方程组解。取倒数即为错误位置。由此写出错误图样。
(3)求出译码。
每一步具体的实现方法,详见程序源代码注释。
三、 程序框图
编码框图
过信道框图
译码框图
四、 实验结果分析
结果截图:
上面是较高信噪比时127位BCH正确译码
下面是较低信噪比时127为BCH错误译码
结果框内容(加粗部分是手动输入内容,下划线是结果重点):
---简易BCH编码译码系统---
输入码长n=128
错误:只支持本原BCH码
输入码长n=127
输入纠错能力t=6
计算得码长 k=85
自动生成随机信息序列输入1,手动键入信息序列输入0 :
1
随机生成的序列为 m= 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1
编码后生成码序列为 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0
过高斯白信道输入1,过理想信道输入0 :
1
输入信道信噪比(单位分贝,15左右较合适):10
接收码字为0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0
发送码字为0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0
通过信道后出错 4 位
错误图样为 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
译码结果为 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0
还原信息序列为m’= 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1
译码正确
五、 实验小结
整个过程严格按照所学BCH码相关知识编写,所得结论完全正确。
六、 源代码
clc
clear all
%----------------------------------------------
disp('---简易BCH编码译码系统---')
flag=1;
while(flag) %输入n
n=input('输入码长n=');
m=0;
while(2^m-1~=n&&m<20) %计算m
m=m+1;
end
if(m==20) %非本原就重新输入
disp('错误:只支持本原BCH码')
else flag=0;
end
end
flag=1;
while(flag) %输入t
t=input('输入纠错能力t=');
if((t>=floor((n-1)/2))||(t<=0))
disp('错误:纠错能力不能为0或者不能太大')
else flag=0;
end
end
%----------------------------------------------
a=gf(2,m); %构造扩域,matlab自动只把a当做扩域中的本原元
for i=1:2:(2*t-1) %求最小多项式,只找奇数项
b=[1,a^i]; %让b分别为a^i...找每一个(这么定义是要卷积的)
l=i;
while a^i~=a^(2*l) %找共轭根系
l=2*l;
b=conv(b,[1,a^l]);%求最小多项式
end
if i==1 g=b;
else
g=conv(g,b); %求生成多项式利用卷积,进行连乘
end
end
%--------------------------------------------------
gx=double(g.x);%从扩域到数域相当于变成多项式
k=n-length(gx)+1;%k=n-(r+1)+1
disp(['计算得码长 k=',num2str(k)])
flag=1;
while(flag)
temp=input('自动生成随机信息序列输入1,手动键入信息序列输入0 :\n');
if temp
mx=round(rand(1,k));%随机生成信息组
disp(['随机生成的序列为 m= ',num2str(mx)])
flag=0;
else inputm=str2mat(input('输入信息序列','s'));
if length(inputm)~=k
disp(['错误:输入码长应为',num2str(k)])
else flag=0;
end
mx=str2num(inputm(:))';
end
end
%----------------------------------------------------
x1=zeros(1,length(gx)); %循环码编码方程中的
x1(1)=1;
c1=conv(x1,mx); %码字的前k位,编码方程第一项
[q,r]=deconv(c1,gx);
r=mod(r,2); %编码方程第二项
c=mod(c1+r,2); %生成系统码,转换成为二进制
disp(['编码后生成码序列为 ',num2str(c)])
%-----------------------------------------------------
judge=input('过高斯白信道输入1,过理想信道输入0 :\n');
if judge==1
SNR=input('输入信道信噪比(单位分贝,15左右较合适):');
rr=awgn(c,SNR); %过信道
else rr=c;
end
for i=1:n %量化为01序列
if rr(i)>=0.5
r(i)=1;
else r(i)=0;
end
end
disp(['接收码字为',num2str(r)])
disp(['发送码字为',num2str(c)])
enum=0;
for i=1:n
if r(i)~=c(i)
enum=enum+1;
end
end
disp(['通过信道后出错 ',num2str(enum),' 位'])
%-----------------------------------------------------
s=a+a; %构造伴随式,初始化s
for i=1:2*t
s(i)=a+a;
for j=1:n
s(i)=s(i)+r(j)*a^((n-j)*i);
end
end
for e=t:-1:1 %降阶
A=a+a;
for i=1:e
for j=1:e
A(i,j)=s(e+i-j);
end
end
if det(A)~=0 break; %判断行列式是否为奇异,是就继续降
end
end
d=rank(A); %开始求方程组
B=a+a;
for i=1:d
B(i)=s(d+i);
end
if A==a+a %接受的码字出错的情况
cc=r;
E=zeros(1,n);
else
sigma=A\(B'); %错误位置多项式的系数
E=zeros(1,n);
x=a+a;
ki=1;
for i=1:n %试根
h=a^0;
for j=1:d
h=h+sigma(j)*a^(i*j);
end
if h==a+a
x(k)=a^(n-i);
E(i)=1; %错误图样,可以不用求具体根,找到位置即可
ki=ki+1;
end
end
cc=mod(E+r,2); %校正接收码字
end
disp(['错误图样为 ',num2str(E)])
disp(['译码结果为 ',num2str(cc)])
m=c(1:k);
disp(['还原信息序列为m’= ',num2str(m)])
if cc==c
disp('译码正确 ')
else disp('译码错误 ')
end
.
展开阅读全文