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

📄 rsencoder.cpp

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