122 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
subroutine sfrsd(mrsym,mrprob,mr2sym,mr2prob,ntrials,correct,indexes,   &
 | 
						|
     param,ntry)
 | 
						|
 | 
						|
  integer mrsym(0:62),mrprob(0:62),mr2sym(0:62),mr2prob(0:62)
 | 
						|
  integer correct(0:62),indexes(0:62),probs(0:62),thresh0(0:62)
 | 
						|
  integer rxdat(0:62),rxdat2(0:62),rxprob(0:62),rxprob2(0:62)
 | 
						|
  integer workdat(0:62),era_pos(0:50)
 | 
						|
  integer perr(0:7,0:7)
 | 
						|
  integer param(0:7)
 | 
						|
  real ratio0(0:62)
 | 
						|
 | 
						|
  call init_rs_int()
 | 
						|
  do i=0,62
 | 
						|
     rxdat(i)=mrsym(62-i)
 | 
						|
     rxdat2(i)=mr2sym(62-i)
 | 
						|
     rxprob(i)=mrprob(62-i)
 | 
						|
     rxprob2(i)=mr2prob(62-i)
 | 
						|
  enddo
 | 
						|
 | 
						|
  do i=0,62
 | 
						|
     indexes(i)=i
 | 
						|
     probs(i)=rxprob(i)
 | 
						|
  enddo
 | 
						|
 | 
						|
  do ip=1,62
 | 
						|
     do k=0,63-ip
 | 
						|
        if(probs(k).lt.probs(k+1)) then
 | 
						|
           ntmp=probs(k)
 | 
						|
           probs(k)=probs(k+1)
 | 
						|
           probs(k+1)=ntmp
 | 
						|
           ntmp=indexes(k)
 | 
						|
           indexes(k)=indexes(k+1)
 | 
						|
           indexes(k+1)=ntmp
 | 
						|
        endif
 | 
						|
     enddo
 | 
						|
  enddo
 | 
						|
 | 
						|
  era_pos=0
 | 
						|
  numera=0
 | 
						|
  workdat=rxdat
 | 
						|
  call decode_rs_int()
 | 
						|
  if(nerr.ge.0) then
 | 
						|
     correct=workdat
 | 
						|
     param=0
 | 
						|
     return
 | 
						|
  endif
 | 
						|
 | 
						|
  call random_seed()
 | 
						|
 | 
						|
  ncandidates=0
 | 
						|
  nsum=0
 | 
						|
  do i=0,62
 | 
						|
     nsum=nsum+rxprob(i)
 | 
						|
     j=indexes(62-i)
 | 
						|
     ratio0(i)=float(rxprob2(j))/(float(rxprob(j))+0.01)
 | 
						|
     ii=int(7.999*ratio0(i))
 | 
						|
     jj=(62-i)/8
 | 
						|
     thresh0(i)=nint(1.3*perr(jj,ii))
 | 
						|
  enddo
 | 
						|
  if(nsum.eq.0) return
 | 
						|
 | 
						|
  do k=0,ntrials
 | 
						|
     era_pos=0
 | 
						|
     workdat=rxdat
 | 
						|
     numera=0
 | 
						|
     do i=0,62
 | 
						|
        j=indexes(62-i)
 | 
						|
        thresh=thresh0(i)
 | 
						|
        ir=rand()
 | 
						|
        if(...) then
 | 
						|
           era_pos(numera)=j
 | 
						|
           numera=numera+1
 | 
						|
        endif
 | 
						|
     enddo
 | 
						|
 | 
						|
     call decode_rs_int()
 | 
						|
     if(nerr.ge.0) then
 | 
						|
        ncandidates=ncandidates+1
 | 
						|
        nhard=0
 | 
						|
        nsoft=0
 | 
						|
        nsofter=0
 | 
						|
        do i=0,62
 | 
						|
           if(workdat(i).ne.rxdat(i)) then
 | 
						|
              nhard=nhard+1
 | 
						|
              nsofter=nsofter+rxprob(i)
 | 
						|
              if(workdat(i).ne.rxdat2(i)) nsoft=nsoft+rxprob(i)
 | 
						|
           else
 | 
						|
              nsofter=nsofter-rxprob(i)
 | 
						|
           endif
 | 
						|
        enddo
 | 
						|
        nsoft=63*nsoft/nsum
 | 
						|
        nsofter=63*nsofter/nsum
 | 
						|
        ntotal=nsoft+nhard
 | 
						|
        if(ntotal.lt.ntotal_min) then
 | 
						|
           nsoft_min=nsoft
 | 
						|
           nhard_min=nhard
 | 
						|
           nsofter_min=nsofter
 | 
						|
           ntotal_min=ntotal
 | 
						|
           correct=workdat
 | 
						|
           nera_best=numera
 | 
						|
           ntry=k
 | 
						|
        endif
 | 
						|
        if(ntotal_min.lt.72 .and. nhard_min.lt.42) exit
 | 
						|
     endif
 | 
						|
     if(k.eq.ntrials-1) ntry=k+1
 | 
						|
  enddo
 | 
						|
 | 
						|
  if(ntotal_min.ge.76 .or. nhard.ge.44) nhard_min=-1
 | 
						|
 | 
						|
  param(0)=ncandidates
 | 
						|
  param(1)=nhard_min
 | 
						|
  param(2)=nsoft_min
 | 
						|
  param(3)=nera_best
 | 
						|
  param(4)=nsofter_min
 | 
						|
  if(param(0).eq.0) param(2)=-1
 | 
						|
 | 
						|
  return
 | 
						|
end subroutine sfrsd
 | 
						|
 | 
						|
 | 
						|
                 
 |