📄 project1.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 + -