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

📄 miscellaneous.cpp

📁 这是校验位打孔重传的源程序
💻 CPP
字号:
#include "parameter_sets.h"

///////////////////////////////////////////////////////////////////////////////
// Miscellaneous Functions
///////////////////////////////////////////////////////////////////////////////

const double sqrt2norm[2] = {3.16227766016838, 6.48074069840786};

const double const16QAM[2][2][2] = {
// MSB = 0
	1.0/3.16227766016838, 3.0/3.16227766016838,
// MSB = 1
	-1.0/3.16227766016838, -3.0/3.16227766016838,
// LSB = 0
	-1.0/3.16227766016838, 1.0/3.16227766016838,
// LSB = 1
	-3.0/3.16227766016838, 3.0/3.16227766016838
};

const double const64QAM[3][2][4] = {
// MSB = 0
	1.0/6.48074069840786, 3.0/6.48074069840786, 5.0/6.48074069840786, 7.0/6.48074069840786, 
// MSB = 1
	-1.0/6.48074069840786, -3.0/6.48074069840786, -5.0/6.48074069840786, -7.0/6.48074069840786,
// CSB = 0
	-3.0/6.48074069840786, -1.0/6.48074069840786, 1.0/6.48074069840786, 3.0/6.48074069840786,
// CSB = 1
	-7.0/6.48074069840786, -5.0/6.48074069840786, 5.0/6.48074069840786, 7.0/6.48074069840786,
// LSB = 0
	-5.0/6.48074069840786, -3.0/6.48074069840786, 3.0/6.48074069840786, 5.0/6.48074069840786,
// LSB = 1
	-7.0/6.48074069840786, -1.0/6.48074069840786, 1.0/6.48074069840786, 7.0/6.48074069840786
};

const double MAX = 10000.0;

const int PuncPos[15] = {17, 19, 21, 23, 25, 27, 29, 31, 18, 24, 22, 28, 30, 20, 26};

double logcothsemi(double x) {
	return -1*log(tanh(x/2));
}

int MaxLogDeMap(int start, int length, double symbol, double * llr) {

	int i, j, k;
	double temp, mindis[2];

	if (length == 2) {
		// Demap the inphase or quadrature part of 16QAM
		for (i=0; i<2; i++) {
			// each bit
			mindis[0] = MAX;
			mindis[1] = MAX;
			for (j=0; j<2; j++) {
				// 0 or 1
				for (k=0; k<2; k++) {
					// find the minimum distance
					temp = pow((symbol-const16QAM[i][j][k]), 2);
					if (temp < mindis[j])
						mindis[j] = temp;
				}
			}
			*(llr+start+i) = mindis[1]-mindis[0];
		}
	} else if (length == 3) {
		// Demap the inphase or quadrature part of 64QAM
		for (i=0; i<3; i++) {
			// each bit
			mindis[0] = MAX;
			mindis[1] = MAX;
			for (j=0; j<2; j++) {
				// 0 or 1
				for (k=0; k<4; k++) {
					// find the minimum distance
					temp = pow((symbol-const64QAM[i][j][k]), 2);
					if (temp < mindis[j])
						mindis[j] = temp;
				}
			}
			*(llr+start+i) = mindis[1]-mindis[0];
		}
	} else {
		// Unsupported modulation types
		return 1;
	}
	return 0;
}

int CalcZfactorF(int K, int N)		//计算z
{
	
	int mb = 16;
	int kb = 16;
	double r = ((double) K)/N;
	int z;

	if (r <= 0.5) 
	{
		// lower rate
		z = ((N-K)%mb) ? ((N-K)/mb+1) : ((N-K)/mb);
	}
	else 
	{
		// higher rate
		z = (K%kb) ? (K/kb+1) : (K/kb);
	}

	return z;
}

int ResumeBitsF(struct BasicParaS * ctrl, double * input, double * output) {

	int diff_sys = (ctrl->numInBits-ctrl->codeK);
	int diff_par = ctrl->numChk-ctrl->codeM;
	int i, j, k, m;

	if (ctrl->typeDecode == 0) { // SPA
		for (i=0; i<diff_sys; i++) {
			*(output+i) = 0; // the punctured systematic bits were all zeros
		}
		for (i=0; i<ctrl->codeK; i++) {
			*(output+diff_sys+i) = *(input+i);
		}
	} else { // LSPA and SMA
		for (i=0; i<diff_sys; i++) {
			*(output+i) = 10000.0; // the punctured systematic bits were all zeros
		}
		for (i=0; i<ctrl->codeK; i++) {
			*(output+diff_sys+i) = *(input+i);
		}			
	}

	if (ctrl->codeK <= ctrl->codeM) 
	{ // the code rate is below 1/2
		for (i=0; i<ctrl->codeM; i++) 
		{
			*(output+ctrl->numInBits+i) = *(input+ctrl->codeK+i);
		}
		// truncated bits were resumed
		if (ctrl->typeDecode == 0) { // SPA
			for (i=0; i<diff_par; i++) 
			{
				*(output+ctrl->numInBits+ctrl->codeM+i) = 0.5; // we don't know truncated bits
			}
		} else 
		{ // LSPA and SMA
			for (i=0; i<diff_par; i++) {
				*(output+ctrl->numInBits+ctrl->codeM+i) = 0; // we don't know truncated bits
			} 
		}
	} else 
	{ // the code rate is above 1/2
		k = diff_par/ctrl->zfactor;
		m = diff_par%ctrl->zfactor;
		// set all the parity as -1
		for (i=0; i<ctrl->numChk; i++) 
		{
			*(output+ctrl->numInBits+i) = -1;
		}
		// label the bits should be punctured
		if (ctrl->typeDecode == 0) 
		{ // SPA
			for (i=0; i<k; i++) 
			{
				for (j=0; j<ctrl->zfactor; j++) 
				{
					*(output+PuncPos[i]*ctrl->zfactor+j) = 0.5;
				}
			}
			for (i=0; i<m; i++) 
			{
				*(output+PuncPos[k]*ctrl->zfactor+i) = 0.5;
			}
		} else 
		{ // LSPA and MSA
			for (i=0; i<k; i++) 
			{
				for (j=0; j<ctrl->zfactor; j++) 
				{
				*(output+PuncPos[i]*ctrl->zfactor+j) = 0;
				}
			}
			for (i=0; i<m; i++) 
			{
				*(output+PuncPos[k]*ctrl->zfactor+i) = 0;
			}
		}
		// set the living parity bits
		j = 0;
		for (i=0; i<ctrl->numChk; i++) 
		{
			if ((*(output+ctrl->numInBits+i)) == -1)
			{ // only the unlabeled bits would be covered
				*(output+ctrl->numInBits+i) = *(input+ctrl->codeK+j);
				j++;
			}
		}
	}
	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -