diff --git a/lib/fsk4hf/genwsprdpsk.f90 b/lib/fsk4hf/genwsprdpsk.f90 index b74da3d5f..1b6c58b10 100644 --- a/lib/fsk4hf/genwsprdpsk.f90 +++ b/lib/fsk4hf/genwsprdpsk.f90 @@ -56,6 +56,7 @@ write(*,'(232i1)') imsg(1:232) do i=2,232 imsgde(i)=mod(imsgde(i-1)+imsg(i),2) enddo + write(*,*) '-------------' write(*,'(232i1)') imsgde(1:232) return diff --git a/lib/fsk4hf/wspr5d.f90 b/lib/fsk4hf/wspr5d.f90 index c47a06fa2..8a3c800b8 100644 --- a/lib/fsk4hf/wspr5d.f90 +++ b/lib/fsk4hf/wspr5d.f90 @@ -63,8 +63,8 @@ program wspr5d open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & position='append') -! maxn=8 !Default value - maxn=20 +! maxn=4 !Default value + maxn=2 twopi=8.0*atan(1.0) fs=NSPS*12000.0/NSPS0 !Sample rate dt=1.0/fs !Sample interval (s) @@ -104,6 +104,7 @@ program wspr5d endif enddo +write(*,*) 'iarg, nargs ',iarg,nargs do ifile=iarg,nargs call getarg(ifile,infile) open(10,file=infile,status='old',access='stream') @@ -132,7 +133,6 @@ program wspr5d a(1)=-fc1 a(2:5)=0. call twkfreq1(c,NZ,fs,a,c) !Mix c down by fc1+fc2 - ! Find time offset xdt amax=0. jpk=0 @@ -153,7 +153,6 @@ program wspr5d ibb=NZ-1-j endif z=sum(c(ia:ib)*conjg(csync(iaa:ibb))) -write(51,*) j/fs,real(z),imag(z) if(abs(z).gt.amax) then amax=abs(z) jpk=j @@ -188,10 +187,11 @@ jpk=fs*xdt max_iterations=40 ifer=0 call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw) - if(niterations.lt.0) call osd300(llr,4,decoded,niterations,cw) + nhardmin=0 + if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin) nbadcrc=0 - if(niterations.ge.0) call chkcrc10(decoded,nbadcrc) - if(niterations.lt.0 .or. nbadcrc.ne.0) ifer=1 + call chkcrc10(decoded,nbadcrc) + if(nbadcrc.ne.0) ifer=1 if(ifer.eq.0) exit enddo !Freq dither loop message=' ' @@ -209,9 +209,9 @@ jpk=fs*xdt nfdot=0 write(13,1110) datetime,0,nsnr,xdt,freq,message,nfdot 1110 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1112) datetime(8:11),nsnr,xdt,freq,nfdot,message,itry + write(*,1112) datetime(8:11),nsnr,xdt,freq,nfdot,message,itry,nhardmin !1112 format(a4,i4,f5.1,f11.6,i3,2x,a22,i4) -1112 format(a4,i4,f8.3,f8.3,i3,2x,a22,i4) +1112 format(a4,i4,f8.3,f8.3,i3,2x,a22,i4,i4) endif enddo ! ifile loop write(*,1120) diff --git a/lib/fsk4hf/wspr5d_exp.f90 b/lib/fsk4hf/wspr5d_exp.f90 index 4cb1f6246..6e6667b65 100644 --- a/lib/fsk4hf/wspr5d_exp.f90 +++ b/lib/fsk4hf/wspr5d_exp.f90 @@ -29,7 +29,7 @@ program wspr5d complex c(0:NZ-1) !Complex waveform complex cd(0:NZ-1) !Complex waveform complex ca(0:NZ-1) !Complex waveform - complex zz + complex zz,zzsum real*8 fMHz real rxdata(ND),llr(ND) !Soft symbols real pp(32) !Shaped pulse for OQPSK @@ -44,6 +44,7 @@ program wspr5d integer*1 idat(7) integer*1 decoded(KK),apmask(ND),cw(ND) integer*1 hbits(412),bits(13) + logical reset data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/ nargs=iargc() @@ -131,41 +132,57 @@ program wspr5d fb=150.0 fs400=400.0 call getfc1(c400,fs400,fa,fb,fc1,xsnr) !First approx for freq -!write(*,*) datetime,'initial guess ',fc1 npeaks=5 call getfc2(c400,npeaks,fs400,fc1,fpks) !Refined freq - do idf=1,npeaks ! consider the top npeak peaks - fc2=fpks(idf) +! do idf=1,npeaks ! consider the top npeak peaks + do idf=1,1 ! for genie-aided sync + fc1=125.0 ! genie provided + fc2=0.0 ! from the genie +! fc2=fpks(idf) call downsample(c400,fc1+fc2,cd) s2=sum(cd*conjg(cd))/(16*412) cd=cd/sqrt(s2) - do is=0,8 ! dt search range is narrow, to save time. + do is=0,0 ! dt search range is zeroed for genie-aided sync idt=is/2 if( mod(is,2).eq. 1 ) idt=-(is+1)/2 xdt=real(22+idt)/22.222 - 1.0 ca=cshift(cd,22+idt) - do iseq=1,3 ! try sequence estimation lengths of 3, 6, and 9 bits. - k=1-2*iseq - nseq=iseq*3 - do i=1,408,iseq*4 - k=k+iseq*2 + zzsum=0.0 + do iseq=3,4 + if(iseq.eq.4) then + k=1-2*3 + nseq=9 + istep=3*4 + else + k=1-2*iseq + nseq=iseq*3 + istep=iseq*4 + endif + do i=1,408,istep j=(i+1)*16 - call mskseqdet(nseq,ca(j),pp,id(k),softbits,1,phase) - hbits(i:i+iseq*4)=bits - sbits(i:i+iseq*4)=bits - + if(iseq.eq.4) then +! phase=-1.18596900 +! For now, average complex corr. coeffs over the entire frame to +! estimate phase + phase=atan2(imag(zzsum),real(zzsum)) + k=k+3*2 + call mskcohdet(nseq,ca(j),pp,id(k),softbits,phase) + else + k=k+iseq*2 + call mskseqdet(nseq,ca(j),pp,id(k),softbits,1,zz) + zzsum=zzsum+zz + endif sbits(i+1)=softbits(1) sbits(i+2)=softbits(2) if( id(k+1) .ne. 0 ) sbits(i+2)=id(k+1)*25 sbits(i+3)=softbits(3) - if( iseq .ge. 2 ) then sbits(i+5)=softbits(4) sbits(i+6)=softbits(5) if( id(k+3) .ne. 0 ) sbits(i+6)=id(k+3)*25 sbits(i+7)=softbits(6) - if( iseq .eq. 3 ) then + if( iseq .ge. 3 ) then sbits(i+9)=softbits(7) sbits(i+10)=softbits(8) if( id(k+5) .ne. 0 ) sbits(i+10)=id(k+5)*25 @@ -188,18 +205,21 @@ program wspr5d rx2av=sum(rxdata*rxdata)/ND rxsig=sqrt(rx2av-rxav*rxav) rxdata=rxdata/rxsig -! sigma=0.84 sigma=1.20 llr=2*rxdata/(sigma*sigma) apmask=0 max_iterations=40 + ifer=0 - nbadcrc=0 call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw) ! niterations will be equal to the Hamming distance between hard received word and the codeword - if(niterations.lt.0) call osd300(llr,3,decoded,niterations,cw) - if(niterations.ge.0) call chkcrc10(decoded,nbadcrc) - if(niterations.lt.0 .or. nbadcrc.ne.0) ifer=1 + nhardmin=0 + if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin) + if(nhardmin.gt.0) niterations=nhardmin + nbadcrc=0 + call chkcrc10(decoded,nbadcrc) + if(nbadcrc.ne.0) ifer=1 + if( ifer.eq.0 ) then write(cbits,1200) decoded(1:50) 1200 format(50i1) @@ -213,9 +233,9 @@ program wspr5d nfdot=0 write(13,1210) datetime,0,nsnr,xdt,freq,message,nfdot 1210 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',idf,nseq,is,niterations + write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',idf,nseq,is,iseq,niterations !1212 format(a4,i4,f5.1,f11.6,i3,2x,a22,a1,i3,i3,i3,i4) -1212 format(a4,i4,f8.3,f8.3,i3,2x,a22,a1,i3,i3,i3,i4) +1212 format(a4,i4,f8.3,f8.3,i3,2x,a22,a1,i3,i3,i3,i3,i4) goto 888 endif enddo !iseq @@ -241,7 +261,7 @@ subroutine getmetric(ib,ps,xmet) return end subroutine getmetric -subroutine mskseqdet(ns,cdat,pp,bsync,softbits,ncoh,phase) +subroutine mskseqdet(ns,cdat,pp,bsync,softbits,ncoh,zz) ! ! Detect sequences of 3, 6, or 9 bits (ns). ! Sync bits are assumed to be known. @@ -261,7 +281,7 @@ np=2**ns-1 idfmax=40 if( ncoh .eq. 1 ) idfmax=0 do idf=0,idfmax - if( mod(idf,2).eq.1 ) deltaf=idf/2*0.02 + if( mod(idf,2).eq.0 ) deltaf=idf/2*0.02 if( mod(idf,2).eq.1 ) deltaf=-(idf+1)/2*0.02 dphi=twopi*deltaf*dt cfac=cmplx(cos(dphi),sin(dphi)) @@ -327,7 +347,6 @@ do idf=0,idfmax cbest=cideal fbest=deltaf zz=sum(cdat*conjg(cbest))/1.e3 - phase=atan2(imag(zz),real(zz)) endif enddo if( ibflag .eq. 1 ) then ! new best found @@ -350,6 +369,29 @@ if( ns .ge. 6 ) then endif end subroutine mskseqdet +subroutine mskcohdet(ns,cdat,pp,bsync,softbits,phase) +! +! Coherent demodulate blocks of 9 bits (ns). +! + complex cdat(16*12),crot(16*12) + real pp(32),softbits(9) + + np=2**ns-1 + + softbits=0.0 + crot=cdat*cmplx(cos(phase),-sin(phase)) + softbits(1)=sum(imag(crot(1:32)*pp)) + softbits(2)=sum(real(crot(17:48)*pp)) + softbits(3)=sum(imag(crot(33:64)*pp)) + softbits(4)=sum(imag(crot(65:96)*pp)) + softbits(5)=sum(real(crot(81:112)*pp)) + softbits(6)=sum(imag(crot(97:128)*pp)) + softbits(7)=sum(imag(crot(129:160)*pp)) + softbits(8)=sum(real(crot(145:176)*pp)) + softbits(9)=sum(imag(crot(161:192)*pp)) + softbits=softbits/64. +end subroutine mskcohdet + subroutine downsample(ci,f0,co) parameter(NI=412*288,NO=NI/18) complex ci(0:NI-1),ct(0:NI-1) @@ -361,7 +403,8 @@ subroutine downsample(ci,f0,co) i0=nint(f0/df) co=0.0 co(0)=ct(i0) - b=3.0 +! b=3.0 !optimized for sequence detection + b=6.0 do i=1,NO/2 arg=(i*df/b)**2 filt=exp(-arg) diff --git a/lib/fsk4hf/wsprdpskd.f90 b/lib/fsk4hf/wsprdpskd.f90 index 15e5665ec..223e2e4fc 100644 --- a/lib/fsk4hf/wsprdpskd.f90 +++ b/lib/fsk4hf/wsprdpskd.f90 @@ -161,8 +161,14 @@ program wsprdpskd enddo ! 2-bit differential detection do i=1,231 - sbits(i)=-real(cs(i)*conjg(cs(i-1))) +! do i=1,232 + sbits(i)=-real(cs(i)*conjg(cs(i-1))) !2 symbol dpsk +! sbits(i)=real(cs(i-1)) !for coherent dpsk +! sbits(i)=real(cs(i)) !for coherent bpsk enddo +! do i=1,231 +! sbits3(i)=-sbits(i+1)*sbits(i) ! for coherent dpsk +! enddo ! detect a differentially encoded block of symbols using the ! Divsalar and Simon approach, except that we estimate only @@ -170,7 +176,7 @@ program wsprdpskd ! by one symbol. ! sbits3=sbits -goto 100 +!goto 100 nbit=13 ! number of decoded bits to be derived from nbit+1 symbols numseq=2**nbit il=(nbit+1)/2 @@ -192,7 +198,8 @@ goto 100 enddo csum=csum+bb*cs(i1+i) enddo - ps(iseq)=abs(csum)**2 +! ps(iseq)=abs(csum)**2 + ps(iseq)=abs(csum) if(ps(iseq).gt.rmax) then bbest=b rmax=ps(iseq) @@ -291,6 +298,22 @@ subroutine getmetric(ib,ps,ns,xmet) return end subroutine getmetric +subroutine getmetric3(ib,ps,ns,xmet) + real ps(0:ns-1) + xm1=0 + xm0=0 + do i=0,ns-1 + if( iand(i/ib,1) .eq. 1 ) then + xm1=xm1+ps(i) + endif + if( iand(i/ib,1) .eq. 0 ) then + xm0=xm0+ps(i) + endif + enddo + xmet=xm1-xm0 + return +end subroutine getmetric3 + subroutine dsdpsk(ci,f0,co) parameter(NI=240*200,NH=NI/2,NO=NI/20) ! downsample from 200 samples per symbol to 10 complex ci(0:NI-1),ct(0:NI-1) diff --git a/lib/fsk4hf/wsprdpsksim.f90 b/lib/fsk4hf/wsprdpsksim.f90 index 80f7dff13..fa5e34e4d 100644 --- a/lib/fsk4hf/wsprdpsksim.f90 +++ b/lib/fsk4hf/wsprdpsksim.f90 @@ -144,6 +144,8 @@ write(*,*) 'sample SNR: ',10*log10(snrtest)+10*log10(0.4/2.5) call four2a(c0wav,NMAX,1,-1,1) xx=sum(abs(c0wav(istart:istart+NN*200*NDOWN-1))**2)/(NN*200*NDOWN) c0wav=c0wav/sqrt(xx) +write(*,*) 'Peak power: ',maxval(abs(c0wav)**2) +write(*,*) 'Average power: ',sum(abs(c0wav(istart:istart+NN*200*NDOWN-1))**2)/(NN*200*NDOWN) call sgran() do ifile=1,nfiles cwav=c0wav