⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsprtshort_general.m

📁 Matlab packet for generating G and H matrix for RS codes in binary form
💻 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 + -