mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-15 08:31:57 -05:00
A simple hard-decision bit-flip decoder for LDPC codes.
This commit is contained in:
parent
73e2aa9573
commit
7804ab5fc6
59
lib/fsk4hf/bitflip128_90.f90
Normal file
59
lib/fsk4hf/bitflip128_90.f90
Normal file
@ -0,0 +1,59 @@
|
||||
subroutine bitflip128_90(llr,message77,cw,nharderror)
|
||||
!
|
||||
! A hard-decision bit flipping decoder for the (128,90) code.
|
||||
!
|
||||
|
||||
use iso_c_binding, only: c_loc,c_size_t
|
||||
use crc
|
||||
integer, parameter:: N=128, K=90, M=N-K
|
||||
integer*1 cw(N),apmask(N)
|
||||
integer*1 decoded(K)
|
||||
integer*1 message77(77)
|
||||
integer Nm(11,M)
|
||||
integer Mn(3,N)
|
||||
integer nrw(M)
|
||||
integer synd(M)
|
||||
integer nuns(N)
|
||||
real zn(N)
|
||||
real llr(N)
|
||||
|
||||
include "ldpc_128_90_reordered_parity.f90"
|
||||
|
||||
decoded=0
|
||||
zn=llr
|
||||
|
||||
do iter=0,0
|
||||
|
||||
! Check to see if we have a codeword (check before we do any iteration).
|
||||
cw=0
|
||||
where( zn .gt. 0. ) cw=1
|
||||
ncheck=0
|
||||
nuns=0
|
||||
do i=1,M
|
||||
synd(i)=sum(cw(Nm(1:nrw(i),i)))
|
||||
if( mod(synd(i),2) .ne. 0 ) then
|
||||
ncheck=ncheck+1
|
||||
do j=1,nrw(i)
|
||||
nuns(Nm(j,i))=nuns(Nm(j,i))+1
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it
|
||||
decoded=cw(1:K)
|
||||
call chkcrc13a(decoded,nbadcrc)
|
||||
if(nbadcrc.eq.0) then
|
||||
message77=decoded(1:77)
|
||||
nharderror=count( (2*cw-1)*llr .lt. 0.0 )
|
||||
return
|
||||
endif
|
||||
endif
|
||||
! flip the sign on the symbols that show up in the largest number
|
||||
! of un-satisfied parity checks
|
||||
where( nuns .eq. maxval(nuns) ) zn=-zn
|
||||
|
||||
enddo
|
||||
llr=zn
|
||||
nharderror=-1
|
||||
return
|
||||
|
||||
end subroutine bitflip128_90
|
Loading…
Reference in New Issue
Block a user