mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	
		
			
	
	
		
			372 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			372 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|  | <HTML><HEAD> | ||
|  | 
 | ||
|  | <TITLE> Creating a Parity Check Matrix </TITLE> | ||
|  | 
 | ||
|  | </HEAD><BODY> | ||
|  | 
 | ||
|  | 
 | ||
|  | <H1> Creating a Parity Check Matrix </H1> | ||
|  | 
 | ||
|  | <P>This software deals only with linear block codes for binary (ie, | ||
|  | modulo-2, GF(2)) vectors.  The set of valid codewords for a linear | ||
|  | code can be specified by giving a <I>parity check matrix</I>, | ||
|  | <B>H</B>, with <I>M</I> rows and <I>N</I> columns.  The valid | ||
|  | codewords are the vectors, <B>x</B>, of length <I>N</I>, for which | ||
|  | <B>Hx</B>=<B>0</B>, where all arithmetic is done modulo-2.  Each row | ||
|  | of <B>H</B> represents a parity check on a subset of the bits in | ||
|  | <B>x</B>; all these parity checks must be satisfied for <B>x</B> to be | ||
|  | a codeword.  Note that the parity check matrix for a given code (ie, | ||
|  | for a given set of valid codewords) is not unique, even after | ||
|  | eliminating rows of <B>H</B> that are redundant because they are | ||
|  | linear combinations of other rows. | ||
|  | 
 | ||
|  | <P>This software stores parity check matrices in files in a sparse | ||
|  | format.  These parity-check files are <I>not</I> human-readable | ||
|  | (except by using the <A HREF="#print-pchk"><TT>print-pchk</TT></A> | ||
|  | program).  However, they <I>are</I> readable on a machine with a | ||
|  | different architecture than they were written on. | ||
|  | 
 | ||
|  | <P>Some LDPC software by David MacKay and others uses the  | ||
|  | <A HREF="http://www.inference.phy.cam.ac.uk/mackay/codes/alist.html">alist | ||
|  | format</A> for parity check matrices.  Two programs for converting | ||
|  | between this format and the format for sparse parity check matrices | ||
|  | used by this software are provided. | ||
|  | 
 | ||
|  | 
 | ||
|  | <A NAME="ldpc"><H2>Methods for constructing LDPC codes</H2></A> | ||
|  | 
 | ||
|  | <P>This software is primarily intended for experimentation with Low | ||
|  | Density Parity Check (LDPC) codes.  These codes can be constructed by | ||
|  | various methods, which generally involve some random selection of | ||
|  | where to put 1s in a parity check matrix.  Any such method for | ||
|  | constructing LDPC codes will have the property that it produces parity | ||
|  | check matrices in which the number of 1s in a column is approximately | ||
|  | the same (perhaps on average) for any size parity check matrix.  For a | ||
|  | given code rate, these matrices therefore become increasingly sparse | ||
|  | as the length of a codeword, and hence the number of parity checks, | ||
|  | increases. | ||
|  | 
 | ||
|  | <P>Many methods for constructing LDPC matrices are described in the | ||
|  | <A HREF="refs.html">references</A>.  Two simple methods are currently | ||
|  | implemented by this software, both of which operate according to the | ||
|  | following scheme: | ||
|  | <OL> | ||
|  | <LI> Create a preliminary parity check matrix by one of the methods. | ||
|  | <LI> Add 1s to the parity check matrix in order to avoid rows that have no | ||
|  |      1s in them, and hence are redundant, or which have only one 1 in them, | ||
|  |      in which case the corresponding codeword bits will always be zero. | ||
|  |      The places within such a row to add these 1s are selected randomly. | ||
|  | <LI> If the preliminary parity check matrix constructed in step (1) had | ||
|  |      an even number of 1s in each column, add further 1s to avoid the problem  | ||
|  |      that this will cause the rows to add to zero, and hence at least | ||
|  |      one check will be redundant.  Up to two 1s are added (since it is also | ||
|  |      undesirable for the sum of the rows to have only one 1 in it), at  | ||
|  |      positions selected randomly from the entire matrix.  However, the | ||
|  |      number of 1s to add in this step is reduced by the number already added | ||
|  |      in step (2).  (Note that although redundant checks are not disastrous,  | ||
|  |      they are better avoided; see the discussion of <A HREF="dep-H.html">linear | ||
|  |      dependence in parity check matrices</A>.) | ||
|  | <LI> If requested, try to eliminate  | ||
|  |      situations where a pair of columns both have 1s in a particular pair of  | ||
|  |      rows, which correspond to cycles of length four in the factor graph of  | ||
|  |      the parity check matrix.  When such a situation is detected, one of the | ||
|  |      1s involved is moved randomly within its column.  This continues until | ||
|  |      no such situations remain, or until 10 passes over all columns have | ||
|  |      failed to eliminate all such situations. | ||
|  | </OL> | ||
|  | 
 | ||
|  | <P>The <I>evencol</I> method is the simplest way of performing step | ||
|  | (1) of the above procedure.  For each column of the parity check | ||
|  | matrix, independently, it places a specified number of 1s in positions | ||
|  | selected uniformly at random, with the only constraint being that | ||
|  | these 1s be in distinct rows.  Note that despite the name, the columns | ||
|  | do not have to have the same number of 1s - a distribution over | ||
|  | several values for the number of 1s in a column can be specified | ||
|  | instead.  Such codes with different-weight columns are sometimes | ||
|  | better than codes in which every column has the same weight. | ||
|  | 
 | ||
|  | <P>The <I>evenboth</I> method also puts a specified number of 1s in | ||
|  | each column, but it tries as well to keep the numbers of 1s in the | ||
|  | rows approximately the same.  Initially, it creates indicators for all | ||
|  | the 1s that will be required, and assigns these 1s to rows as evenly | ||
|  | as it can, favouring earlier rows if an exactly even split is not | ||
|  | possible.  It then assigns 1s to successive columns by selecting | ||
|  | randomly, without replacement, from this initial supply of 1s, subject | ||
|  | only to the constraint that the 1s assigned to a column must be in | ||
|  | distinct rows.  If at some point it is impossible to put the required | ||
|  | number of 1s in a column by picking from the 1s remaining, a 1 is set | ||
|  | in that column without reference to other columns, creating a possible | ||
|  | unevenness.   | ||
|  | 
 | ||
|  | <P>Note that regardless of how evenly 1s are distributed in the | ||
|  | preliminary parity check matrix created in step (1), steps (2) and (3) | ||
|  | can make the numbers of 1s in the both rows and columns be uneven, and | ||
|  | step (4), if done, can make the numbers of 1s in rows be uneven. | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="make-pchk"><HR><B>make-pchk</B>: Make a parity check  | ||
|  | matrix by explicit specification. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | make-pchk <I>pchk-file n-checks n-bits row</I>:<I>col ...</I> | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Creates a file named <TT><I>pchk-file</I></TT> in | ||
|  | which it stores a parity check matrix with <TT><I>n-checks</I></TT> | ||
|  | rows and <TT><I>n-bits</I></TT> columns.  This parity check matrix | ||
|  | consists of all 0s except for 1s at the <I>row</I>:<I>col</I> | ||
|  | positions listed.  Rows and columns are numbered starting at zero. | ||
|  | This program is intended primarily for testing and demonstration  | ||
|  | purposes.   | ||
|  | 
 | ||
|  | <P><B>Example:</B> The well-known Hamming code with codewords of | ||
|  | length <I>N</I>=7 and with <I>M</I>=3 parity checks can be can be | ||
|  | created as follows: | ||
|  | <UL><PRE> | ||
|  | <LI>make-pchk ham7.pchk 3 7 0:0 0:3 0:4 0:5 1:1 1:3 1:4 1:6 2:2 2:4 2:5 2:6 | ||
|  | </PRE></UL> | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="alist-to-pchk"><HR><B>alist-to-pchk</B>: Convert a parity | ||
|  | check matrix from alist format to the sparse matrix format used by | ||
|  | this software. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | alist-to-pchk [ -t ] <I>alist-file pchk-file</I> | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Converts a parity check matrix in  | ||
|  | <A HREF="http://www.inference.phy.cam.ac.uk/mackay/codes/alist.html">alist | ||
|  | format</A> stored in the file named <TT><I>alist-file</I></TT> to  | ||
|  | the sparse matrix format used by this software, storing it in the | ||
|  | file named <TT><I>pchk-file</I></TT>. | ||
|  | 
 | ||
