汉明码实现:可以利用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