📄 rsencoder.cpp
字号:
#include "stdafx.h"
#include "stdlib.h"
#include "RSEncoder.h"
/*重置编码器*/
void ResetRSEncoder(RSEncoder& enc) {
for (int i=0; i<enc.rsp.K; i++) enc.mword[i]=0;
for (i=0; i<enc.rsp.N; i++) enc.cword[i]=0;
enc.ib=0;
enc.maskw=0x01;
enc.masko=0x80;
for (i=1; i<enc.rsp.M; i++) enc.maskw<<=1;
enc.masktop=enc.maskw;
enc.im=0;
}
/*初始化编码器,返回RS码参数结构体*/
RSCodeParam InitRSEncoder(RSEncoder& enc, int m, int m0, int D, EncCore ec) {
GF gf;
InitGF(&gf, m);//产生GF(2^m)
//RS码的各参数
int N_RS=gf.N;
int M_RS=m;
int D_RS=D;
int K_RS=gf.N+1-D;
int m0_RS=m0;
int t_RS=(D-1)/2;
RSCodeParam rsparm={m0_RS, N_RS, K_RS, D_RS, M_RS, t_RS, };
rsparm.gf=gf;
if (EncCores[ec].EncCoreSize>0)
{
enc.EncCoreRegs=(void*)malloc(EncCores[ec].EncCoreSize);
if (EncCores[ec].InitEncCore!=NULL)
{
enc.InitEncCore=EncCores[ec].InitEncCore;
enc.InitEncCore(enc.EncCoreRegs, rsparm);
}
}
enc.EncodeOneWord=EncCores[ec].EncodeOneWord;
enc.CloseEncCore=EncCores[ec].CloseEncCore;
enc.mword=(GFE*)malloc(sizeof(GFE)*K_RS);
enc.cword=(GFE*)malloc(sizeof(GFE)*N_RS);
enc.codeblock=(byte*)malloc(sizeof(byte)*N_RS*(K_RS+8/M_RS)/K_RS);
enc.rsp=rsparm;
ResetRSEncoder(enc);
return rsparm;
}
/*关闭编码器(释放分配的内存资源)*/
void CloseRSEncoder(RSEncoder& enc) {
free(enc.mword);
free(enc.cword);
free(enc.codeblock);
if (enc.CloseEncCore!=NULL) {
enc.CloseEncCore(enc.EncCoreRegs);
free(enc.EncCoreRegs);
}
}
/*编码一个码字(输入K个码元,输出N个码元)*/
/*
void EncodeOneWord(GFE* codeword, const GFE* msgword, RSEncoder& enc) {
Using_Pow2Vec_Vec2Pow_NG(enc.rsp.gf);
int K_RS=enc.rsp.K, N_RS=enc.rsp.N;
for (int i=0; i<K_RS; i++) {
enc.SR[i]=msgword[K_RS-i-1];
codeword[i]=msgword[i];
}
int j;
for (i=K_RS; i<N_RS; i++) {
codeword[i]=0;
for (j=0; j<K_RS; j++) codeword[i]^=GFMPY_V2V(enc.SR[j], enc.HX.coef[j+1], NG);
for (j=K_RS-1; j>0; j--) enc.SR[j]=enc.SR[j-1];
enc.SR[0]=codeword[i];
}
}
*/
/*对一个字节进行编码, 返回实际编码输出的整字节数,及输出字节缓冲区首地址
比特位组织顺序:Big Endian
*/
int EncodeOneByte(byte b, byte*& outblockp, RSEncoder& enc) {
byte *codeblock=enc.codeblock;
int &ib=enc.ib, &im=enc.im;
GFE masktop=enc.masktop, &maskw=enc.maskw;
byte &masko=enc.masko;
GFE *cword=enc.cword, *mword=enc.mword;
int N_RS=enc.rsp.N, M_RS=enc.rsp.M, K_RS=enc.rsp.K;
//将上一次编码输出的最后一个未填满的字节移至输出缓冲区的首字节处
codeblock[0]=codeblock[ib]; ib=0;
byte mask=0x80;//对被编码字节的位掩码
for (int i=0; i<8; i++) {
if ((mask & b)==0) mword[im]&=(~maskw); else mword[im]|=maskw;
if (maskw==0x01) {
if (im==K_RS-1) {
//若已填满K个码元,则编码一个码字
enc.EncodeOneWord(cword, mword, enc.rsp, enc.EncCoreRegs);
int j, k; byte mask1;
//将输出的N个码元填入输出缓冲区
for (j=0; j<N_RS; j++) {
mask1=masktop;
for (k=0; k<M_RS; k++) {
if ((cword[j] & mask1)==0) codeblock[ib]&=(~masko);
else codeblock[ib]|=masko;
if (masko==0x01)
{
ib++;
masko=0x80;
}
else masko>>=1;
mask1>>=1;
}
}
im=0;
}
else im++;
maskw=masktop;
}
else maskw>>=1;
mask>>=1;
}
outblockp=codeblock;
return ib;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -