📄 rsdecoder.cpp
字号:
#include <stdafx.h>
#include <stdlib.h>
#include <crtdbg.h>
#include "RSDecoder.h"
#include "BMA.h"
void ResetRSDecoder(RSDecoder& dec) {
int i;
if (dec.isHardDecoder) {for (i=0; i<dec.rsp.N; i++) dec.R[i]=0;}
dec.ib=0;
dec.masko=0x80;//指示输出缓冲区当前写入的BIT位的掩码
dec.maskw=0x01;//指示填充码元符号的BIT位的掩码
for (i=1; i<dec.rsp.M; i++) dec.maskw<<=1;
dec.masktop=dec.maskw;
dec.ir=0;
dec.iSymRel=0;
dec.col=0;
/*
struct DecodeResult {
int succeedNum;
int failureNum;
bool lastframeFail;
bool curframeFail;
bool failureIgnore;
};
*/
}
/*初始化RS解码器*/
void InitRSDecoder(RSDecoder& dec, const RSCodeParam& rsp, const DecAlgInterface& decalg) {
int N_RS=rsp.N;
int M_RS=rsp.M;
int D_RS=rsp.D;
int K_RS=N_RS+1-D_RS;
int m0_RS=rsp.m0;
int t_RS=(D_RS-1)/2;
dec.rsp=rsp;
dec.AlgRegs=decalg.DecAlgRegs;
dec.isHardDecoder=decalg.isHardDecoder;
dec.CloseDecAlg=decalg.CloseDecAlg;
if (dec.isHardDecoder)
{
dec.R=(GFE*)malloc(sizeof(GFE)*N_RS);
dec.DecodeOneWord_Hard=decalg.DecodeOneWord_Hard;
}
else
{
dec.DecodeOneWord_Soft=decalg.DecodeOneWord_Soft;
dec.reliabMat=(double*)malloc(sizeof(double)*N_RS*(N_RS+1));
dec.symReliab=(double*)malloc(sizeof(double)*M_RS);
}
dec.C=(GFE*)malloc(sizeof(GFE)*N_RS);
//解码后所得的输出码字缓冲区
dec.decodeblock=(byte*)malloc(sizeof(byte)*(K_RS*M_RS/8+2));
ResetRSDecoder(dec);
}
void CloseRSDecoder(RSDecoder& dec) {
free(dec.C);
if (!dec.isHardDecoder)
{
free(dec.reliabMat);
free(dec.symReliab);
}
else free(dec.R);
free(dec.decodeblock);
if (dec.CloseDecAlg!=NULL) dec.CloseDecAlg(dec.AlgRegs);
free(dec.AlgRegs);
}
/*译解一个字节:
将传入的字节数据按位逐一拆分成多进制码元,够一个码字时就调用DecodeOneWord进行译码,
译码输出按位填入decodeblock中
*/
int DecodeOneByte(byte b, byte*& outblockp, RSDecoder& dec) {
int K_RS=dec.rsp.K, N_RS=dec.rsp.N, M_RS=dec.rsp.M;
int ib=dec.ib, ir=dec.ir;
GFE maskw=dec.maskw, masktop=dec.masktop;
byte masko=dec.masko;
byte *decodeblock=dec.decodeblock;
GFE *R=dec.R, *C=dec.C;
//To Do: 简化dec. !
byte maskb=0x80, mask1;
bool decodefail=false;
decodeblock[0]=decodeblock[ib];
ib=0;
for (int i=0; i<8; i++) {
if ((maskb & b)==0) R[ir]&=(~maskw); else R[ir]|=maskw;
if (maskw==0x01) {
if (ir==N_RS-1) {
if (!dec.DecodeOneWord_Hard(C, R, dec.rsp, dec.AlgRegs)) decodefail=true;
for (int j=0; j<K_RS; j++) {
mask1=masktop;
for (int k=0; k<M_RS; k++) {
if ((mask1 & C[j])==0) decodeblock[ib]&=(~masko);
else decodeblock[ib]|=masko;
_ASSERT(ib>=0 && ib<=K_RS*M_RS/8+1);
if (masko==0x01) {
ib++;
masko=0x80;
}
else masko>>=1;
mask1>>=1;
}
}
ir=0;
}
else ir++;
maskw=masktop;
//R[ir]=0;
}
else maskw>>=1;
maskb>>=1;
}
outblockp=decodeblock;
dec.ib=ib; dec.ir=ir;
dec.masko=masko; dec.maskw=maskw;
if (decodefail) return -ib; else return ib;
//返回译码输出的字节数; 若有译码失败则返回负值(应有更明确的信息输出)
}
int DecodeOneReliabBit(double rel, byte*& output, RSDecoder& dec) {
Using_Pow2Vec_Vec2Pow_NG(dec.rsp.gf);
double *sym=dec.symReliab, *mat=dec.reliabMat;
int& iSym=dec.iSymRel;
int M=dec.rsp.M;
sym[iSym++]=rel;
if (iSym==M)
{
double Pr;//Pr为各码元可能发送的概率
unsigned int i, selector, m;
for (i=0; i<(unsigned int)NG+1; i++)
{
Pr=1;
for (m=0, selector=i; m<(unsigned int)M; m++, selector>>=1)
{
if ((selector & 0x01)==0) Pr*=sym[M-1-m];
else Pr*=(1-sym[M-1-m]);
}
mat[(Vec2Pow[i]+1)*NG+dec.col]=Pr;
}
/*
double Pr=sym[0];//Pr为各码元可能发送的概率
for (unsigned int i=1; i<(unsigned int)M; i++) Pr*=sym[i];
mat[dec.col]=Pr;//首先是全0码元
GFE gray0=0, gray1, trigBit;
int trigInd;
for (i=1; i<(unsigned int)NG+1; i++)
{
gray1=i^(i>>1);
trigBit=gray1^gray0;
for (trigInd=dec.rsp.M-1; trigBit!=1; trigInd--, trigBit>>=1);// //
if (sym[trigInd]>0)
{
Pr=Pr/sym[trigInd]*(1-sym[trigInd]);
sym[trigInd]=-sym[trigInd];
}
else
{
Pr=Pr/(1+sym[trigInd])*(-sym[trigInd]);
sym[trigInd]=-sym[trigInd];
}
mat[(Vec2Pow[gray1]+1)*NG+dec.col]=Pr;
gray0=gray1;
}
*/
if (dec.col==NG-1)
{
GFE *C=dec.C, mask;
int ib=dec.ib;
byte *decodeblock=dec.decodeblock, masko=dec.masko;
decodeblock[0]=decodeblock[ib]; ib=0;
dec.DecodeOneWord_Soft(C, dec.reliabMat, dec.rsp, dec.AlgRegs);
for (int j=0; j<dec.rsp.K; j++)
{
for (mask=dec.masktop; mask!=0; mask>>=1)
{
if ((mask & C[j])==0) decodeblock[ib]&=(~masko);
else decodeblock[ib]|=masko;
_ASSERT(ib>=0 && ib<=dec.rsp.K*M/8+1);
if (masko==0x01)
{
ib++;
masko=0x80;
}
else masko>>=1;
}
}
dec.ib=ib;
dec.masko=masko;
dec.col=0;
iSym=0;
output=decodeblock;
return ib;
}
else dec.col++;
iSym=0;
}
output=dec.decodeblock;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -