mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 04:20:22 -04:00 
			
		
		
		
	
		
			
	
	
		
			284 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			284 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|  | <HTML><HEAD> | ||
|  | 
 | ||
|  | <TITLE> Encoding Message Blocks </TITLE> | ||
|  | 
 | ||
|  | </HEAD><BODY> | ||
|  | 
 | ||
|  | 
 | ||
|  | <H1> Encoding Message Blocks </H1> | ||
|  | 
 | ||
|  | To use a code to send messages, we must define a mapping from a bit | ||
|  | vector, <B>s</B>, of length <I>K</I>, representing a source message, | ||
|  | to a codeword, <B>x</B>, of length <I>N</I>><I>K</I>.  We will | ||
|  | consider only linear mappings, which can be written in the form | ||
|  | <B>x</B>=<B>G</B><SUP><SMALL>T</SMALL></SUP><B>s</B>, where <B>G</B> | ||
|  | is a <I>generator matrix</I>.  For a code with parity check matrix | ||
|  | <B>H</B>, whose codewords satisfy <B>Hx</B>=<B>0</B>, the generator | ||
|  | matrix must satisfy <B>HG</B><SUP><SMALL>T</SMALL></SUP>=<B>0</B>. | ||
|  | This software assumes that the number of rows in the parity check | ||
|  | matrix, <I>M</I>, is equal to <I>N-K</I>, as would normally be the | ||
|  | case. | ||
|  | 
 | ||
|  | <P>This software deals only with <I>systematic</I> encodings, in which | ||
|  | the <I>K</I> bits of <B>s</B> are copied unchanged to some subset of | ||
|  | the <I>N</i> bits of <B>x</B> (the <I>message bits</I>), and the | ||
|  | remaining <I>M=N-K</I> <I>check bits</I> of <B>x</B> are then set so | ||
|  | as to make the result a codeword.  For a linear code, a systematic | ||
|  | encoding scheme always exists, for some choice of which bits of a | ||
|  | codeword are message bits.  It is conventional to rearrange the order | ||
|  | of the bits in a codeword so that the message bits come first.  The | ||
|  | first <I>K</I> columns of the <I>K</I> by <I>N</I> generator matrix | ||
|  | will then be the identity matrix. | ||
|  | 
 | ||
|  | <P>However, this software does <I>not</I> assume that the message bits | ||
|  | come first, since different encoding methods prefer different | ||
|  | locations for the message bits.  Instead, a vector of indexes of where | ||
|  | each message bit is located within a codeword is recorded in a file | ||
|  | along with a representation of the part of the generator matrix that | ||
|  | produces the check bits.  More than one such generator matrix file can | ||
|  | be created for a single parity check file, in which the locations of | ||
|  | the message bits may be different.  Decoding of a received message | ||
|  | into a codeword (with <A | ||
|  | HREF="decoding.html#decode"><TT>decode</TT></A>) does not depend on | ||
|  | knowing which are the message bits, though this does need to be known | ||
|  | in order to reconstruct the original message (with <A | ||
|  | HREF="decoding.html#extract"><TT>extract</TT></A>). | ||
|  | 
 | ||
|  | <P>This software stores representations of generator matrices in files | ||
|  | in a format that is not human-readable (except by using the <A | ||
|  | HREF="#print-gen"><TT>print-gen</TT></A> program).  However, these | ||
|  | files <I>are</I> readable on a machine with a different architecture | ||
|  | than they were written on. | ||
|  | 
 | ||
|  | 
 | ||
|  | <A NAME="gen-rep"><H2>Generator matrix representations</H2></A> | ||
|  | 
 | ||
|  | <P>For simplicity of exposition, it will be assumed for the next few | ||
|  | paragraphs that the message bits are located at the <I>end</I> of the | ||
|  | codeword, so a codeword can be divided into <I>M</I> check bits, | ||
|  | <B>c</B>, followed by <I>K</I> message bits, <B>s</B>. | ||
|  | 
 | ||
