#include #include #include #include #define PI acos(-1)//3.1415926535 #define L 10000 //送信データビット数 #define SNR_STEP 10 typedef struct{ double I; double Q; }COMPLEX; typedef struct{ COMPLEX *sig; unsigned int len; }SEQ_SIG; typedef struct{ unsigned short int *dat; unsigned int len; }SEQ_DATA; double _randU(void){ return((double)rand()/(double)RAND_MAX); } double _randN(void){ double s, r, t; s = _randU(); if(s==0.0) s = 0.000000001; r = sqrt(-2.0*log(s)); t = 2.0*PI*_randU(); return (r*sin(t)); } void _randData(SEQ_DATA d){ unsigned int i; double x; for(i=0;i=0.5) *(d.dat+i) =1.0; else *(d.dat+i) =0.0; } } void _bpskMod(SEQ_SIG s, SEQ_DATA data){ unsigned int i; if (s.len != data.len){ printf("Error: _bpskMod, 長さが一致しません.\n"); exit(1); } else { for(i=0;iI = (*(data.dat+i) -0.5)*2.0; } } void _awgn(SEQ_SIG n, double Pn){ double r, t; unsigned int i; for(i=0;iI = _randN() * sqrt(Pn/2); (n.sig+i)->Q = _randN() * sqrt(Pn/2); } } double _SNRdB2noisePower(double c_dB){ return pow(10,(-1)*c_dB/10); } void _vectorSum(SEQ_SIG a, SEQ_SIG b, SEQ_SIG c){ unsigned int i; if(a.len != b.len || b.len != c.len){ printf("Error: _vectorSum, 長さが一致しません.\n"); exit(1); } else{ for(i=0;iI = (b.sig+i)->I + (c.sig+i)->I; (a.sig+i)->Q = (b.sig+i)->Q + (c.sig+i)->Q; } } } void _bpskDem(SEQ_DATA rData, SEQ_SIG rs){ unsigned int i; for(i=0;iI>0) *(rData.dat+i) = 1; else *(rData.dat+i) = 0; } } double _BER(SEQ_DATA data, SEQ_DATA rData){ unsigned int i,sum=0; double BER; if(data.len != rData.len){ printf("Error: _BER() 長さが一致しません.\n"); exit(1); } else{ for(i=0;i