• Non ci sono risultati.

Appendice software

N/A
N/A
Protected

Academic year: 2021

Condividi "Appendice software"

Copied!
31
0
0

Testo completo

(1)

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.

(2)

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.

(3)

-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)

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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),

(9)

& 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)

(10)

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)

(11)

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

(12)

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)

(13)

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)

(14)

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

(15)

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)

(16)

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

(17)

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)

(18)

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)

(19)

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

(20)

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))

(21)

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

(22)

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(

(23)

& 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

(24)

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

(25)

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)

(26)

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)

(27)

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,

(28)

& 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

(29)

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(

(30)

& 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

(31)

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

Riferimenti

Documenti correlati

[r]

Nel circuito in figura tutti i resistori valgono R=10 kΩ, le f.e.m.. Succes- sivamente l’interruttore T viene aperto portandolo in

Nel caso in esame, osservando che nelle funzioni di Bessel il valore di riferimento della portante non modulata, cioè J 0 con m=0 è uguale a 1, si stabilisce di considerare come

[r]

[r]

7-10 (vedi anche figura 19) appartengono alla medesima serie, caratterizzata da un corpo circolare costituito da una sottilissima lamina in oro decorata a traforo

Si distinguano tra gli elementi di tale anello gli elementi unitari ed i divisori dello zero, motivando le scelte; in particolare, si determinino gli inversi degli elementi

In tema di confisca ambientale, peraltro, uno stimolo a rafforzare la tutela penale dell’ecosistema e dei singoli elementi dell’habitat naturale è senza dubbio