#include #include #include #define PI acos(-1)//3.1415926535 #define N_FFT 8 #define N_OFDM_SYM 2000 //OFDMシンボル数 #define L_GI 4 #define L_OFDM_SYM (N_FFT + L_GI) //OFDMの1シンボルの長さ[sample] #define L N_FFT*N_OFDM_SYM #define MSEQ_POL_LEN 4 #define L_MSEQ ((1<data.len = a->symbol.len = L; a->prmbl.len = L_MSEQ; a->pr_sym.len = L_MSEQ * N_FFT + L; a->ofdmSmpl.len = L_OFDM_SYM * (N_OFDM_SYM + a->prmbl.len); } void _init_rx(RX_SIGNALS *a){ //構造体RX_SIGNALSの初期化 a->data.len = a->symbol.len = L; a->prmbl.len = L_MSEQ; a->pr_sym.len = (L_MSEQ * N_FFT + L); a->noise.len = a->ofdmSmpl.len = L_OFDM_SYM * (N_OFDM_SYM + L_MSEQ) + (N_FADING_CHANNEL_TAP -1); } void _init_ch(CHANNEL *a){ // CHANNELの初期化 a->coeff.len = N_FADING_CHANNEL_TAP; a->estChCoeff.len = N_FFT; a->output.len = L_OFDM_SYM * (N_OFDM_SYM + L_MSEQ) + (N_FADING_CHANNEL_TAP -1); a->tau1 = TAU1; a->mtgn_dB = MITIGATION_DB; } void _memAlloc_tx(TX_SIGNALS *a){ //構造体TX_SIGNALSのメモリ割当て a->data.dat = (unsigned short int *) calloc(a->data.len, sizeof(unsigned short int)); a->symbol.sig = (COMPLEX *) calloc(a->symbol.len, sizeof(COMPLEX)); a->prmbl.sig = (COMPLEX *) calloc(a->prmbl.len, sizeof(COMPLEX)); a->pr_sym.sig = (COMPLEX *) calloc(a->pr_sym.len, sizeof(COMPLEX)); a->ofdmSmpl.sig = (COMPLEX *) calloc(a->ofdmSmpl.len, sizeof(COMPLEX)); if(a->data.dat==NULL||a->symbol.sig==NULL||a->prmbl.sig==NULL ||a->pr_sym.sig==NULL||a->ofdmSmpl.sig==NULL){ printf("Error: _memAlloc_tx(),メモリを確保できません.\n"); exit(1); } } void _memAlloc_rx(RX_SIGNALS *a){ //構造体RX_SIGNALSのメモリ割当て a->data.dat = (unsigned short int *) calloc(a->data.len, sizeof(unsigned short int)); a->symbol.sig = (COMPLEX *) calloc(a->symbol.len, sizeof(COMPLEX)); a->prmbl.sig = (COMPLEX *) calloc(a->prmbl.len, sizeof(COMPLEX)); a->pr_sym.sig = (COMPLEX *) calloc(a->pr_sym.len, sizeof(COMPLEX)); a->ofdmSmpl.sig = (COMPLEX *) calloc(a->ofdmSmpl.len, sizeof(COMPLEX)); a->noise.sig = (COMPLEX *) calloc(a->noise.len, sizeof(COMPLEX)); if(a->data.dat==NULL||a->symbol.sig==NULL ||a->prmbl.sig==NULL ||a->pr_sym.sig==NULL ||a->ofdmSmpl.sig==NULL||a->noise.sig==NULL){ printf("Error: _memAlloc_rx(),メモリを確保できません.\n"); exit(1); } } void _memAlloc_ch(CHANNEL *a){ //構造体CHANNELのメモリ割当て a->coeff.sig = (COMPLEX *) calloc(a->coeff.len, sizeof(COMPLEX)); a->estChCoeff.sig = (COMPLEX *) calloc(a->estChCoeff.len, sizeof(COMPLEX)); a->output.sig = (COMPLEX *) calloc(a->output.len, sizeof(COMPLEX)); if(a->coeff.sig==NULL||a->estChCoeff.sig==NULL ||a->output.sig==NULL){ printf("Error: _memAlloc_ch(),メモリを確保できません.\n"); exit(1); } } void _memFree_tx(TX_SIGNALS *a){ //構造体TX_SIGNALSのメモリ解放 free(a->data.dat); free(a->symbol.sig); free(a->prmbl.sig); free(a->pr_sym.sig); free(a->ofdmSmpl.sig); } void _memFree_rx(RX_SIGNALS *a){ //構造体RX_SIGNALSのメモリ解放 free(a->data.dat); free(a->symbol.sig); free(a->prmbl.sig); free(a->pr_sym.sig); free(a->ofdmSmpl.sig); free(a->noise.sig); } void _memFree_ch(CHANNEL *a){ //構造体CHANNELのメモリ解放 free(a->coeff.sig); free(a->estChCoeff.sig); free(a->output.sig); } COMPLEX _cSum(COMPLEX a, COMPLEX b) { COMPLEX c; c.I = a.I + b.I; c.Q = a.Q + b.Q; return c; } COMPLEX _cSub(COMPLEX a, COMPLEX b) { COMPLEX c; c.I = a.I - b.I; c.Q = a.Q - b.Q; return c; } COMPLEX _cPro(COMPLEX a, COMPLEX b) { COMPLEX c; c.I = a.I*b.I - a.Q*b.Q; c.Q = a.I*b.Q + a.Q*b.I; return c; } COMPLEX _conj(COMPLEX a){ a.Q = (-1)*a.Q; return a; } double _cAbs(COMPLEX a){ double abs; abs = sqrt(pow(a.I,2)+pow(a.Q,2)); return abs; } COMPLEX _euler(double A, double phi){ COMPLEX c; c.I = A * cos(phi); c.Q = A * sin(phi); return c; } 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>n)>1) n++; return n; } void _FFT_bitReversal(int *rev, int n_fft){ int i,k,n,co,flag; for(i=0;i>1; for(k=0;k<_log2(n_fft);k++){ flag=0; for(i=0;i>= 1; } } void _FFT(SEQ_SIG s2, SEQ_SIG FFTin){ int a,B,wnIndx,i,g,G,m,M,k_dan,revSeq[N_FFT], N_FFT_2 = N_FFT/2,log2_N_FFT; SEQ_SIG wn_FFT,s; wn_FFT.len = N_FFT_2; s.len = N_FFT; wn_FFT.sig = (COMPLEX *)malloc(sizeof(COMPLEX)*wn_FFT.len); s.sig = (COMPLEX *)calloc(s.len,sizeof(COMPLEX)); if(wn_FFT.sig==NULL || s.sig==NULL) printf("Error:_FFT(),メモリを確保できません.\n"); else { _FFT_bitReversal(revSeq, N_FFT); for(i=0;iI /= (double)N_FFT; (s2.sig+i)->Q /= (double)N_FFT; } free(wn_FFT.sig); free(s.sig); } } COMPLEX _cCorr(SEQ_SIG s, SEQ_SIG w, unsigned short int conjFlag){ unsigned int i; COMPLEX tmp, corr = {0.0,0.0}; //conjFlagが1なら,重み係数がconj if(s.len != w.len){ printf("Error: _cCorr, 長さが一致しません.\n"); exit(1); } else{ if(conjFlag==1){ for(i=0;iI,(ch.coeff.sig+i)->Q); _tvf(ch.output, chIn, ch.coeff, 0); } void _mseqGen(SEQ_SIG mseq){ //M系列の生成 unsigned long int i; int k,tmp, tap[MSEQ_POL_LEN] = {0.0}, mseqPol[] = {MSEQ_POL_COEFF}; tap[0] = 1; for(i=0;iI = (double)tap[MSEQ_POL_LEN-1]; tmp = 0; for(k=0;k0;k--) tap[k]=tap[k-1]; tap[0] = tmp; } for(i=0;iI ==0.0) (mseq.sig+i)->I = -1.0; } } void _ofdmTx(SEQ_SIG ofdmSmpl, SEQ_SIG symbol){ unsigned int k,m; SEQ_SIG spcOut, IFFTout; IFFTout.len = spcOut.len = N_FFT; IFFTout.sig = (COMPLEX *)malloc(sizeof(COMPLEX)*IFFTout.len); spcOut.sig = (COMPLEX *)malloc(sizeof(COMPLEX)*spcOut.len); if(IFFTout.sig==NULL || spcOut.sig==NULL){ printf("Error:ofdmTx(),メモリを確保できません.\n"); exit(1); } else{ for(k=0;k<(symbol.len/N_FFT);k++){ // S/P変換 for(m=0;m