📄 rsprtshort_general.m
字号:
%generate Reed Solomon generator matrix and parity check matrix
clear
q=2;
m=5;
t=3;
n=q^m-1;
k=n-2*t;
code_len=n;
msg_len=k;
chk_len=n-k;
p=gftuple([-1:q^m-2]',m,q);%get the m-tuple space
basis=p(2:q^m,:);
sym_len=m;
b = 1;
genpoly = 0;
for i = 1:2*t
genpoly = gfconv(genpoly,[i-1+b,0],p);
end
poly_len=length(genpoly);
n_short=31;
chk_short=chk_len;
k_short=n_short-chk_short;
scode_len=n_short*m;
smsg_len=k_short*m;
schk_len=scode_len-smsg_len;
H_vec=0:(n-1);
for i=b:b+(2*t-1)
H_nonbin_org(i-b+1,:)=mod(H_vec*i,n);
end
G_nonbin=ones(k,n)*-Inf;
for i=1:k
G_nonbin(i,i:i+poly_len-1)=genpoly;
end
%systematize the generator matrix
%for i=1:k-1
% for j=1:i
% G_nonbin(k+1-j,:)=gfadd(G_nonbin(k+1-j,:),gfmul(G_nonbin(k-i,:),G_nonbin(k+1-j,n-i)*ones(1,n),p),p);
% end
% i
%end
%mapping matrix
mapping(1:m,1:m,1:n)=0;
input=0:m-1;
for i=1:n
output = gfmul(input,(i-1)*ones(size(input)),p);
for j=1:m
mapping(j,:,i) = basis(output(j)+1,:);
end
end
G_nonbin = G_nonbin(1:k_short,1:n_short);
H_nonbin_org = H_nonbin_org(:,1:n_short);
for i=1:k_short
for j=1:n_short
if G_nonbin(i,j)==-Inf
G_gen(((i-1)*m+1):i*m,((j-1)*m+1):j*m) = 0;
else
G_gen(((i-1)*m+1):i*m,((j-1)*m+1):j*m) = mapping(:,:,G_nonbin(i,j)+1);
end
end
end
weight_opt=Inf;
weight_opt0=Inf;
H_opt=[];
max_num=1;
dead_upp=1;
H_nonbin=H_nonbin_org;
for loop=1:1
%systematize the parity check matrix
for i=1:chk_len
for j=1:chk_len
if (i~=j & H_nonbin(j,i)~=-Inf)
coef = gfdiv(H_nonbin(j,i),H_nonbin(i,i),p);
H_nonbin(j,:)=gfadd(H_nonbin(j,:),gfmul(H_nonbin(i,:),coef*ones(1,n_short),p),p);
end
end
H_nonbin(i,:) = gfdiv(H_nonbin(i,:),H_nonbin(i,i)*ones(1,n_short),p);
end
%diagonally systematize the parity check matrix
%for i=1:chk_len
% for j=i:chk_len
% if (i~=j & H_nonbin(j,i)~=-Inf)
% coef = gfdiv(H_nonbin(j,i),H_nonbin(i,i),p);
% H_nonbin(j,:)=gfadd(H_nonbin(j,:),gfmul(H_nonbin(i,:),coef*ones(1,n_short),p),p);
% end
% end
% H_nonbin(i,:) = gfdiv(H_nonbin(i,:),H_nonbin(i,i)*ones(1,n_short),p);
%end
flag=0;
innloop=1;
while innloop>0 & flag==0
innloop=innloop-1;
scaling=zeros(1,chk_short);%randint(chk_short,1,[0,n-1]);
for i=1:chk_short
H_nonbin_temp(i,:) = gfmul(H_nonbin(i,:),scaling(i)*ones(1,n_short),p);
end
for i=1:chk_short
for j=1:n_short
if H_nonbin_temp(i,j)==-Inf
H_prt(((i-1)*m+1):i*m,((j-1)*m+1):j*m) = 0;
else
H_prt(((i-1)*m+1):i*m,((j-1)*m+1):j*m) = mapping(:,:,H_nonbin_temp(i,j)+1)';
end
end
end
weight_prt0=sum(sum(H_prt));
if weight_prt0<weight_opt0
weight_opt0=weight_prt0
H_nonbin=H_nonbin_temp;
end
end
check=find(mod(G_gen*H_prt',2)~=0);
if ~isempty(check)
error('error');
end
H_temp=greedysearch(H_prt,max_num,dead_upp);
weight_temp=sum(sum(H_temp))
if weight_temp<weight_opt |(weight_temp==weight_opt & var(sum(H_temp'))<var(sum(H_opt')))
weight_opt=weight_temp
H_opt=H_temp;
savefile = 'H_opt.mat';
save(savefile,'H_opt');
end
H_opt_big(((loop-1)*schk_len+1):loop*schk_len,1:scode_len)=H_opt;
end
%H_opt_big=H_opt;
%for i=1:schk_len-1
% H_opt_big(end+1,:)=mod(H_opt(i,:)+H_opt(i+1,:),2);
%end
G_gen;
if ~isempty(find(mod(G_gen*H_prt',2)))
error('wrong parity check matrix');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -