mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-15 00:21:56 -05:00
55 lines
1.5 KiB
Fortran
55 lines
1.5 KiB
Fortran
|
program bodide
|
||
|
! Compute probability of word error for a bounded distance decoder.
|
||
|
! Hardwired for non-coherent 64-FSK and the JT65 RS (63,12) code on GF(64).
|
||
|
!
|
||
|
! Let ps be symbol error probability.
|
||
|
! The probability of getting an error pattern with e symbol errors is:
|
||
|
! ps^e * (1-ps)*(n-e)
|
||
|
! The number of error patterns with e errors is binomial(63,e)
|
||
|
! Overall probability of getting a word with e errors is:
|
||
|
! P(e)= binomial(63,e)* ps^e * (1-ps)*(n-e)
|
||
|
! Probability that word is correct is P(0 to 25 errors) = sum{e=0}^{25} P(e)
|
||
|
! Probability that word is wrong is 1-P(0 to 25 errors)
|
||
|
! P_word_error=1-( sum_{e=0}^{t} P(e) )
|
||
|
!
|
||
|
implicit real*16 (a-h,o-z)
|
||
|
|
||
|
integer*8 binomial
|
||
|
integer x,s,XX,NN,M
|
||
|
character arg*8
|
||
|
|
||
|
nargs=iargc()
|
||
|
if(nargs.ne.1) then
|
||
|
print*,'Probability of word error for noncoherent 64-FSK with bounded distance decoding'
|
||
|
print*,'Usage: bounded_distance D'
|
||
|
print*,'Example: bounded_distance 25'
|
||
|
go to 999
|
||
|
endif
|
||
|
call getarg(1,arg)
|
||
|
read(arg,*) nt
|
||
|
M=64
|
||
|
write(*,1012)
|
||
|
1012 format('Es/No P(word error)'/ &
|
||
|
'----------------------')
|
||
|
do isnr=0,40
|
||
|
esno=10**(isnr/2.0/10.0)
|
||
|
hsum=0.d0
|
||
|
do k=1,M-1
|
||
|
h=binomial(M-1,k)
|
||
|
h=h*((-1)**(k+1))/(k+1)
|
||
|
h=h*exp(-esno*k/(k+1))
|
||
|
hsum=hsum + h
|
||
|
enddo
|
||
|
ps=hsum
|
||
|
hsum=0.d0
|
||
|
do i=0,nt
|
||
|
h=binomial(63,i)
|
||
|
h=h*ps**i
|
||
|
h=h*(1-ps)**(63-i)
|
||
|
hsum=hsum+h
|
||
|
enddo
|
||
|
pw=1-hsum
|
||
|
write(*,'(f4.1,4x,e10.4,4x,e10.4)') isnr/2.0, ps, pw
|
||
|
enddo
|
||
|
999 end program bodide
|