文章目录
参考资料:
http://www.mcs.csueastbay.edu/~malek/Class/Reed-Muller.pdf
Journal of Computer Science 4 (10): 792-798, 2008
RM码全称Reed-Muller Codes,是一种非常神奇的编码,早在1972年就应用在了水手9号火星探测器,采用RM(1,5)对火星的黑白照片进行编码处理。
RM码也是线性分组码,但是与通常的线性分组码描述方法(n,k,d)不同,采用另外一种参数描述方法:(r,m),二者对应关系为
(n,k,d)=(2m,i=0∑rCmi,2m−r)
可见RM码的最小距离给的还是很大的,提供给我们纠错多位的可能。之前所说的RM(1,5)对应的线性分组码就是(32,6,16) woc能纠正7位发现1位
生成矩阵
下面我们看一下如何去设计一这样神奇的编码。同所有线性分组码一样,它也有它的生成矩阵
首先当r=0时,生成矩阵被定义为
G(0,m)=[11⋯1]2m(1)
当r≥1时,我们通过迭代的方式得到生成矩阵
G(m,m)=[0G(m−1,m)0⋯1](2)
G(r,m+1)=[G(r,m)0G(r,m)G(r−1,m)](3)
Exam:G(1,3)
G(1,3)=[G(1,2)0G(1,2)G(0,2)]
G(1,2)=[G(1,1)0G(1,1)G(0,1)]
综上求得G(1,3)
⎣⎡G(0,1)010G(0,1)01G(0,1)01G(0,2)G(0,1)01⎦⎤=⎣⎢⎢⎡10001100101011101001110110111111⎦⎥⎥⎤
此外还有另一种构造方式
零阶RM码生成矩阵仍参照(1)
定义RM(1,m)的生成矩阵为:设矩阵H的列序号与列向量相同,那么RM(1,m)的生成矩阵为
G=⎣⎢⎢⎢⎡10⋮01⋯H1⎦⎥⎥⎥⎤
一般来说很多人看到这个定义都会比较懵逼,一方面是数值与向量相等的操作比较费解,另一方面是这个相等是真的不好解释,下面给一个实例说明一下,仍以RM(1,3)的生成矩阵为例
⎣⎢⎢⎢⎢⎡1000a11100a21010a31110a41001a51101a61011a71111⎦⎥⎥⎥⎥⎤
序号不要求从1起,也可以从0起
接下来是如何从一阶RM码得到高阶RM码。将组成H的行向量依次记为
H=⎣⎢⎢⎢⎡x1x2⋮xm⎦⎥⎥⎥⎤
高阶RM码生成矩阵就是在低阶生成矩阵的基础上添加全部同阶的行向量。这个地方还是不容易说明,依旧举例说明:
定义点乘运算:设有同维行向量a(a1,a2,⋯an)和b(b1,b2,⋯bn),二者点乘的结果为
ab=(a1b1,a2b2,⋯,anbn)
由RM(1,3)得到RM(2,3)为例,方便起见将RM(1,3)写为如下形式:将首列的0替换为行向量的标识符
⎣⎢⎢⎡1x1x2x31100101011101001110110111111⎦⎥⎥⎤
x1,x2,x3最高阶次均为1次,因为是1阶组合;而x1x2为最高阶次为2次,这里的乘法运算就是前文提及的点乘,所以RM(2,3)的生成矩阵为
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡1x1x2x3x1x2x1x3x2x31100000101000011101001001000110101010110011111111⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
由于m个元素r阶组合的个数为Cmr,所以可知RM(r,m)的信息位为∑i=0rCmi
译码
一阶译码
首先介绍一下什么是Kronecker Product:
矩阵A与B的Kronecker Product定义如下
A⨂B=⎣⎢⎢⎢⎡a11Ba21B⋮am1Ba12Ba12B⋮am2B⋯⋯⋱⋯a1nBa2nB⋮amnB⎦⎥⎥⎥⎤
之后是定义n阶hadamard 矩阵
n阶hadamard 矩阵为nxn方阵,仅由 1 和 -1 俩个元素构成,且具有如下性质
HnHnT=nIn
hadamard矩阵是可以构造的,但这不是本文的重点 而且我也不会
之后是如何利用hadamard矩阵对RM码进行译码
首先利用2阶hadamard矩阵和kronecker Product定义如下矩阵的生成
Hmj=I2m−j⊗H2⊗I2j−1
已H33为例
H33=H⊗I4=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡100010000100010000100010000100011000−100001000−100001000−100001000−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
现假设采用RM(1,m)编码,收到码字r(r0,r1,⋯r2m−1),按如下步骤进行译码
-
将接收码字中0替换为-1
w0=2w−[111⋯1] -
计算如下伴随式
w1w2w3⋮wm=w0Hm1=w1Hm2=w2Hm3=wm−1Hmm -
在行向量wm(wm,1wm,2⋯wm,2m−1)中找位置i,使得∀pos=i,都有∣wm,i∣>∣wm,pos∣
-
根据i查询下表
pos i code v(i) 0 000…0 1 100…0 2 010…0 3 110…0 … … 2m-1 111…1 如果wm,i<0,那么认为译码结果为[0v(i)];如果wm,i>0,则认为译码结果为[1v(i)]
-
将求得的译码结果与生成矩阵G(1,m)相乘得到码字wsnd与接收码字w比较,核对结果
解码示例程序
完整一阶编译码程序-> 德莉莎世界第一可爱
下面给出matlab演示程序作为示例:
hadamard(n): 生成n阶hadamard矩阵
kron(A,B):计算矩阵A B的kronecker Product
close all
clear all
clc
H=hadamard(2);
w=[1 0 1 0 1 0 1 1];
%replace
w0=zeros(1,8);
for i=1:8
w0(i)=2*w(i)-1;
end
%calculate w1 w2 w3
H13=kron(eye(4),H);
w1=w0*H13
H23=kron(kron(eye(2),H),eye(2));
w2=w1*H23;
H33=kron(H,eye(4));
w3=w2*H33
%get max element and its position
pos=1;
for i=2:8
if w3(i)>w3(pos)
pos=i;
end
end
%decode
code=zeros(1,4);
if w3(pos)>0
code(1)=1;
else
code(1)=0;
end
pos=pos-1;
for i=2:4
code(i)=mod(pos,2);
pos=fix(pos/2);
end
%display
code
white_156
发布了161 篇原创文章 · 获赞 170 · 访问量 1万+
私信
关注