|  | <P>If the <B>-t</B> option is given, the transpose of the parity check | ||
|  | matrix in <TT><I>alist-file</I></TT> is stored in the | ||
|  | <TT><I>pchk-file</I></TT>. | ||
|  | 
 | ||
|  | <P>Any zeros indexes in the alist file are ignored, so that alist files | ||
|  | with zero padding (as required in the specification) are accepted, | ||
|  | but files without this zero padding are also accepted.  Newlines | ||
|  | are ignored by <TT>alist-to-pchk</TT>, so no error is reported if | ||
|  | the set of indexes in a row or column description are not those | ||
|  | on a single line. | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="pchk-to-alist"><HR><B>pchk-to-alist</B>: Convert a parity | ||
|  | check matrix to alist format. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | pchk-to-alist [ -t ] [ -z ] <I>pchk-file alist-file</I> | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Converts a parity check matrix stored in the sparse matrix format | ||
|  | used by this software, in the file named <TT><I>pchk-file</I></TT>, to | ||
|  | the <A | ||
|  | HREF="http://www.inference.phy.cam.ac.uk/mackay/codes/alist.html">alist | ||
|  | format</A>, storing it in the file named <TT><I>alist-file</I></TT>. | ||
|  | 
 | ||
|  | <P>If the <B>-t</B> option is given, the transpose of the parity check | ||
|  | matrix is converted to alist format.   | ||
|  | 
 | ||
|  | <P>If the number of 1s is not | ||
|  | the same for each row or each column, the alist format specification | ||
|  | says that the list of indexes of 1s for each row or column should | ||
|  | be padded with zeros to the maximum number of indexes.  By default, | ||
|  | <TT>pchk-to-alist</TT> does this, but output of these 0s can be | ||
|  | suppressed by specifying the <B>-z</B> option.  (The <TT>alist-to-pchk</TT> | ||
|  | program will accept alist files produced with or without the <B>-z</B> | ||
|  | option.) | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="print-pchk"><HR><B>print-pchk</B>: Print a parity check matrix. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | print-pchk [ -d ] [ -t ] <I>pchk-file</I> | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Prints a human-readable representation of the parity check matrix stored | ||
|  | in <TT><I>pchk-file</I></TT>. | ||
|  | The <B>-d</B> option causes the matrix to be printed in a dense | ||
|  | format, even though parity check matrices are always stored in the | ||
|  | file in a sparse format.  If the <B>-t</B> option is present, what is | ||
|  | printed is the transpose of the parity check matrix. | ||
|  | 
 | ||
|  | <P>The sparse display format consists of one line for every row of the | ||
|  | matrix, consisting of the row number, a colon, and the column numbers | ||
|  | at which 1s are located (possibly none).  Row and columns numbers | ||
|  | start at zero.  No attempt is made to wrap long lines. | ||
|  | 
 | ||
|  | <P>The dense display is the obvious array of 0s and 1s.  Long lines | ||
|  | are not wrapped. | ||
|  | 
 | ||
|  | <P><B>Example</B>: The parity check matrix for the Hamming code created  | ||
|  | by the example for <A HREF="#make-pchk"><TT>make-pchk</TT></A> would print  | ||
|  | as follows: | ||
|  | <UL><PRE> | ||
|  | <LI>print-pchk ham7.pchk | ||
|  | 
 | ||
|  | Parity check matrix in ham7.pchk (sparse format): | ||
|  | 
 | ||
|  | 0: 0 3 4 5 | ||
|  | 1: 1 3 4 6 | ||
|  | 2: 2 4 5 6 | ||
|  | 
 | ||
|  | <LI>print-pchk -d ham7.pchk | ||
|  | 
 | ||
|  | Parity check matrix in ham7.pchk (dense format): | ||
|  | 
 | ||
