mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04: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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user