|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectptolemy.kernel.util.NamedObj
ptolemy.kernel.InstantiableNamedObj
ptolemy.kernel.Entity
ptolemy.kernel.ComponentEntity
ptolemy.actor.AtomicActor
ptolemy.actor.TypedAtomicActor
ptolemy.actor.lib.Transformer
ptolemy.actor.lib.comm.ConvolutionalCoder
public class ConvolutionalCoder
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:
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.
Scrambler
,
ViterbiDecoder
,
Serialized Form
Red (cxh) |
Yellow (eal) |
Nested Class Summary |
---|
Nested classes/interfaces inherited from class ptolemy.kernel.Entity |
---|
Entity.ContainedObjectsIterator |
Field Summary | |
---|---|
private int |
_inputNumber
|
private boolean |
_inputNumberInvalid
|
private Parameter |
_inputRate
|
private int |
_latestShiftReg
|
private int[] |
_mask
|
private int |
_maskNumber
|
private int |
_maxPolyValue
|
private Parameter |
_outputRate
|
private int |
_shiftReg
|
Parameter |
initialState
Integer defining the initial state of the shift register. |
Parameter |
polynomialArray
An array of integers defining an array of polynomials with binary coefficients. |
Parameter |
uncodedRate
Integer defining the number of bits that the shift register takes in each firing. |
Fields inherited from class ptolemy.actor.lib.Transformer |
---|
input, output |
Fields inherited from class ptolemy.actor.AtomicActor |
---|
_actorFiringListeners, _initializables, _notifyingActorFiring, _stopRequested |
Fields inherited from class ptolemy.kernel.util.NamedObj |
---|
_changeListeners, _changeLock, _changeRequests, _debugging, _debugListeners, _elementName, _isPersistent, _verbose, _workspace, ATTRIBUTES, CLASSNAME, COMPLETE, CONTENTS, DEEP, FULLNAME, LINKS |
Fields inherited from interface ptolemy.actor.Executable |
---|
COMPLETED, NOT_READY, STOP_ITERATING |
Constructor Summary | |
---|---|
ConvolutionalCoder(CompositeEntity container,
java.lang.String name)
Construct an actor with the given container and name. |
Method Summary | |
---|---|
private int[] |
_calculateParity(int[] mask,
int maskNumber,
int reg)
Calculate the parities given by the polynomial array and the state of shift register. |
void |
attributeChanged(Attribute attribute)
If the attribute being changed is uncodedRate, then verify that it is a positive integer; if it is polynomialArray, then verify that each of its elements is a positive integer and find the maximum value among them, which is used to compute the highest order among all polynomials. |
java.lang.Object |
clone(Workspace workspace)
Clone the actor into the specified workspace. |
void |
fire()
Read uncodedRate bits from the input port and shift them into the shift register. |
void |
initialize()
Initialize the actor by resetting the shift register state equal to the value of initialState. |
boolean |
postfire()
Record the most recent shift register state as the new state for the next iteration. |
Methods inherited from class ptolemy.actor.TypedAtomicActor |
---|
_addPort, _fireAt, _fireAt, attributeTypeChanged, clone, newPort, typeConstraintList, typeConstraints |
Methods inherited from class ptolemy.kernel.ComponentEntity |
---|
_adjustDeferrals, _checkContainer, _getContainedObject, _propagateExistence, getContainer, instantiate, isAtomic, isOpaque, moveDown, moveToFirst, moveToIndex, moveToLast, moveUp, propagateExistence, setName |
Methods inherited from class ptolemy.kernel.Entity |
---|
_description, _exportMoMLContents, _removePort, _validateSettables, connectedPortList, connectedPorts, containedObjectsIterator, getAttribute, getPort, getPorts, linkedRelationList, linkedRelations, portList, removeAllPorts, setClassDefinition, uniqueName |
Methods inherited from class ptolemy.kernel.InstantiableNamedObj |
---|
_setParent, exportMoML, getChildren, getElementName, getParent, getPrototypeList, isClassDefinition, isWithinClassDefinition |
Methods inherited from class java.lang.Object |
---|
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Methods inherited from interface ptolemy.actor.Actor |
---|
createReceivers, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, newReceiver, outputPortList |
Methods inherited from interface ptolemy.actor.Executable |
---|
isFireFunctional, isStrict, iterate, prefire, stop, stopFire, terminate |
Methods inherited from interface ptolemy.actor.Initializable |
---|
addInitializable, preinitialize, removeInitializable, wrapup |
Methods inherited from interface ptolemy.kernel.util.Nameable |
---|
description, getContainer, getDisplayName, getFullName, getName, getName, setName |
Methods inherited from interface ptolemy.kernel.util.Derivable |
---|
getDerivedLevel, getDerivedList, propagateValue |
Field Detail |
---|
public Parameter polynomialArray
public Parameter initialState
public Parameter uncodedRate
private Parameter _inputRate
private Parameter _outputRate
private int _shiftReg
private int _latestShiftReg
private int _inputNumber
private int[] _mask
private int _maskNumber
private int _maxPolyValue
private transient boolean _inputNumberInvalid
Constructor Detail |
---|
public ConvolutionalCoder(CompositeEntity container, java.lang.String name) throws NameDuplicationException, IllegalActionException
container
- The container.name
- The name of this actor.
IllegalActionException
- If the entity cannot be contained
by the proposed container.
NameDuplicationException
- If the container already has an
actor with this name.Method Detail |
---|
public void attributeChanged(Attribute attribute) throws IllegalActionException
attributeChanged
in class NamedObj
attribute
- The attribute that changed.
IllegalActionException
- If uncodedRate is
non-positive or any element of polynomialArray is non-positive.public java.lang.Object clone(Workspace workspace) throws java.lang.CloneNotSupportedException
clone
in class AtomicActor
workspace
- The workspace for the new object.
java.lang.CloneNotSupportedException
- If a derived class contains
an attribute that cannot be cloned.NamedObj.exportMoML(Writer, int, String)
,
NamedObj.setDeferringChangeRequests(boolean)
public void fire() throws IllegalActionException
fire
in interface Executable
fire
in class AtomicActor
IllegalActionException
- Not thrown in this base class.public void initialize() throws IllegalActionException
initialize
in interface Initializable
initialize
in class AtomicActor
IllegalActionException
- If the parent class throws it.public boolean postfire() throws IllegalActionException
postfire
in interface Executable
postfire
in class AtomicActor
IllegalActionException
- If the base class throws itprivate int[] _calculateParity(int[] mask, int maskNumber, int reg)
mask
- The polynomial array.reg
- State of shift register.
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |