Class ConvolutionalCoder

  • All Implemented Interfaces:
    java.lang.Cloneable, Actor, Executable, FiringsRecordable, Initializable, TypedActor, Changeable, Debuggable, DebugListener, Derivable, Instantiable, ModelErrorHandler, MoMLExportable, Moveable, Nameable

    public class ConvolutionalCoder
    extends Transformer
    Encode an input sequence with a convolutional code. The inputs and outputs are booleans.

    The input sequence enters a shift register, and the contents of the shift register are combined using boolean functions given by the polynomialArray parameter. The initial state of the shift register is given by the initialState parameter, which should be a non-negative integer. The uncodedRate parameter, often denoted by k in the coding literature, is the number of bits per firing that are shifted into the shift register. The polynomialArray parameter is an array of positive integers. Each integer indicates one polynomial used for computing output bits. To get a k/n convolutional code, set uncodedRate to k and provide n integers in polynomialArray.

    The integers in polynomialArray are usually most conveniently given as octal numbers. A leading zero indicates an octal number. The i-th bit of the integer indicates whether the i-th tap of the delay line should be used. All bits that are used are exclusive-ored, thus yielding the parity of the selected bits. See more details in Scrambler actor on using an integer to define a polynomial. The n parity results are produced on the output in a sequence.

    A good convolutional code should have large Hamming distance between any two of its codewords. This is not easily checked, but there are some simple rules that all "good" codes should satisfy:

    1. k should be strictly smaller than n, otherwise the code is not uniquely decodable. Thus, uncodedRate should be less than the length of polynomialArray.
    2. k should not be higher than the highest order of all polynomials, otherwise, some input bits never get involved in computing parities.

    If these rules are violated, the actor will throw an exception. However, these rules do not guarantee the codeword can be decoded successfully, and it is not always true that larger polynomials yield better codes. Users should check tables for convolutional codes from professional references. For convenience, we list here some convolutional codes that have large distance property.

     Rate = 1/2
     polynomialArray
     {05, 07}
     {013, 017}
     {031, 027}
     {065, 057}
     {0155, 0117}
    
     Rate = 1/3
     polynomialArray
     {05, 07, 07}
     {015, 013, 017}
     {025, 033, 037}
     {071, 065, 057}
     {0155, 0123, 0137}
    
     Rate = 1/4
     polynomialArray
     {05, 07, 07, 07}
     {015, 013, 013, 017}
     {025, 035, 033, 037}
     {065, 073, 047, 057}
     {0135, 0135, 0163, 0147}
    
     Rate = 1/5
     polynomialArray
     {07, 07, 07, 05, 05}
     {017, 017, 015, 013, 013}
     {037, 035, 033, 025, 027}
     {057, 047, 067, 053, 075}
    
     Rate = 1/6
     polynomialArray
     {07, 07, 07, 07, 05, 05}
     {017, 017, 015, 015, 013, 013}
     {037, 027, 035, 033, 025, 027}
     {067, 057, 055, 053, 071, 075}
    
     Rate = 2/3
     polynomialArray
     {017, 06, 013}
     {072, 057, 027}
     {0171, 0166, 0273}
    
     Rate = k/5
     k     polynomialArray
     2     {017, 016, 011, 05, 02}
     2     {072, 047, 025, 053, 075}
     3     {056, 062, 057, 043, 071}
    
     Rate = k/7
     k     polynomialArray
     2     {012, 06, 05, 013, 013, 015, 017}
     2     {066, 055, 027, 071, 052, 056, 057}
     3     {051, 042, 036, 023, 075, 061, 047}
    
     Rate  polynomialArray
     3/4   {064, 052, 043, 071}
     3/8   {054, 021, 062, 043, 045, 036, 057, 071}
     

    Note that this implementation is limited to a shift register length of 32 because of the specification of the polynomials and initial shift register state as 32-bit integers.

    For more information on convolutional codes, see Proakis, Digital Communications, Fourth Edition, McGraw-Hill, 2001, pp. 471-477, or Barry, Lee and Messerschmitt, Digital Communication, Third Edition, Kluwer, 2004.

    Since:
    Ptolemy II 3.0
    Version:
    $Id$
    Author:
    Ye Zhou, contributor: Edward A. Lee
    See Also:
    Scrambler, ViterbiDecoder
    Pt.AcceptedRating:
    Red (cxh)
    Pt.ProposedRating:
    Yellow (eal)
    • Field Detail

      • polynomialArray

        public Parameter polynomialArray
        An array of integers defining an array of polynomials with binary coefficients. The coefficients indicate the presence (1) or absence (0) of a tap in the shift register. Each element of this array parameter should be a positive integer. The default value is {05, 07}.
      • initialState

        public Parameter initialState
        Integer defining the initial state of the shift register. The i-th bit of the integer indicates the value of the i-th register. This parameter should be a non-negative integer. Its default value is the integer 0.
      • uncodedRate

        public Parameter uncodedRate
        Integer defining the number of bits that the shift register takes in each firing. It should be a positive integer. Its default value is the integer 1.