|  | <P>On the above assumption, the parity check matrix, <B>H</B>, can be divided  | ||
|  | into an <I>M</I> by <I>M</I> matrix <B>A</B> occupying  | ||
|  | the first <I>M</I> columns of <B>H</B> and an <I>M</I> by <I>K</I> matrix  | ||
|  | <B>B</B> occupying the remaining columns of <B>H</B>.  The requirement that  | ||
|  | a codeword, <B>x</B>, satisfy all parity checks (ie, that <B>Hx</B>=<B>0</B>) | ||
|  | can then be written as | ||
|  | <BLOCKQUOTE> | ||
|  |   <B>Ac</B> + <B>Bs</B> = <B>0</B> | ||
|  | </BLOCKQUOTE> | ||
|  | Provided that <B>A</B> is non-singular, it follows that | ||
|  | <BLOCKQUOTE> | ||
|  |   <B>c</B> = <B>A</B><SUP><SMALL>-1</SMALL></SUP><B>Bs</B> | ||
|  | </BLOCKQUOTE> | ||
|  | <B>A</B> may be singular for some choices of which codeword bits are message  | ||
|  | bits, but a choice for which <B>A</B> is non-singular always exists if the  | ||
|  | rows of <B>H</B> are linearly independent.  It is possible, however, that the  | ||
|  | rows of <B>H</B> are not linearly independent (ie, some rows are redundant).   | ||
|  | This is an exceptional | ||
|  | and not particularly interesting case, which is mostly ignored in the | ||
|  | descriptions below; see the discussion of <A HREF="dep-H.html">linear | ||
|  | dependence in parity check matrices</A> for the details. | ||
|  | 
 | ||
|  | <P>The equation <B>c</B> = <B>A</B><SUP><SMALL>-1</SMALL></SUP><B>Bs</B> | ||
|  | defines what the check bits should be, but actual computation of these | ||
|  | check bits can be done in several ways, three of which are implemented | ||
|  | in this software.  Each method involves a different representation of | ||
|  | the generator matrix.  (Note that none of these methods involves the | ||
|  | explicit representation of the matrix <B>G</B> mentioned above.) | ||
|  | 
 | ||
|  | <P>In the <I>dense representation</I>, the <I>M</I> by <I>K</I> matrix | ||
|  | <B>A</B><SUP><SMALL>-1</SMALL></SUP><B>B</B> is computed, and stored | ||
|  | in a dense format (see the <A HREF="mod2dense.html">dense modulo-2 | ||
|  | matrix package</A>).  A message is encoded by multiplying the  | ||
|  | source bits, <B>s</B>, by this matrix to obtain the required check bits. | ||
|  | 
 | ||
|  | <P>In the <I>mixed representation</I>, the <I>M</I> by <I>M</I> matrix | ||
|  | <B>A</B><SUP><SMALL>-1</SMALL></SUP> is computed and stored in a dense | ||
|  | format, and the <I>M</I> by <I>K</I> matrix <B>B</B>, the right | ||
|  | portion of the parity check matrix, is also stored, in a sparse format | ||
|  | (see the <A HREF="mod2sparse.html">sparse modulo-2 matrix package</A>). | ||
|  | To encode a message, the source vector <B>s</B> is first multiplied on | ||
|  | the left by <B>B</B>, an operation which can be done very quickly if | ||
|  | <B>B</B> is sparse (as it will be for LDPC codes).  The result is then | ||
|  | multiplied on the left by <B>A</B><SUP><SMALL>-1</SMALL></SUP>.  If | ||
|  | <I>M</I><<I>K</I>, the total time may be less than when using the | ||
|  | dense representation above. | ||
|  | 
 | ||
|  | <P>The <I>sparse representation</I> goes further, and avoids | ||
|  | explicitly computing <B>A</B><SUP><SMALL>-1</SMALL></SUP>, which tends | ||
|  | to be dense even if <B>H</B> is sparse.  Instead, a <I>LU | ||
|  | decomposition</I> of <B>A</B> is found, consisting of a lower | ||
|  | triangular matrix <B>L</B> and an upper triangular matrix <B>U</B> for | ||
|  | which <B>LU</B>=<B>A</B>. The effect of multiplying <B>Bs</B>=<B>z</B> by | ||
|  | <B>A</B><SUP><SMALL>-1</SMALL></SUP> can then be obtained by | ||
|  | <BLOCKQUOTE>  | ||
|  |   Solving <B>Ly</B>=<B>z</B> for <B>y</B> using forward substitution.<BR>  | ||
|  |   Solving <B>Uc</B>=<B>y</B> for <B>c</B> using backward substitution.   | ||
|  | </BLOCKQUOTE>  | ||
|  | Both of these operations will be fast if <B>L</B> and <B>U</B> are | ||
|  | sparse.  Heuristics are used to try to achieve this, by rearranging the  | ||
|  | rows and columns of <B>H</B> in the process of selecting <B>A</B> and  | ||
|  | finding its LU decomposition. | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="make-gen"><HR><B>make-gen</B>: Make a generator matrix from | ||
|  | a parity check matrix. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | make-gen <I>pchk-file gen-file method</I> | ||
|  | </PRE> | ||
|  | <BLOCKQUOTE> | ||
|  | where <TT><I>method</I></TT> is one of the following: | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | sparse [ first | mincol | minprod ] [ <I>abandon-num abandon-when</I> ] | ||
|  | 
 | ||
