WSJT-X/lib/superfox/rstest.f90
2024-02-07 11:40:25 -05:00

85 lines
2.3 KiB
Fortran

program rstest
character arg*8
integer dat0(255) !Message symbols
integer parsym(255) !Parity symbols
integer chansym0(255) !Encoded data, Karn
integer chansym(255) !Encoded data with errors
integer dat(235) !Decoded data, i*4
! integer, target :: parsym(255)
integer iera(0:200) !Positions of erasures
integer gfpoly
! type(c_ptr) :: rs
data gfpoly/z'11d'/
nargs=iargc()
if(nargs.ne.5) then
print*,'Usage: rstest M N K nera nerr'
print*,'Examples: rstest 6 63 12 0 25'
print*,' rstest 7 127 51 0 38'
print*,' rstest 8 255 51 0 102'
print*,' rstest 8 255 223 0 16'
go to 999
endif
nkv=0
call getarg(1,arg)
read(arg,*) mm
call getarg(2,arg)
read(arg,*) nn
call getarg(3,arg)
read(arg,*) kk
call getarg(4,arg)
read(arg,*) nera
call getarg(5,arg)
read(arg,*) nerr
! Initialize the Karn codec
nq=2**mm
nfz=3
call rs_init_sf(mm,nq,nn,kk,nfz) !Initialize the Karn RS codec
! Generate kk message symbols. (Values must be in range 0 to nq-1.)
do i=1,kk
dat0(i)=i
enddo
write(*,1000) mm,nn,kk,nera,nerr
1000 format('M:',i2,' N:',i4,' K:',i4,' nera:',i4,' nerr:',i4/ &
'Generated data symbols')
write(*,1002) dat0(1:kk)
1002 format(20i4)
call rs_encode_sf(dat0,parsym) !Compute parity symbols
chansym0(1:kk)=dat0(1:kk)
chansym0(kk+1:nn)=parsym(1:nn-kk)
write(*,1004)
1004 format(/'Encoded channel symbols')
write(*,1002) chansym0(1:nn)
chansym=chansym0
do i=1,nerr !Introduce errors
chansym(i)=mod(chansym(i)+1,nq)
enddo
write(*,1006) nera
1006 format(/'Recovered channel symbols, with',i4,' errors at the start:')
write(*,1002) chansym(1:nn)
do i=0,nera-1
iera(i)=i
enddo
call rs_decode_sf(chansym,iera,nera,nfixed)
dat(1:kk)=chansym(1:kk)
ibad=count(dat(1:kk).ne.dat0(1:kk))
write(*,1008)
1008 format(/'Decoded result:')
write(*,1002) dat(1:kk)
maxfix=(nn-kk)/2 + nera/2
write(*,1100) nerr,nera,nfixed,maxfix
1100 format(/'nerr:',i3,' nera:',i3,' nfixed:',i3,' maxfix:',i3)
999 end program rstest