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

📄 project1.c

📁 C语言实现qpsk调制解调在ti5000系列DSP芯片上仿真的程序
💻 C
字号:
/* Note:Your choice is C IDE */
#include "stdio.h"

#include	"const.h"



/*transmitter*/

void transmitter(int (*bit), double (*signal)[2]){
	bit_generator(bit);
	QPSK_modulator(bit, signal);
}

void bit_generator(int (*bit)){
	int n;

	for(n=0; n<BITN; n++){
    	bit[n] = rand() & 0x1;
	}
}

void QPSK_modulator(int (*bit), double (*signal)[2]){
	int n, bit1, bit2, symbol;
	int bin2sym[2][2] = {
		{ 0, 1},
		{ 3, 2}
	};
	double sym2sgnl[4][2] = {
		{ OneBySqrt2, OneBySqrt2},
		{-OneBySqrt2, OneBySqrt2},
		{-OneBySqrt2,-OneBySqrt2},
		{ OneBySqrt2,-OneBySqrt2}
	};
	
	for(n=0; n<SYMBOLN; n++){
		bit1 = bit[n*2];
		bit2 = bit[n*2+1];
		symbol = bin2sym[bit1][bit2];
		signal[n][0] = sym2sgnl[symbol][0];
		signal[n][1] = sym2sgnl[symbol][1];
	}
}




/*noise*/

extern double CNR;


void awgn(double (*transmitted_signal)[2], double (*received_signal)[2]){
	int n;
	double r1, r2;
	double amp, phase;
	double gamma, noise[2];

	gamma = pow(10.0, CNR / 10.0);

	for(n=0; n<SYMBOLN; n++) {
		r1 = (double)rand()/RAND_MAX;
		r2 = (double)rand()/RAND_MAX;
		if(r1 <= 1.0e-8) {
			r1 = 1.0e-8; //防止出现log0的操作
		}
		
		amp = sqrt(-log(r1) / gamma);
		phase = 2.0 * PI * r2;
		noise[0] = amp * cos(phase);
		noise[1] = amp * sin(phase);

		received_signal[n][0] = transmitted_signal[n][0] + noise[0];
		received_signal[n][1] = transmitted_signal[n][1] + noise[1];
	}
}



/*receiver*/

void receiver(double (*signal)[2], int (*bit)){
	QPSK_demodulator(signal, bit);
}

void QPSK_demodulator(double (*signal)[2], int (*bit)){
	int n, symbol;
	int sym2bin[4][2] = {
		{0,0},
		{0,1},
		{1,1},
		{1,0}
	};

	for(n=0; n<SYMBOLN; n++){
		if(signal[n][0] >= 0.0) {
			symbol = (signal[n][1] >= 0.0) ? 0 : 3;
		}else {	
			symbol = (signal[n][1] >= 0.0) ? 1 : 2;
		}
		
		bit[n*2] = sym2bin[symbol][0];
		bit[n*2+1] = sym2bin[symbol][1];
	}
}





/*BER*/
extern double CNR;


void BER(int loop, int (*tbit), int (*rbit)){
	int n, error = 0;
	double Pe;
	static double AverageBER = 0.0;
	FILE *fp;

	for(n=0; n<BITN; n++){
		if(tbit[n] != rbit[n]) error++;
	}
	Pe = (double) error / BITN;
	AverageBER += (double) Pe /	LOOPN;
	//printf("# %5d: Eb/N0 = %f, %e\t%e\n", loop, (CNR - 3.0), Pe, AverageBER);

	if(loop==LOOPN-1){
		printf("Eb/N0 = %f, Average BER = %e\n",(CNR - 3.0), AverageBER);
		fp = fopen(FILENAME,"a");
		fprintf(fp,"%f\t%e\n",(CNR - 3.0), AverageBER);
		fclose(fp);
		
		AverageBER = 0.0;
	}
}






/*main*/


double CNR;

void main()
{
    int loop, loop_CNR;
	int	transmitted_bit[BITN], received_bit[BITN];
	double transmitted_signal[SYMBOLN][2], received_signal[SYMBOLN][2];

	srand((unsigned)time(NULL));	/* 初始化随机子*/

	for(loop_CNR=3; loop_CNR<=14; loop_CNR++) {
		CNR = (double)loop_CNR;

		for(loop=0; loop<LOOPN; loop++) {
			transmitter(transmitted_bit, transmitted_signal);
			awgn(transmitted_signal, received_signal);
			receiver(received_signal, received_bit);
			BER(loop, transmitted_bit, received_bit);
		}	
	}
}

⌨️ 快捷键说明

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