|  |  1 0 0 1 1 1 0 | ||
|  |  0 1 0 1 1 0 1 | ||
|  |  0 0 1 0 1 1 1 | ||
|  | </PRE></UL> | ||
|  | 
 | ||
|  | 
 | ||
|  | <P><A NAME="make-ldpc"><HR><B>make-ldpc</B>: Make a low density parity | ||
|  | check matrix, by random generation. | ||
|  | 
 | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | make-ldpc <I>pchk-file n-checks n-bits seed method</I> | ||
|  | </PRE> | ||
|  | <BLOCKQUOTE> | ||
|  | where <TT><I>method</I></TT> is one of the following: | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | evencol <I>checks-per-col</I> [ no4cycle ] | ||
|  | 
 | ||
|  | evencol <I>checks-distribution</I> [ no4cycle ] | ||
|  | 
 | ||
|  | evenboth <I>checks-per-col</I> [ no4cycle ] | ||
|  | 
 | ||
|  | evenboth <I>checks-distribution</I> [ no4cycle ] | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | </BLOCKQUOTE> | ||
|  | </BLOCKQUOTE> | ||
|  | 
 | ||
|  | <P>Creates a Low Density Parity Check matrix with | ||
|  | <TT><I>n-checks</I></TT> rows and <TT><I>n-bits</I></TT> columns.  The | ||
|  | parity check matrix will be generated pseudo-randomly by the indicated | ||
|  | method, using a pseudo-random number stream determined by <TT><I>seed</I></TT>. | ||
|  | The actual random number seed used is 10 times <TT><I>seed</I></TT> plus 1, | ||
|  | so as to avoid using the same stream as any of the other programs. | ||
|  | 
 | ||
|  | <P>Two methods are currently available for creating the LDPC matrix, | ||
|  | specified by <TT>evencol</TT> or <TT>evenboth</TT>.  Both methods | ||
|  | produce a matrix in which the number of 1s in each column is | ||
|  | approximately <TT><I>checks-per-col</I></TT>, or varies from column | ||
|  | to column according the the <TT><I>checks-distribution</I></TT>.   | ||
|  | The <TT>evenboth</TT> method also tries to make the number of checks per row be | ||
|  | approximately uniform; if this is not achieved, a message saying that | ||
|  | how many bits were placed unevenly is displayed on standard error. | ||
|  | 
 | ||
|  | <P>For both methods, the <TT>no4cycle</TT> option will cause cycles of | ||
|  | length four in the factor graph representation of the code to be | ||
|  | eliminated (if possible).  A message is displayed on standard error if | ||
|  | this is not achieved. | ||
|  | 
 | ||
|  | <P>A <TT><I>checks-distribution</I></TT> has the form | ||
|  | <BLOCKQUOTE><PRE> | ||
|  | <I>prop</I>x<I>count</I>/<I>prop</I>x<I>count</I>/... | ||
|  | </PRE></BLOCKQUOTE> | ||
|  | Here, <TT><I>prop</I></TT> is a proportion of columns that have the  | ||
|  | associated <TT><I>count</I></TT>.  The proportions need not sum to one, | ||
|  | since they will be automatically normalized.  For example, <TT>0.3x4/0.2x5</TT> | ||
|  | specifies that 60% of the columns will contain four 1s and 40% will  | ||
|  | contain five 1s. | ||
|  | 
 | ||
|  | <P>See the <A HREF="#ldpc">discussion above</A> for more details | ||
|  | on how these methods construct LDPC matrices. | ||
|  | 
 | ||
|  | <P><B>Example 1:</B> The <TT>make-ldpc</TT> command below creates  | ||
|  | a 20 by 40 low density parity check matrix with three 1s per  | ||
|  | column and six 1s per row, using random seed 1.  The matrix  | ||
|  | is then printed in sparse format | ||
|  | using <A HREF="#print-pchk">print-pchk</A>. | ||
|  | <UL><PRE> | ||
|  | <LI>make-ldpc ldpc.pchk 20 40 1 evenboth 3 | ||
|  | <LI>print-pchk ldpc.pchk | ||
|  | 
 | ||
|  | Parity check matrix in ldpc.pchk (sparse format): | ||
|  | 
 | ||