|  | dense [ <I>other-gen-file </I> ] | ||
|  | 
 | ||
|  | mixed [ <I>other-gen-file </I> ] | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | </BLOCKQUOTE> | ||
|  | </BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Finds a generator matrix for the code whose parity check matrix is | ||
|  | in <TT><I>pchk-file</I></TT>, and writes a representation of this | ||
|  | generator matrix to <TT><I>gen-file</I></TT>.  The remaining arguments | ||
|  | specify what representation of the generator matrix is to be used (see | ||
|  | the <A HREF="#gen-rep">description above</A>), and the method to be | ||
|  | used in finding it.  A message regarding the density of 1s in the | ||
|  | resulting representation is displayed on standard error. For a sparse | ||
|  | representation, a smaller number of 1s will produce faster encoding. | ||
|  | 
 | ||
|  | <P>All representations include a specification for how the columns of | ||
|  | the parity check matrix should be re-ordered so that the message bits | ||
|  | come last.  References to columns of the parity check matrix below | ||
|  | refer to their order after this reordering.  For the <I>dense</I> and | ||
|  | <I>mixed</I> representations, an <TT><I>other-gen-file</I></TT> may be | ||
|  | specified, in which case the ordering of columns will be the same as | ||
|  | the ordering stored in that file (which must produce a non-singular | ||
|  | <B>A</B> matrix; redundant rows of <B>H</B> are not allowed with this | ||
|  | option).  Otherwise, <TT>make-gen</TT> decides on an appropriate | ||
|  | ordering of columns itself.  Note that the column rearrangement is | ||
|  | recorded as part of the representation of the generator matrix; the | ||
|  | parity check matrix as stored in its file is not altered. | ||
|  | 
 | ||
|  | <P>The <I>dense</I> representation consists of a dense representation | ||
|  | of the matrix <B>A</B><SUP><SMALL>-1</SMALL></SUP><B>B</B>, where | ||
|  | <B>A</B> is the matrix consisting of the first <I>M</I> columns (after | ||
|  | reordering) of the parity check matrix, and <B>B</B> is the remaining | ||
|  | columns.  If <B>H</B> contains redundant rows, there is an additional | ||
|  | reordering of columns of <B>A</B> in order create the same effect as | ||
|  | if the redundant rows came last. | ||
|  | 
 | ||
|  | <P>The <I>mixed</I> representation consists of a dense representation | ||
|  | of the matrix <B>A</B><SUP><SMALL>-1</SMALL></SUP>, where <B>A</B> is | ||
|  | the matrix consisting of the first <I>M</I> columns (after reordering) | ||
|  | of the parity check matrix.  The remaining columns of the parity check | ||
|  | matrix, making up the matrix <B>B</B>, are also part of the | ||
|  | representation, but are not written to <TT><I>gen-file</I></TT>, since | ||
|  | they can be obtained from <TT><I>pchk-file</I></TT>.  As for mixed | ||
|  | representations, an additional reordering of columns of <B>A</B> may | ||
|  | be needed if <B>H</B> has redundant rows. | ||
|  | 
 | ||
|  | <P>A <I>sparse</I> representation consists of sparse representations | ||
|  | of the <B>L</B> and <B>U</B> matrices, whose product is <B>A</B>, the | ||
|  | first <I>M</I> columns of the parity check matrix (whose columns and | ||
|  | rows may both have been reordered).  The matrix <B>B</B>, consisting | ||
|  | of the remaining columns of the parity check matrix, is also part of | ||
|  | the representation, but it is not written to <TT><I>gen-file</I></TT>, | ||
|  | since it can be obtained from <TT><I>pchk-file</I></TT>. | ||
|  | 
 | ||
|  | <P>If a sparse representation is chosen, arguments after | ||
|  | <TT>sparse</TT> specify what heuristic is used when reordering columns | ||
|  | and rows in order to try to make <B>L</B> and <B>U</B> as sparse as | ||
|  | possible.  The default if no heuristic is specified is | ||
|  | <TT>minprod</TT>.  If the <TT><I>abandon-num</I></TT> and | ||
|  | <TT><I>abandon-when</I></TT> options are given, some information is | ||
|  | discarded in order to speed up the process of finding <B>L</B> and | ||
|  | <B>U</B>, at a possible cost in terms of how good a result is | ||
|  | obtained.  For details on these heuristics, see the descriptions of <A | ||
|  | HREF="sparse-LU.html">sparse LU decomposition methods</A>. | ||
|  | 
 | ||
