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

📄 modulating.cpp

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

const double sqrt2norm[4] = {1.0, 1.414213562373095, 3.16227766016838, 6.48074069840786};
// {sqrt(1), sqrt(2), sqrt(10), sqrt(42)}, derived from Matlab 2006R

const Complex constMap_bpsk[2] = {{1.0, 0}, {-1.0, 0}};
const Complex constMap_qpsk[4] = {{1.0, 1.0}, {1.0, -1.0}, {-1.0, 1.0}, {-1.0, -1.0}};
const Complex constMap_16qam[16] = {{1.0, 1.0}, {1.0, 3.0}, {1.0, -1.0}, {1.0,-3.0}, {3.0, 1.0},
		{3.0, 3.0}, {3.0, -1.0}, {3.0, -3.0}, {-1.0, 1.0}, {-1.0, 3.0}, {-1.0, -1.0}, {-1.0, -3.0},
		{-3.0, 1.0}, {-3.0, 3.0}, {-3.0, -1.0}, {-3.0, -3.0}};
const Complex constMap_64qam[64] = {{3.0, 3.0}, {3.0, 1.0}, {3.0, 5.0}, {3.0, 7.0}, {3.0, -3.0},
{3.0, -1.0}, {3.0, -5.0}, {3.0, -7.0}, {1.0, 3.0}, {1.0, 1.0}, {1.0, 5.0}, {1.0, 7.0}, {1.0, -3.0},
{1.0, -1.0}, {1.0, -5.0}, {1.0, -7.0}, {5.0, 3.0}, {5.0, 1.0}, {5.0, 5.0}, {5.0, 7.0}, {5.0, -3.0},
{5.0, -1.0}, {5.0, -5.0}, {5.0, -7.0}, {7.0, 3.0}, {7.0, 1.0}, {7.0, 5.0}, {7.0, 7.0}, {7.0, -3.0},
{7.0, -1.0}, {7.0, -5.0}, {7.0, -7.0}, {-3.0, 3.0}, {-3.0, 1.0}, {-3.0, 5.0}, {-3.0, 7.0}, {-3.0, -3.0},
{-3.0, -1.0}, {-3.0, -5.0}, {-3.0, -7.0}, {-1.0, 3.0}, {-1.0, 1.0}, {-1.0, 5.0}, {-1.0, 7.0}, 
{-1.0, -3.0}, {-1.0, -1.0}, {-1.0, -5.0}, {-1.0, -7.0}, {-5.0, 3.0}, {-5.0, 1.0}, {-5.0, 5.0},
{-5.0, 7.0}, {-5.0, -3.0}, {-5.0, -1.0}, {-5.0, -5.0}, {-5.0, -7.0}, {-7.0, 3.0}, {-7.0, 1.0},
{-7.0, 5.0}, {-7.0, 7.0}, {-7.0, -3.0}, {-7.0, -1.0}, {-7.0, -5.0}, {-7.0, -7.0}};

struct Complex * ModulatingF(struct BasicParaS * ctrl, int * input, int N) 
{

	struct Complex * output;
	int i, r, temp;

	switch (ctrl->typeModu) 
	{
	case 0:				//BPSK
		r = 1;
		break;
	case 1:				//QPSK
		r = 2;
		break;
	case 2:				//16QAM
		r = 4;
		break;
	case 3:				//64QAM
		r = 6;
		break;
	default:
		exit(EXIT_FAILURE);
	}

	ctrl->numSymOut = N/r;		//输出符号数=码长/r
	ctrl->bitsPerSym = r;					//每个符号含r个bit
	if (ctrl->codeN%r) 
	{
		printf("The number of symbols is not an integer!!!\n");
		exit(EXIT_FAILURE);
	}
	output = new struct Complex[ctrl->numSymOut];

	switch (ctrl->typeModu) 
	{
	case 0:									//BPSK
		for (i=0; i<ctrl->numSymOut; i++) 
		{
			temp = *(input+i);
			(*(output+i)).real = constMap_bpsk[temp].real/sqrt2norm[0];
			(*(output+i)).imag = constMap_bpsk[temp].imag/sqrt2norm[0];
		}
		break;
	case 1:									//QPSK
		for (i=0; i<ctrl->numSymOut; i++) 
		{
			temp = (*(input+2*i))*2+(*(input+2*i+1));
			(*(output+i)).real = constMap_qpsk[temp].real/sqrt2norm[1];
			(*(output+i)).imag = constMap_qpsk[temp].imag/sqrt2norm[1];
		}
		break;
	case 2:
		for (i=0; i<ctrl->numSymOut; i++) 
		{
			temp = (*(input+4*i))*8+(*(input+4*i+1))*4+(*(input+4*i+2))*2+(*(input+4*i+3));
			(*(output+i)).real = constMap_16qam[temp].real/sqrt2norm[2];
			(*(output+i)).imag = constMap_16qam[temp].imag/sqrt2norm[2];
		}
		break;
	case 3:
		for (i=0; i<ctrl->numSymOut; i++) 
		{
			temp = (*(input+6*i))*32+(*(input+6*i+1))*16+(*(input+6*i+2))*8+(*(input+6*i+3))*4+
				(*(input+6*i+4))*2+(*(input+6*i+5))*1;
			(*(output+i)).real = constMap_64qam[temp].real/sqrt2norm[3];
			(*(output+i)).imag = constMap_64qam[temp].imag/sqrt2norm[3];
		}
		break;
	default:
		exit(EXIT_FAILURE);		
	}

	if (ctrl->mode == 1) 
	{
		printf("The modulated symbol are ..\n");
		temp = 0;
		for (i=0; i<ctrl->numSymOut; i++) 
		{
			printf(" %.3f+j%.3f", (*(output+i)).real, (*(output+i)).imag);
			temp++;
			if (temp == 4)
			{
				printf("\n");
				temp = 0;
			}
		}
	}

	return output;
}

⌨️ 快捷键说明

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