|  |  0: 10 14 18 27 38 39 | ||
|  |  1:  2  3  5 11 27 30 | ||
|  |  2: 15 19 20 21 24 26 | ||
|  |  3:  2  4 25 28 32 38 | ||
|  |  4:  7  9 12 22 33 34 | ||
|  |  5:  5  6 21 22 26 32 | ||
|  |  6:  1  4 13 24 25 28 | ||
|  |  7:  1 14 28 29 30 36 | ||
|  |  8: 11 13 22 23 32 37 | ||
|  |  9:  6  8 13 20 31 33 | ||
|  | 10:  0  3 24 29 31 38 | ||
|  | 11:  7 12 15 16 17 23 | ||
|  | 12:  3 16 29 34 35 39 | ||
|  | 13:  0  8 10 18 36 37 | ||
|  | 14:  6 11 18 20 35 39 | ||
|  | 15:  0  7 14 16 25 37 | ||
|  | 16:  2  4  9 19 30 31 | ||
|  | 17:  5  9 10 17 19 23 | ||
|  | 18:  8 15 17 21 26 27 | ||
|  | 19:  1 12 33 34 35 36 | ||
|  | </PRE></UL> | ||
|  | 
 | ||
|  | <P><B>Example 2:</B> The two <TT>make-ldpc</TT> commands | ||
|  | below both create a 20 by 40 low density parity check matrix with 30% | ||
|  | of columns with two 1s, 60% of columns with three 1s, and 10% of | ||
|  | columns with seven 1s.  The transpose of the parity check matrix | ||
|  | is then printed in sparse format. | ||
|  | <UL><PRE> | ||
|  | <LI>make-ldpc ldpc.pchk 20 40 1 evenboth 0.3x2/0.6x3/0.1x7  | ||
|  | <LI>make-ldpc ldpc.pchk 20 40 1 evenboth 3x2/6x3/1x7 | ||
|  | <LI>print-pchk -t ldpc.pchk | ||
|  | 
 | ||
|  | Transpose of parity check matrix in ldpc.pchk (sparse format): | ||
|  | 
 | ||
|  |  0: 13 16 | ||
|  |  1:  9 18 | ||
|  |  2:  1 10 | ||
|  |  3:  3 15 | ||
|  |  4:  4 14 | ||
|  |  5: 14 17 | ||
|  |  6:  4  5 | ||
|  |  7:  1  8 | ||
|  |  8:  0  4 | ||
|  |  9:  9 14 | ||
|  | 10:  5  8 | ||
|  | 11:  6 16 | ||
|  | 12:  2 12 19 | ||
|  | 13:  3 17 18 | ||
|  | 14:  2 16 17 | ||
|  | 15:  2 11 18 | ||
|  | 16: 12 13 19 | ||
|  | 17:  7 13 18 | ||
|  | 18:  2  5 11 | ||
|  | 19: 10 12 14 | ||
|  | 20:  1  8 16 | ||
|  | 21: 10 18 19 | ||
|  | 22:  3  6 17 | ||
|  | 23:  7 11 12 | ||
|  | 24:  1  2 19 | ||
|  | 25:  0  6  7 | ||
|  | 26:  5  8 15 | ||
|  | 27:  1  4  7 | ||
|  | 28:  6 13 19 | ||
|  | 29:  3  4 11 | ||
|  | 30:  3  8 17 | ||
|  | 31:  4  5  9 | ||
|  | 32:  0 10 15 | ||
|  | 33:  7 11 13 | ||
|  | 34:  8 12 19 | ||
|  | 35:  0  2 10 | ||
|  | 36:  0  5  9 11 15 17 18 | ||
|  | 37:  0  1  2  6  7 14 16 | ||
|  | 38:  0  1  3  9 12 13 15 | ||
|  | 39:  3  6  9 10 14 15 16 | ||
|  | </PRE></UL> | ||
|  | 
 | ||
|  | <HR> | ||
|  | 
 | ||
|  | <A HREF="index.html">Back to index for LDPC software</A> | ||
|  | 
 | ||
|  | </BODY></HTML> | ||
|  | 
 |