|  | <P><B>Example:</B> A dense representation of a generator matrix for the | ||
|  | Hamming code created by the example for <A | ||
|  | HREF="pchk.html#make-pchk"><TT>make-pchk</TT></A> can be created as follows: | ||
|  | <UL><PRE> | ||
|  | <LI>make-gen ham7.pchk ham7.gen dense | ||
|  | Number of 1s per check in Inv(A) X B is 3.0 | ||
|  | </PRE></UL> | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="print-gen"><HR><B>print-gen</B>: Print a representation of a  | ||
|  | generator matrix. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | print-gen [ -d ] <I>gen-file</I> | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Prints in human-readable form the representation of the generator | ||
|  | matrix that is stored in <TT><I>gen-file</I></TT>.  The <B>-d</B> | ||
|  | option causes the matrices involved to be printed in a dense format, | ||
|  | even if they are stored in the file in a sparse format.  See the <A | ||
|  | HREF="#gen-rep">description above</A> for details of generator matrix | ||
|  | representations.  Note that the <B>L</B> matrix for a sparse representation | ||
|  | will be lower triangular only after the rows are rearranged, and the <B>U</B> | ||
|  | matrix will be upper triangular only after the columns are rearranged.  | ||
|  | The matrix <B>B</B> that is part of the sparse | ||
|  | and mixed representations is not printed, since it is not stored  | ||
|  | in the <TT><I>gen-file</I></TT>, but is rather a subset of columns | ||
|  | of the parity check matrix.   | ||
|  | 
 | ||
|  | <P><B>Example:</B> The generator matrix for the | ||
|  | Hamming code created by the example for <A | ||
|  | HREF="#make-gen"><TT>make-gen</TT></A> can be printed as follows: | ||
|  | <UL><PRE> | ||
|  | <LI>print-gen ham7.gen | ||
|  | 
 | ||
|  | Generator matrix (dense representation): | ||
|  | 
 | ||
|  | Column order: | ||
|  | 
 | ||
|  |    0   1   2   3   4   5   6 | ||
|  | 
 | ||
|  | Inv(A) X B: | ||
|  | 
 | ||
|  |  1 1 1 0 | ||
|  |  1 1 0 1 | ||
|  |  0 1 1 1 | ||
|  | </PRE></UL> | ||
|  | For this example, the columns did not need to be rearranged, and hence the | ||
|  | message bits will be in positions 3, 4, 5, and 6 of a codeword. | ||
|  | 
 | ||
|  | <P><A NAME="encode"><HR><B>encode</B>: Encode message blocks as codewords | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | encode [ -f ] <I>pchk-file gen-file source-file encoded-file</I> | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | 
 | ||
|  | Encodes message blocks of length <I>K</I>, read from | ||
|  | <TT><I>source-file</I></TT>, as codewords of length <I>N</I>, which | ||
|  | are written to <TT><I>encoded-file</I></TT>, replacing any previous | ||
|  | data in this file.  Here, <I>N</I> is the number of columns in the | ||
|  | parity check matrix in <TT><I>pchk-file</I></TT>, and | ||
|  | <I>K</I>=<I>N-M</I>, where <I>M</I> is the number of rows in the | ||
|  | parity check matrix.  The generator matrix used, from | ||
|  | <TT><I>gen-file</I></TT>, determines which bits of the codeword are | ||
|  | set to the message bits, and how the remaining check bits are | ||
|  | computed.  The generator matrix is created from | ||
|  | <TT><I>pchk-file</I></TT> using <A HREF="#make-gen"><TT>make-gen</TT></A>. | ||
|  | 
 | ||
|  | <P>A newline is output at the end of each block written to | ||
|  | <TT><I>encoded-file</I></TT>.  Newlines in <TT><I>source-file</I></TT> | ||
|  | are ignored. | ||
|  | 
 | ||
|  | <P>If the <B>-f</B> option is given, output to <TT><I>encoded-file</I></TT> | ||
|  | is flushed after each block.  This allows one to use encode as a server, | ||
|  | reading blocks to encode from a named pipe, and writing the encoded block | ||
|  | to another named pipe. | ||
|  | 
 | ||
|  | <HR> | ||
|  | 
 | ||
|  | <A HREF="index.html">Back to index for LDPC software</A> | ||
|  | 
 | ||
|  | </BODY></HTML> |