77 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
| program msksim
 | |
| 
 | |
| use, intrinsic :: iso_c_binding
 | |
| 
 | |
| ! To change to a new code, edit the following line and the filenames
 | |
| ! that contain the parity check and generator matrices.
 | |
| parameter (N=198, M=126, K=72) ! M and N are global variables on the C side.
 | |
| 
 | |
| character(50) pchk_file,gen_file
 | |
| integer(1) codeword(1:N), decoded(1:K), message(1:K)
 | |
| real*8 lratio(N), rxdata(N)
 | |
| 
 | |
| pchk_file="./jtmode_codes/peg-198-72-irreg-8x3-2x4.pchk"
 | |
| gen_file="./jtmode_codes/peg-198-72-irreg-8x3-2x4.gen"
 | |
| 
 | |
| rate=real(K)/real(N)
 | |
| 
 | |
| call init_ldpc(trim(pchk_file)//char(0),trim(gen_file)//char(0))
 | |
| 
 | |
| message(1:K/2)=1
 | |
| message((K/2+1):K)=0
 | |
| call ldpc_encode(message,codeword)
 | |
| 
 | |
| max_iterations=50
 | |
| ntrials=1000000
 | |
| 
 | |
| write(*,*) "Eb/N0   ngood    nundetected"
 | |
| do idb = 0, 11
 | |
|   db=idb/2.0-0.5
 | |
|   sigma=1/sqrt( 2*rate*(10**(db/10.0)) )
 | |
| 
 | |
|   ngood=0
 | |
|   nue=0
 | |
| 
 | |
|   do itrial=1, ntrials
 | |
| 
 | |
|     do i=1,N
 | |
|       rxdata(i) = 2.0*(codeword(i)-0.5) + sigma*gran()
 | |
|     enddo
 | |
| 
 | |
| ! correct signal normalization is important for this decoder.
 | |
|     rxav=sum(rxdata)/N
 | |
|     rx2av=sum(rxdata*rxdata)/N
 | |
|     rxsig=sqrt(rx2av-rxav*rxav)
 | |
|     rxdata=rxdata/rxsig
 | |
| 
 | |
| ! s can be tuned to trade a few tenth's dB of threshold 
 | |
| ! for an order of magnitude in UER 
 | |
|     do i=1,N
 | |
|       s=0.75
 | |
|       lratio(i)=exp(2.0*rxdata(i)/(s*s))
 | |
|     enddo
 | |
| 
 | |
|     call ldpc_decode(lratio, decoded, max_iterations, niterations)
 | |
| 
 | |
|     if( niterations .ge. 0 ) then
 | |
|       nueflag=0
 | |
|       do i=1,K
 | |
|         if( message(i) .ne. decoded(i) ) then
 | |
|           nueflag=1
 | |
|         endif
 | |
|       enddo
 | |
|       if( nueflag .eq. 1 ) then
 | |
|         nue=nue+1
 | |
|       else
 | |
|         ngood=ngood+1;
 | |
|       endif
 | |
|     endif
 | |
| 
 | |
|   enddo
 | |
| 
 | |
|   write(*,"(f4.1,1x,i8,1x,i8)") db,ngood,nue
 | |
| 
 | |
| enddo
 | |
| 
 | |
| end program msksim
 | 
