Appendice software
In questa sezione vengono riportati i programmi utilizzati nelle simulazioni
software, effettuate presso il laboratorio di Sistemi di Comunicazione del
Dipartimento di Ingegneria dell’Informazione di Pisa.
Questi programmi sono scritti con il linguaggio di programmazione
FORTRAN90.
Riportiamo nell’ordine le varie subroutine che vengono richiamate nel
programma e uno dei programmi implementati.
Per l’implementazione dell’ algoritmo sono state utilizzate anche alcune routine
che fanno parte della libreria del pacchetto di SPACE (Software Package for
Communication Enviroment). Queste routine non vengono riportate in quanto
facilmente reperibili.
Il programma riportato calcola la BER, la SER e la FER nel caso di canale di
Rayleigh con banda Doppler
B T
d=
0.062: la modulazione utilizzata è la 16QAM,
Inizialmente riportiamo come esempio il file di ingresso relativo al caso descritto.
ni 1 jseed 55679 semesig 66549 num_frame 100 nerrmax 100
dur_tx !durata del filtro di tx
16
a !rolloff
0.25
N !è il num di utenti contemporaneamente attivi
16 M 16 EbN0in 0. EbN0fin 30. numpassi 31 Npath 6 Ritardi diff 0. 0.00048 0.00096 0.00144 0.036 0.04128 pot medie 0. -2. -4. -7.
-6. -12.
Banda dopppler 0.062
numero poli Butt 4 tau 0. SUBROUTINE GRAY_MAP4(b1,b0,simb) implicit none integer*4 b0, b1, ind complex*8 simb, map4(0:3) map4(0)=(1., 1.) map4(1)=(-1., 1.) map4(2)=(1., -1.) map4(3)=(-1., -1.) ind=b0+(b1*2) simb=map4(ind) return end SUBROUTINE SAGOMATORE(h,av,an,durata,ncis,cont,xnu) implicit none integer*4 durata,ncis,cont,m,i real*4 h(ncis*durata),av(durata),xn,xnu,y(100),an xn=0. m=mod(cont,ncis) if (m.EQ.0) then do i=durata-1,1,-1 av(i+1)=av(i) enddo av(1)=an endif do i=1,durata y(i)=h(m+i*ncis)
enddo call prodscal(av,y,xn,durata) xnu=xn return end SUBROUTINE PRODSCAL(x,y,out,n) implicit none integer*4 n,m real*4 x(n),y(n),out out=0 do m=1,n out=out+x(m)*y(m) enddo end SUBROUTINE RADNYQUIST(v,durata,num_camp,a,fasein) implicit none integer*4 durata,num_camp,i,N real*4 a,fasein,v(durata*num_camp),tc,camp,y,yg,r,pi parameter(pi=3.141592653589793) N=durata*num_camp do i=1,N r=real(i) tc=r/num_camp-fasein-durata/2 if (tc.EQ.0) then camp=1+a*(4/pi-1)
else if (a.EQ.0) then
yg=tc*pi camp=sin(yg)/yg else y=abs(tc) if (y*a.EQ.0.25) then camp=a*(cos(pi/4*(1-a)/a)- & 2/pi*cos(pi/4*(1+a)/a)) else
yg=y*pi y=4*a*y camp=(sin(yg*(1-a))+y*cos(yg*(1+a)))/ & (yg*(1-y*y)) endif endif v(i)=camp enddo return end SUBROUTINE GENQAM(v,m) implicit none integer*4 x,i,m1,m,v(2),irand m1=sqrt(real(m)) do i=1,2 x=irand() x=mod(x,m1) v(i)=2*x-(m1-1) enddo return end SUBROUTINE INSERRX(x,xn,durata,ncis,cont) implicit none integer*4 durata,ncis,cont,N,posiz real*4 x(durata*ncis),xn N=durata*ncis posiz=mod(cont,N) x(posiz+1)=xn return end SUBROUTINE CONVOLUZIONE(gr,x,durata,ncis,cont,ynu) implicit none
integer*4 durata,ncis,cont,N,posiz,j,i real*4 gr(ncis*durata),x(ncis*durata),yn,ynu,y(ncis*durata) yn=0. N=ncis*durata posiz=mod(cont,N)+1 do j=posiz,1,-1 y(j)=gr(posiz+1-j) enddo do i=N,posiz+1,-1 y(i)=gr(N+posiz+1-i) enddo call prodscal(x,y,yn,N) ynu=yn/real(ncis) return end SUBROUTINE DECIQAM(vrum,vdec,m) Implicit NONE real*4 vrum(2),soglia,m1 integer*4 i,m,vdec(2) m1=sqrt(real(m)) do i=1,2 soglia=-(m1-2) if (vrum(i).LE.soglia) then vdec(i)=-(m1-1)
elseif (vrum(i).GT.-soglia) then
vdec(i)=m1-1 else do while(soglia.le.vrum(i)) soglia=soglia+2 enddo vdec(i)=soglia-1 endif enddo return end
SUBROUTINE MAPPAINV4(simb,b0,b1) implicit none
integer*4 b0, b1
complex*8 simb, map4(0:3) map4(0)=(1., 1.) map4(1)=(-1., 1.) map4(2)=(1., -1.) map4(3)=(-1., -1.) if(simb.eq.map4(0)) then b0=0 b1=0 endif if(simb.eq.map4(1)) then b0=0 b1=1 endif if(simb.eq.map4(2)) then b0=1 b1=0 endif if(simb.eq.map4(3)) then b0=1 b1=1 endif return end
PROGRAM FMT_CAMMINI_MULTIPLI_VARIABILE
implicit none
integer*4 ni, i, j, e, b(100000), u, semesig, N, L, M, P,
& kk, dati(0:5), b0, b1, b2, b3, b4, b5, l2,
& k, dur_tx, dur_rx, jseed, block, numpassi,
& vdec(2), cont(0:63), conto,
& ind, num_block, num_symb, contacicli,
& a0, a1, a2, a3, a4, a5, bit(6), bitt(6),
& c0, c1, c2, c3, c4, c5, alfa, beta,
& ndecis, nerr, bit_dec, bit_err, frameerr,
& nerrmax, berr, errore, c, num_frame,
& framedec, indice, Npath, np
real*4 M2, n_bit, sfas, a, camp(1280), pi,
& mat_pol_tx(0:79,6,1280), EbN0,
& mat_pol_rx(0:63,1280), EbN0in, EbN0fin,
& vconv(2), simb(2), akk(0:63,6,16),
& bkk(0:63,6,16), ak(16), bk(16),
& vet_polt(1280), vsag1(2),vrx(2), dev,
& framerrx(0:63), frameirx(0:63),
& framerrx_st(0:63), frameirx_st(0:63),
& vconv_st(2), vrum(2), fisag(0:63),
& frsag(0:63), vsag(2), fr(0:63), decisoi,
& decisoq, txi, txr,fi(0:63), vdem(2),
& vdem_st(2), xr(1280), yr(1280),
& xr_st(1280), yr_st(1280), xrr(0:63,1280),
& yrr(0:63,1280), xrr_st(0:63,1280),
& yrr_st(0:63,1280), vet_polr(1280),
& vconv1(2), err, potenza, errnorm,
& pot_lin(6), normtap, potenza1,
& BER, SER, FER, rit(6), pot(6), usc(2),
& err1, err_norm_per, log_errnorm,
& pip, Bd, BN, AreaFad(1000), devtap,
& transit,tapin(100), tapnew(100),
& tapusc(100), tau, camp_tx, camp_rx
complex*8 simbo, s_map(0:63), simb_tx(0:63,16), dec(0:63),
& mat_app(0:63,16), mat_app1(0:63,16),
& simbolo_rx,simbolo_tx, campione, tap(6),
& matrx_st(0:1023), frame_trasmesso(0:63,32),
& frame_deciso(0:63,32),canale_vero(0:63) parameter(pi=3.141592653589793) open(10,file='in_cam_mul_variabile_HT200.txt') read(10,*) read(10,*) ni read(10,*) read(10,*) jseed read(10,*) read(10,*) semesig read(10,*) read(10,*) num_frame read(10,*) read(10,*) nerrmax read(10,*)
read(10,*) dur_tx !durata del filtro di tx read(10,*)
read(10,*) a !rolloff
read(10,*)
read(10,*) N !è il num di utenti
! contemporaneamente attivi read(10,*) read(10,*) M read(10,*) read(10,*) EbN0in read(10,*) read(10,*) EbN0fin read(10,*) read(10,*) numpassi read(10,*) read(10,*) Npath read(10,*) read(10,*) rit(1) read(10,*) rit(2)
read(10,*) rit(3) read(10,*) rit(4) read(10,*) rit(5) read(10,*) rit(6) read(10,*) read(10,*) pot(1) read(10,*) pot(2) read(10,*) pot(3) read(10,*) pot(4) read(10,*) pot(5) read(10,*) pot(6) read(10,*) read(10,*) Bd read(10,*) read(10,*) np read(10,*) read(10,*) tau close(10) do i=1,Npath pot_lin(i)=10.**(pot(i)/10.) enddo M2=log10(real(M))/log10(2.) n_bit=real(N)*M2 l2=nint(log10(real(N))/log10(2.)) P=(1+a)*N dur_rx=(1+a)*dur_tx L=dur_tx num_block=num_frame*32 camp_tx=P camp_rx=N
*---inizializzazione filtri polifase in tx---*
do k=1,Npath
do i=0,P-1
sfas=(real(i)/real(P))+rit(k)+tau
call RADNYQUIST(camp,dur_tx,camp_tx,a,sfas)
mat_pol_tx(i,k,j)=camp(j) enddo
enddo enddo
*---inizializzazione filtri polifase in rx---*
do i=0,N-1 sfas=real(i)/real(N) call RADNYQUIST(camp,dur_rx,camp_rx,a,sfas) do j=1,camp_rx*dur_rx mat_pol_rx(i,j)=camp(j) enddo enddo
*---parametri filtro passa basso per fading---* pip=pi/(2.*np) BN=Bd*pip/sin(pip) devtap=0.5*sqrt(2/BN) transit=5*nint(1/Bd) do contacicli=1,numpassi ndecis=0 nerr=0 bit_dec=0 bit_err=0 frameerr=0 framedec=0 berr=0 if (numpassi.NE.1) then EbN0=EbN0in+(contacicli-1)*(EbN0fin- & EbN0in)/(numpassi-1) else EbN0=EbN0in endif EbN0=10.**(EbN0/10.) *---azzeramento modulatori---* do i=0,N-1
cont(i)=0 do k=1,Npath do j=1,dur_tx akk(i,k,j)=0 bkk(i,k,j)=0 enddo enddo do j=1,dur_rx*camp_rx xrr(i,j)=0 yrr(i,j)=0 enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=0 yrr_st(i,j)=0 enddo enddo do i=1,dur_tx ak(i)=0 bk(i)=0 enddo do i=1,dur_rx*camp_rx xr(i)=0 yr(i)=0 enddo do i=1,dur_rx*camp_rx xr_st(i)=0 yr_st(i)=0 enddo
*---definizione filtro di butterworth per il fading---*
call BUTDEF(AreaFad,2*Npath,np,0.,Bd,real(P))
*---transitorio iniziale per il filtro di butterworth---*
do i=1,transit
do j=1,Npath
call GAUSSGEN(usc,devtap,65529)
tapin(2*j-1)=usc(1) tapin(2*j)=usc(2)
enddo call FILRUN(areaFad,tapin,tapnew) enddo *---CICLO SU SNR---* *---inizializzazione registro---* do kk=L,1,-1
*---generazione bit di info---*
do k=1,n_bit call UNI_SYMBGEN(u,1,2,semesig) b(k)=u enddo *---mappatura---* do e=0,N-1 do k=1,M2 dati(k-1)=b(k+e*M2) enddo if(M.eq.4) then b0=dati(0) b1=dati(1) call GRAY_MAP4(b0,b1,simbo) endif if (M.eq.16) then b0=dati(0) b1=dati(1) b2=dati(2) b3=dati(3) call GRAY_MAP16(b0,b1,b2,b3,simbo) endif if (M.eq.64) then b0=dati(0) b1=dati(1) b2=dati(2) b3=dati(3) b4=dati(4)
b5=dati(5) call GRAY_MAP64(b0,b1,b2, & b3,b4,b5,simbo) endif s_map(e)=simbo enddo do i=0,N-1 simb_tx(i,kk)=s_map(i) enddo call IFFT(s_map,l2) do i=0,N-1 mat_tx(i,kk)=s_map(i) enddo enddo block=0 err=0. num_symb=0 ind=L *---trasmissione simboli---* do while((block.LT.num_block)) if(block.LE.(num_block-L)) then
*---riempimento shift register su ogni sottoportante---*
do i=0,N-1 conto=cont(i) if(block.EQ.0) then fr(i)=real(mat_tx(i,L)) fi(i)=aimag(mat_tx(i,L)) endif if(conto.EQ.(20*P)) then if (mod(block,32).EQ.0) then if (berr.NE.0) frameerr= & frameerr+1 framedec=framedec+1 endif block=block+1 goto 1
endif enddo
1 if((block.GE.1).AND.(conto.EQ.20*
& camp_tx)) then
num_symb=num_symb+N *---aggiornamento registro---* do k=1,n_bit call UNI_SYMBGEN(u,1,2, & semesig) b(k)=u enddo *---mappatura---* do e=0,N-1 do k=1,M2 dati(k-1)=b(k+e*M2) enddo if(M.eq.4) then b0=dati(0) b1=dati(1) call GRAY_MAP4(b0,b1, & simbo) endif if (M.eq.16) then b0=dati(0) b1=dati(1) b2=dati(2) b3=dati(3) call GRAY_MAP16(b0,b1, & b2,b3,simbo) endif if (M.eq.64) then b0=dati(0) b1=dati(1) b2=dati(2) b3=dati(3) b4=dati(4)
b5=dati(5) call GRAY_MAP64(b0,b1, & b2,b3,b4,b5,simbo) endif s_map(e)=simbo enddo do i=0,N-1 do j=1,L-1 mat_app1(i,j)= & simb_tx(i,j) enddo do j=2,L simb_tx(i,j)= & mat_app1(i,j-1) enddo simb_tx(i,1)=s_map(i) enddo call IFFT(s_map,l2) do i=0,N-1 do j=1,L-1 mat_app(i,j)=mat_tx(i,j) enddo do j=2,L mat_tx(i,j)= & mat_app(i,j-1) enddo mat_tx(i,1)=s_map(i) enddo do i=0,N-1 fr(i)=real(mat_tx(i,L)) fi(i)=aimag(mat_tx(i,L)) enddo
*---azzeramento modulatori x blocco successivo---*
do i=0,N-1
cont(i)=0
do k=1,Npath
akk(i,k,j)=0 bkk(i,k,j)=0 enddo enddo do j=1,dur_rx*camp_rx xrr(i,j)=0 yrr(i,j)=0 enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=0 yrr_st(i,j)=0 enddo enddo do k=1,dur_tx ak(k)=0 bk(k)=0 enddo do k=1,dur_rx*camp_rx xr(k)=0 yr(k)=0 enddo do k=1,dur_rx*camp_rx xr_st(k)=0 yr_st(k)=0 enddo endif
*---generazione ingresso filtro B. e filtraggio---*
if(mod(block,32).EQ.0) then do j=1,Npath call Gaussgen(usc,devtap, & 65529) tapin(2*j-1)=usc(1) tapin(2*j)=usc(2) enddo call FilRun(AreaFad,tapin,tapusc)
normtap=0. do k=1,1000 do j=1,Npath tap(j)=pot(j)* & cmplx(tapusc(2*j-1),tapusc(2*j)) normtap=normtap+cabs & (tap(j)**2) enddo enddo potenza1=normtap/1000 endif
*---deviazione standard del rumore---* dev=(M-1)/(3.*M2*EbN0) dev=sqrt(dev) *---sagomatura---* do i=0,N-1 campione=cmplx(0.,0.) simb(1)=fr(i) simb(2)=fi(i) do k=1,Npath do j=1,dur_tx ak(j)=akk(i,k,j) bk(j)=bkk(i,k,j) enddo do kk=1,dur_tx*camp_rx vet_polt(kk)=mat_pol_tx(
& mod (N*block+i,P),k,kk)
enddo conto=cont(i) call SAGOMATORE(vet_polt,ak, & simb(1),dur_tx,camp_tx,conto,vsag(1)) call SAGOMATORE(vet_polt,bk, & simb(2),dur_tx,camp_tx,conto,vsag(2)) do j=1,dur_tx akk(i,k,j)=ak(j) bkk(i,k,j)=bk(j)
enddo campione=campione+tap(k)* & cmplx(vsag(1),vsag(2)) enddo frsag(i)=real(campione) fisag(i)=aimag(campione) enddo
*---aggiunta rumore termico---*
do i=0,N-1 vsag1(1)=frsag(i) vsag1(2)=fisag(i) call GAUSSGEN(vrum,dev,jseed) vrx(1)=vsag1(1)+vrum(1)*ni vrx(2)=vsag1(2)+vrum(2)*ni framerrx(i)=vrx(1) frameirx(i)=vrx(2) framerrx_st(i)=vrx(1) frameirx_st(i)=vrx(2) enddo **---RX---** *---filtraggio adattato---* do i=0,N-1 conto=cont(i) vdem(1)=framerrx(i) vdem(2)=frameirx(i) vdem_st(1)=framerrx_st(i) vdem_st(2)=frameirx_st(i) do j=1,dur_rx*camp_rx xr(j)=xrr(i,j) yr(j)=yrr(i,j) enddo do j=1,dur_rx*camp_rx xr_st(j)=xrr_st(i,j) yr_st(j)=yrr_st(i,j) enddo
call INSERRX(xr,vdem(1),dur_rx, & camp_rx,conto) call INSERRX(yr,vdem(2),dur_rx, & camp_rx,conto) call INSERRX(xr_st,vdem(1),dur_rx, & camp_rx,conto) call INSERRX(yr_st,vdem(2),dur_rx, & camp_rx,conto) do j=1,dur_rx*camp_rx xrr(i,j)=xr(j) yrr(i,j)=yr(j) enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=xr_st(j) yrr_st(i,j)=yr_st(j) enddo enddo do i=0,N-1 do k=1,dur_rx*camp_rx vet_polr(k)=mat_pol_rx(i,k) enddo if(conto.EQ.(20*camp_tx-1)) then do j=1,dur_rx*camp_rx xr(j)=xrr(i,j) yr(j)=yrr(i,j) enddo do j=1,dur_rx*camp_rx xr_st(j)=xrr_st(i,j) yr_st(j)=yrr_st(i,j) enddo call CONVOLUZIONE(vet_polr,xr, & dur_rx,camp_rx,conto,vconv(1)) call CONVOLUZIONE(vet_polr,yr, & dur_rx,camp_rx,conto,vconv(2)) call CONVOLUZIONE(vet_polr, & xr_st,dur_rx,camp_rx,conto,vconv_st(1)) call CONVOLUZIONE(vet_polr, & yr_st,dur_rx,camp_rx,conto,vconv_st(2))
do j=1,dur_rx*camp_rx xrr(i,j)=xr(j) yrr(i,j)=yr(j) enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=xr_st(j) yrr_st(i,j)=yr_st(j) enddo matrx(i)=cmplx(vconv(1), & vconv(2)) matrx_st(i)=cmplx(vconv_st(1), & vconv_st(2)) endif cont(i)=cont(i)+1 enddo *---fft---* if(conto.EQ.(20*camp_tx-1)) then call FFT(matrx,l2) call FFT(matrx_st,l2) do i=0,N-1 err=err+(CABS(simb_tx(i,L)- & matrx(i)))**2 enddo
*---ottengo canale vero---*
do i=0,N-1
canale_vero(i)=matrx_st(i)/ & simb_tx(i,L) enddo
*---EQUALIZZAZIONE CON CANALE NOTO---*
do i=0,N-1
r_eq(i)=matrx(i)/
& canale_vero(i) enddo
do i=0,N-1 vconv1(1)=real(matrx(i)) vconv1(2)=aimag(matrx(i)) call DECIQAM(vconv1,vdec,M) ndecis=ndecis+1 bit_dec=bit_dec+M2 decisoi=vdec(1) decisoq=vdec(2) txr=real(simb_tx(i,L)) txi=aimag(simb_tx(i,L)) if((decisoi.NE.txr).OR. & (decisoq.NE.txi))then nerr=nerr+1 berr=berr+1 endif dec(i)=cmplx(vdec(1),vdec(2)) *---demapping dei simboli decisi---*
simbolo_rx=cmplx(vdec(1), & vdec(2)) simbolo_tx=cmplx(txr,txi) if(mod(block,32).EQ.0)indice=1 frame_trasmesso(i,indice)= & simbolo_tx frame_deciso(i,indice)= & simbolo_rx if(M.eq.4) then call MAPPAINV4( & simbolo_rx,a0,a1) bit(1)=a0 bit(2)=a1 call MAPPAINV4( & simbolo_tx,c0,c1) bitt(1)=c0 bitt(2)=c1 endif if(M.eq.16) then call MAPPAINV16(
& simbolo_rx,a0,a1,a2,a3) bit(1)=a0 bit(2)=a1 bit(3)=a2 bit(4)=a3 call MAPPAINV16( & simbolo_tx,c0,c1,c2,c3) bitt(1)=c0 bitt(2)=c1 bitt(3)=c2 bitt(4)=c3 endif if(M.eq.64) then call MAPPAINV64( & simbolo_rx,a0,a1,a2,a3,a4,a5) bit(1)=a0 bit(2)=a1 bit(3)=a2 bit(4)=a3 bit(5)=a4 bit(6)=a5 call MAPPAINV64( & simbolo_tx,c0,c1,c2,c3,c4,c5) bitt(1)=c0 bitt(2)=c1 bitt(3)=c2 bitt(4)=c3 bitt(5)=c4 bitt(6)=c5 endif
*---decisione sui bit---* errore=0 do kk=1,M2 alfa=bit(kk) beta=bitt(kk) c=IEOR(alfa,beta) errore=errore+c
enddo bit_err=bit_err+errore enddo indice=indice+1 endif endif if(block.GT.(num_block-L)) then do i=0,N-1 conto=cont(i) enddo if(conto.EQ.20*camp_-tx) then if (mod(block,32).EQ.0) then if (berr.NE.0)frameerr= & frameerr+1 framedec=framedec+1 endif block=block+1 num_symb=num_symb+N do i=0,N-1 fr(i)=real(mat_tx(i,ind)) fi(i)=aimag(mat_tx(i,ind)) enddo
*---azzeramento modulatori x blocco successivo---*
do i=0,N-1 cont(i)=0 do k=1,Npath do j=1,dur_tx akk(i,k,j)=0 bkk(i,k,j)=0 enddo enddo do j=1,dur_rx*camp_rx xrr(i,j)=0 yrr(i,j)=0 enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=0
yrr_st(i,j)=0 enddo enddo do k=1,dur_tx ak(k)=0 bk(k)=0 enddo do k=1,dur_rx*camp_rx xr(k)=0 yr(k)=0 enddo do k=1,dur_rx*camp_rx xr_st(k)=0 yr_st(k)=0 enddo endif *---sagomatura---* do i=0,N-1 campione=cmplx(0.,0.) simb(1)=fr(i) simb(2)=fi(i) do k=1,Npath do j=1,dur_tx ak(j)=akk(i,k,j) bk(j)=bkk(i,k,j) enddo do kk=1,dur_tx*camp_tx vet_polt(kk)=mat_pol_tx( & mod(N*block+i,P),k,kk) enddo conto=cont(i) call SAGOMATORE(vet_polt,ak, & simb(1),dur_tx,camp_tx,conto,vsag(1)) call SAGOMATORE(vet_polt,bk, & simb(2),dur_tx,camp_tx,conto,vsag(2)) do j=1,dur_tx akk(i,k,j)=ak(j)
bkk(i,k,j)=bk(j) enddo campione=campione+tap(k)* & cmplx(vsag(1),vsag(2)) enddo frsag(i)=real(campione) fisag(i)=aimag(campione) enddo
*---aggiunta rumore termico---*
do i=0,N-1 vsag1(1)=frsag(i) vsag1(2)=fisag(i) call GAUSSGEN(vrum,dev,jseed) vrx(1)=vsag1(1)+vrum(1)*ni vrx(2)=vsag1(2)+vrum(2)*ni framerrx(i)=vrx(1) frameirx(i)=vrx(2) framerrx_st(i)=vrx(1) frameirx_st(i)=vrx(2) enddo **---RX---** *---filtraggio adattato---* do i=0,N-1 conto=cont(i) vdem(1)=framerrx(i) vdem(2)=frameirx(i) vdem_st(1)=framerrx_st(i) vdem_st(2)=frameirx_st(i) do j=1,dur_rx*camp_rx xr(j)=xrr(i,j) yr(j)=yrr(i,j) enddo do j=1,dur_rx*camp_rx xr_st(j)=xrr_st(i,j) yr_st(j)=yrr_st(i,j)
enddo call INSERRX(xr,vdem(1),dur_rx, & camp_rx,conto) call INSERRX(yr,vdem(2),dur_rx, & camp_rx,conto) call INSERRX(xr_st,vdem(1),dur_rx, & camp_rx,conto) call INSERRX(yr_st,vdem(2),dur_rx, & camp_rx,conto) do j=1,dur_rx*camp_rx xrr(i,j)=xr(j) yrr(i,j)=yr(j) enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=xr_st(j) yrr_st(i,j)=yr_st(j) enddo enddo do i=0,N-1 do k=1,dur_rx*camp_rx vet_polr(k)=mat_pol_rx(i,k) enddo if(conto.EQ.(20*P-1)) then do j=1,dur_rx*camp_rx xr(j)=xrr(i,j) yr(j)=yrr(i,j) enddo do j=1,dur_rx*camp_rx xr_st(j)=xrr_st(i,j) yr_st(j)=yrr_st(i,j) enddo call CONVOLUZIONE(vet_polr,xr, & dur_rx,camp_rx,conto,vconv(1)) call CONVOLUZIONE(vet_polr,yr, & dur_rx,camp_rx,conto,vconv(2)) call CONVOLUZIONE(vet_polr, & xr_st,dur_rx,camp_rx,conto,vconv_st(1)) call CONVOLUZIONE(vet_polr,
& yr_st,dur_rx,N,conto,vconv_st(2)) do j=1,dur_rx*camp_rx xrr(i,j)=xr(j) yrr(i,j)=yr(j) enddo do j=1,dur_rx*camp_rx xrr_st(i,j)=xr_st(j) yrr_st(i,j)=yr_st(j) enddo matrx(i)=cmplx(vconv(1), & vconv(2)) matrx_st(i)=cmplx(vconv_st(1), & vconv_st(2)) endif cont(i)=cont(i)+1 enddo *---fft---* if(conto.EQ.(20*camp_tx-1)) then call FFT(matrx,l2) call FFT(matrx_st,l2) do i=0,N-1 err=err+(CABS(simb_tx(i,ind)- & matrx(i)))**2 enddo
*---ottengo canale vero---*
do i=0,N-1
canale_vero(i)=matrx_st(i)/ & simb_tx(i,ind) enddo
*---EQUALIZZAZIONE CON CANALE NOTO---*
do i=0,N-1
r_eq(i)=matrx(i)/
& canale_vero(i) enddo
do i=0,N-1 vconv1(1)=real(matrx(i)) vconv1(2)=aimag(matrx(i)) call DECIQAM(vconv1,vdec,M) ndecis=ndecis+1 bit_dec=bit_dec+M2 decisoi=vdec(1) decisoq=vdec(2) txr=real(simb_tx(i,ind)) txi=aimag(simb_tx(i,ind)) if((decisoi.NE.txr).OR. & (decisoq.NE.txi))then nerr=nerr+1 berr=berr+1 endif dec(i)=cmplx(vdec(1),vdec(2)) *---demapping dei simboli decisi---*
simbolo_rx=cmplx(vdec(1), & vdec(2)) simbolo_tx=cmplx(txr,txi) if(mod(block,32).EQ.0)indice=1 frame_trasmesso(i,indice)= & simbolo_tx frame_deciso(i,indice)= & simbolo_rx if(M.eq.4) then call MAPPAINV4( & simbolo_rx,a0,a1) bit(1)=a0 bit(2)=a1 call MAPPAINV4( & simbolo_tx,c0,c1) bitt(1)=c0 bitt(2)=c1 endif if(M.eq.16) then call MAPPAINV16(
& simbolo_rx,a0,a1,a2,a3) bit(1)=a0 bit(2)=a1 bit(3)=a2 bit(4)=a3 call MAPPAINV16( & simbolo_tx,c0,c1,c2,c3) bitt(1)=c0 bitt(2)=c1 bitt(3)=c2 bitt(4)=c3 endif if(M.eq.64) then call MAPPAINV64( & simbolo_rx,a0,a1,a2,a3,a4,a5) bit(1)=a0 bit(2)=a1 bit(3)=a2 bit(4)=a3 bit(5)=a4 bit(6)=a5 call MAPPAINV64( & simbolo_tx,c0,c1,c2,c3,c4,c5) bitt(1)=c0 bitt(2)=c1 bitt(3)=c2 bitt(4)=c3 bitt(5)=c4 bitt(6)=c5 endif
*---decisione sui bit---* errore=0 do kk=1,M2 alfa=bit(kk) beta=bitt(kk) c=IEOR(alfa,beta) errore=errore+c
enddo bit_err=bit_err+errore enddo indice=indice+1 ind=ind-1 endif endif enddo err1=err/num_symb potenza=(M-1)/3 errnorm=err1/potenza errnorm=sqrt(errnorm) log_errnorm=10*log10(errnorm) BER=real(bit_err)/real(bit_dec) SER=real(nerr)/real(ndecis) FER=real(frameerr)/real(framedec) open(15,file='BER.out',access='append') write(15,*) 'EbN0=',10*(log10(EbN0)),'BER=',BER close(15) open(25,file='SER.out',access='append') write(25,*) 'EbN0=',10*(log10(EbN0)),'SER=',SER close(25) open(35,file='FER.out',access='append') write(35,*) 'EbN0=',10*(log10(EbN0)),'FER=',FER close(35) enddo *---FINE CICLO SNR---* end