汉明码实现

汉明码实现:可以利用matlab中的encode 和decode实现,但是,下面是自己实现的m文件程序

功能:(1) HanMingH 生成监督矩阵

            (2)HanMingG 生成系统生成矩阵

            (3)FindR 计算监督位的数目

           (4)FindError生成错误校正图样,用于纠正错误编码


% Main 

clc; 

clear all; 
close all; 


k = 4; %信息位数 
r = 3; %监督位数
% 生成汉明码对应的监督矩阵H
H = HanMingH(k,r);
% 生成汉明码对应的系统生成矩阵G 
G = HanMingG(H);
%(k+r,k)汉明码的可纠正错误图样
E = FindError(G);
% E = E(:,end:-1:1); 

MaxNum = 1000; 


for ii = 1:MaxNum

        u = randn(1,k) < 0.5;
        c = rem(u*G,2);
%         e = randn(1,k+r) < p(ii); %BSC信道的错误图样
        errpos = randperm(k+r); 
        e = zeros(1,k+r); 
        e(errpos(1)) = 1; % 产生一位错误,完全可以纠正
        
        y = rem(c+e,2);
        s = rem(y*H',2);%伴随式
        jj = bi2de(s)+1; 
        e2 = E(jj,:); %查出可纠正错误图样
        c2 = rem(y+e2,2); %译码结果
        uu = rem(c2(1:k),2); %译码得到的信息比特
        
end %for 


function G = HanMingG(H)
%
[r,n] = size(H); 
k = n - r; 
G = [eye(k),H(:,1:k)']; 
end %function HanMingH 



function G = HanMingH(k,r)
% 产生汉明码的系统监督矩阵:H

% Author: SWH
% Date: 2015/5/16
% PRIS OF HARBIN INSTITUTE OF TECHNOLOGY 
%
if ~exist('r','var')
    r = FindR(k); 
end 
if ~(2^r >= (k + r + 1))
    error('不满足2^r >= (k + r +1)'); 
end 
n = k + r; 
G = zeros(r,n); 
% 寻找到监督的位置
for ii = 1:r 
    position = 2^(ii-1); 
    for jj = 1:n
        if bi2de(de2bi(jj,n,'left-msb') & de2bi(position,n,'left-msb')) ~= 0  
            G(ii,jj) = 1; 
        end 
    end 
end


% 系统生成矩阵 
tmp = zeros(size(G)); 
for ii = 1:r 
    tmp(:,end - r + ii) = G(:,2^(ii-1)); 
end 
count = 1; 
for ii = n:-1:1 
    if isempty(find( ii == 2.^((1:r) - 1))); 
        tmp(:,count) = G(:,ii); 
        count = count + 1; 
    end 
end 
subtmp = tmp(:,1:k); 
subtmp = flip(subtmp); 
tmp(:,1:k) = subtmp; 
G = tmp; 
end %function HanMingH 


function r = FindR(k)
%  
%
%
for count = 1:k
    if 2^count >= (k + count + 1) 
        r = count; 
        break; 
    end 
end 
end %function FindR 


function E = FindError(G)
% 产生错误图样
%
[k,n] = size(G); 
r = n - k; 
M1 = 2^k; %合法码字个数
M2 = 2^r; %可纠正错误图样的个数
C = rem(de2bi([0:M1-1])*G,2); %全部码字的集合
E = zeros(M2,n); 
for i = 1:M2
    e1 = [zeros(1,k) de2bi(i-1,r)]; 
    E1 = rem(ones(M1,1)*e1+C,2); %伴随式为de2bi(i-1,r)时的全部错误图样
    [temp,idx] = min(sum(E1')); %找出码重最小者
    E(i,:) = E1(idx,:); 
end %for i 
end %function FindError 


版权声明:本文为hit1524468原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。