File: bpdecode40.f90

package info (click to toggle)
wsjtx 2.6.1%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 69,664 kB
  • sloc: cpp: 86,977; f90: 42,417; python: 27,241; ansic: 12,510; fortran: 2,382; makefile: 197; sh: 134
file content (148 lines) | stat: -rwxr-xr-x 3,310 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
subroutine bpdecode40(llr,maxiterations,decoded,niterations)
!
! A log-domain belief propagation decoder for the msk40 code.
! The code is a regular (32,16) code with column weight 3, row weights 5,6,7.
! k9an August, 2016
!
integer, parameter:: N=32, K=16, M=N-K
integer*1 codeword(N),cw(N)
integer*1 colorder(N)
integer*1 decoded(K)
integer Nm(7,M)  ! 5,6 or 7 bits per check 
integer Mn(3,N)  ! 3 checks per bit
integer synd(M)
real tov(3,N)
real toc(7,M)
real tanhtoc(7,M)
real zn(N)
real llr(N)
real Tmn
integer nrw(M)

data colorder/ &
    4,   1,   2,   3,   0,   8,   6,  10, &
   13,  28,  20,  23,  17,  15,  27,  25, &
   16,  12,  18,  19,   7,  21,  22,  11, &
   24,   5,  26,  14,   9,  29,  30,  31/

data Mn/               &
  1, 6, 13,  & 
  2, 3, 14,  & 
  4, 8, 15,  & 
  5, 11, 12,  & 
  7, 10, 16,  & 
  6, 9, 15,  & 
  1, 11, 16,  & 
  2, 4, 5,  & 
  3, 7, 9,  & 
  8, 10, 12,  & 
  8, 13, 14,  & 
  1, 4, 12,  & 
  2, 6, 10,  & 
  3, 11, 15,  & 
  5, 9, 14,  & 
  7, 13, 15,  & 
  12, 14, 16,  & 
  1, 2, 8,  & 
  3, 5, 6,  & 
  4, 9, 11,  & 
  1, 7, 14,  & 
  5, 10, 13,  & 
  3, 4, 16,  & 
  2, 15, 16,  & 
  6, 7, 12,  & 
  7, 8, 11,  & 
  1, 9, 10,  & 
  2, 11, 13,  & 
  3, 12, 13,  & 
  4, 6, 14,  & 
  1, 5, 15,  & 
  8, 9, 16/

data Nm/               &
1, 7, 12, 18, 21, 27, 31,  & 
2, 8, 13, 18, 24, 28, 0, & 
2, 9, 14, 19, 23, 29, 0, & 
3, 8, 12, 20, 23, 30, 0, & 
4, 8, 15, 19, 22, 31, 0, & 
1, 6, 13, 19, 25, 30, 0, & 
5, 9, 16, 21, 25, 26, 0, & 
3, 10, 11, 18, 26, 32, 0, & 
6, 9, 15, 20, 27, 32,  0,& 
5, 10, 13, 22, 27, 0, 0, & 
4, 7, 14, 20, 26, 28, 0, & 
4, 10, 12, 17, 25, 29, 0, & 
1, 11, 16, 22, 28, 29, 0, & 
2, 11, 15, 17, 21, 30, 0, & 
3, 6, 14, 16, 24, 31, 0, & 
5, 7, 17, 23, 24, 32, 0/  

data nrw/7,6,6,6,6,6,6,6,6,5,6,6,6,6,6,6/ 

ncw=3

toc=0
tov=0
tanhtoc=0

! initialize messages to checks
do j=1,M
  do i=1,nrw(j)
    toc(i,j)=llr((Nm(i,j)))
  enddo
enddo

do iter=0,maxiterations

! Update bit log likelihood ratios (tov=0 in iteration 0).
  do i=1,N
    zn(i)=llr(i)+sum(tov(1:ncw,i))
  enddo

! Check to see if we have a codeword (check before we do any iteration).
  cw=0
  where( zn .gt. 0. ) cw=1
  ncheck=0
  do i=1,M
    synd(i)=sum(cw(Nm(1:nrw(i),i)))
    if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1
  enddo

  if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it
    niterations=iter
    codeword=cw(colorder+1)
    decoded=codeword(M+1:N)
    return
  endif

! Send messages from bits to check nodes 
  do j=1,M
    do i=1,nrw(j)
      ibj=Nm(i,j)
      toc(i,j)=zn(ibj)  
      do kk=1,ncw ! subtract off what the bit had received from the check
        if( Mn(kk,ibj) .eq. j ) then  
          toc(i,j)=toc(i,j)-tov(kk,ibj)
        endif
      enddo
    enddo
  enddo

! send messages from check nodes to variable nodes
  do i=1,M
    tanhtoc(1:7,i)=tanh(-toc(1:7,i)/2)
  enddo

  do j=1,N
    do i=1,ncw
      ichk=Mn(i,j)  ! Mn(:,j) are the checks that include bit j
      Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j)
      call platanh(-Tmn,y)
      tov(i,j)=2*y
    enddo
  enddo

enddo
niterations=-1
return
end subroutine bpdecode40