⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsdecoder.cpp

📁 包括RS码的编码,硬(BM)/软(KV)译码,AWGN信道调制解调仿真. 具体采用何种编译码方案和调制解调方式可在Profile.txt文件中指定(内有详细说明). 且扩展性极好,容易向其中加入新的调
💻 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 + -