WSJT-X/lib/fsk4hf/encode168.f90

142 lines
4.0 KiB
Fortran

subroutine encode168(message,codeword)
! Encode an 84-bit message and return a 168-bit codeword.
! The generator matrix has dimensions (84,84).
! The code is a (168,84) regular ldpc code with column weight 3.
! The code was generated using the PEG algorithm.
! After creating the codeword, the columns are re-ordered according to
! "colorder" to make the codeword compatible with the parity-check matrix
!
character*21 g(84)
integer*1 codeword(168)
integer colorder(168)
integer*1 gen(84,168)
integer*1 itmp(168)
integer*1 message(84)
integer*1 pchecks(84)
logical first
data first/.true./
data g/ & !parity generator matrix for (168,84) code
"25c5bf31ef6710fde9a5a", &
"18038ef7899cd97a77d96", &
"270dde504dad076c02b1f", &
"ed37fe12616565bd7d500", &
"12b99aa49b5367aff3838", &
"41cc27f2fac8b228aac21", &
"2265b233a3cff0b9cee24", &
"292760cd4f7f4a526a2f1", &
"2b3db4c8bd831911680cc", &
"cef2b24ce203bdc60b266", &
"5045a24f9340915d807ab", &
"3592b7fc60ba85139502e", &
"9318023145637bd798f0e", &
"ad796023c3d58d1e6509c", &
"3da5eab57f040e75d7413", &
"27466d1d2734d0ff64830", &
"2ed50bb1ce313bbfb1ab0", &
"9a616bda01b25b7e6eeaf", &
"a84c8c1e9df103169d10d", &
"a40da29b4aca9234a8942", &
"dd258d02d79a5f209d3d0", &
"bdfdc06713511997b5621", &
"25c58f12f4096cd8ead1a", &
"b2638a478f21e10fe97de", &
"4051020f43c605d458156", &
"f651aad14322a526dae35", &
"a1c147e31bcc9d87330bf", &
"7524b53d996d48284647b", &
"a72e7d25ce31b27282e56", &
"a97f53b019022350b7519", &
"56106c6340c0810790984", &
"c63b8e03a57208635992b", &
"43a3de2aa3a2b1afb65dc", &
"9baa64847ead03b77fecc", &
"251cbd1895c8839c46b0d", &
"2858107dde2d173e13530", &
"20096f6a870f636b704e7", &
"7f833ccbceec52dd6eb79", &
"a9108dd77b8015b75242a", &
"689666a79e5579c916236", &
"aa5dff46459787f69911f", &
"794558c13138d08171089", &
"c937042857b291cee8dfd", &
"6f0bf3248bb9a231366b8", &
"1c09e756ef1656c96f2d2", &
"073b875b6774e71fba549", &
"f7d840aafc037febd2d5c", &
"dcc0e7d0da5fe17c99ad3", &
"98238ef7819cd97a77d94", &
"177c2594743477421a262", &
"7d01a833c19374fbaaa6e", &
"7bb800216660482ffd1c4", &
"39a92e2dba0d4cfda98d2", &
"44b8d88622698816456a8", &
"791db2334d6d86639229b", &
"ba6004b086bd38559ea48", &
"f94558e13138d18170089", &
"08ba145302cfbed7845ae", &
"fb8e64b6da3602168ed38", &
"1045a2cf1340915d8072b", &
"7592b6fc64ba85139582e", &
"3eb238a11bc6654452bae", &
"b69d8d23b1ea170f70214", &
"0123dfae84fb20462a614", &
"4131066ad52a339b3c0d7", &
"fd2cc26850951c43ed737", &
"a644d4eb7e56c40f0d050", &
"0c3bd9d5dab7c9ee2c8fc", &
"4a198b37af56d7ceffb56", &
"b6e946c429294cf0eed8b", &
"98384d75e758774f5ff3b", &
"5c58e5d9a4d0531d37384", &
"7a0af02719afed521fd06", &
"8cd5b2e694e7854abbc70", &
"1a2f061912d0ea19702d3", &
"6ffbce557d8fa691a50e8", &
"d43438e2e2ed5d9f14011", &
"8d502106083b809adba00", &
"67e22f9b9983aa715964d", &
"b31f3a3f3c1f406b1fd58", &
"529f60ac291f827d97331", &
"476a815424f2e2cbe641f", &
"81c82c89bcc3feec42458", &
"2c882d0e281b178e80364"/
data colorder/0,1,2,3,28,4,5,6,7,8,9,10,11,34,12,32,13,14,15,16,17, &
18,36,29,42,31,20,21,41,40,30,38,22,19,47,37,46,35,44,33,49,24, &
43,51,25,26,27,50,52,57,69,54,55,45,59,58,56,61,60,53,48,23,62, &
63,64,67,66,65,68,39,70,71,72,74,73,75,76,77,80,81,78,82,79,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,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167/
save first,gen
if( first ) then ! fill the generator matrix
gen=0
do i=1,84
do j=1,21
read(g(i)(j:j),"(Z1)") istr
do jj=1, 4
icol=(j-1)*4+jj
if( btest(istr,4-jj) ) gen(i,icol)=1
enddo
enddo
enddo
first=.false.
endif
do i=1, 84
nsum=0
do j=1, 84
nsum=nsum+message(j)*gen(i,j)
enddo
pchecks(i)=mod(nsum,2)
enddo
itmp(1:84)=pchecks
itmp(85:168)=message(1:84)
codeword(colorder+1)=itmp(1:168)
return
end subroutine encode168