public class ConvolutionalCoder extends Transformer
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:
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.
Scrambler
,
ViterbiDecoder
Entity.ContainedObjectsIterator
Modifier and Type | Field and Description |
---|---|
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.
|
input, output
_typesValid
_actorFiringListeners, _initializables, _notifyingActorFiring, _stopRequested
_changeListeners, _changeLock, _changeRequests, _debugging, _debugListeners, _deferChangeRequests, _elementName, _isPersistent, _verbose, _workspace, ATTRIBUTES, CLASSNAME, COMPLETE, CONTENTS, DEEP, FULLNAME, LINKS
COMPLETED, NOT_READY, STOP_ITERATING
Constructor and Description |
---|
ConvolutionalCoder(CompositeEntity container,
java.lang.String name)
Construct an actor with the given container and name.
|
Modifier and Type | Method and Description |
---|---|
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.
|
_containedTypeConstraints, _customTypeConstraints, _defaultTypeConstraints, _fireAt, _fireAt, attributeTypeChanged, clone, isBackwardTypeInferenceEnabled, newPort, typeConstraintList, typeConstraints
_actorFiring, _actorFiring, _declareDelayDependency, addActorFiringListener, addInitializable, connectionsChanged, createReceivers, declareDelayDependency, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, isFireFunctional, isStrict, iterate, newReceiver, outputPortList, prefire, preinitialize, pruneDependencies, recordFiring, removeActorFiringListener, removeDependency, removeInitializable, setContainer, stop, stopFire, terminate, wrapup
_adjustDeferrals, _checkContainer, _getContainedObject, _propagateExistence, getContainer, instantiate, isAtomic, isOpaque, moveDown, moveToFirst, moveToIndex, moveToLast, moveUp, propagateExistence, setName
_addPort, _description, _exportMoMLContents, _removePort, _validateSettables, connectedPortList, connectedPorts, containedObjectsIterator, getAttribute, getPort, getPorts, linkedRelationList, linkedRelations, portList, removeAllPorts, setClassDefinition, uniqueName
_setParent, exportMoML, getChildren, getElementName, getParent, getPrototypeList, isClassDefinition, isWithinClassDefinition
_addAttribute, _adjustOverride, _attachText, _cloneFixAttributeFields, _containedDecorators, _copyChangeRequestList, _debug, _debug, _debug, _debug, _debug, _executeChangeRequests, _getIndentPrefix, _isMoMLSuppressed, _markContentsDerived, _notifyHierarchyListenersAfterChange, _notifyHierarchyListenersBeforeChange, _propagateValue, _removeAttribute, _splitName, _stripNumericSuffix, addChangeListener, addDebugListener, addHierarchyListener, attributeDeleted, attributeList, attributeList, decorators, deepContains, depthInHierarchy, description, description, event, executeChangeRequests, exportMoML, exportMoML, exportMoML, exportMoML, exportMoMLPlain, getAttribute, getAttributes, getChangeListeners, getClassName, getDecoratorAttribute, getDecoratorAttributes, getDerivedLevel, getDerivedList, getDisplayName, getFullName, getModelErrorHandler, getName, getName, getSource, handleModelError, isDeferringChangeRequests, isOverridden, isPersistent, lazyContainedObjectsIterator, message, notifyOfNameChange, propagateValue, propagateValues, removeAttribute, removeChangeListener, removeDebugListener, removeHierarchyListener, requestChange, setClassName, setDeferringChangeRequests, setDerivedLevel, setDisplayName, setModelErrorHandler, setPersistent, setSource, sortContainedObjects, toplevel, toString, validateSettables, workspace
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
createReceivers, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, newReceiver, outputPortList
isFireFunctional, isStrict, iterate, prefire, stop, stopFire, terminate
addInitializable, preinitialize, removeInitializable, wrapup
description, getContainer, getDisplayName, getFullName, getName, getName, setName
getDerivedLevel, getDerivedList, propagateValue
public Parameter polynomialArray
public Parameter initialState
public Parameter uncodedRate
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.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 TypedAtomicActor
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<TypedIOPort>
IllegalActionException
- Not thrown in this base class.public void initialize() throws IllegalActionException
initialize
in interface Initializable
initialize
in class AtomicActor<TypedIOPort>
IllegalActionException
- If the parent class throws it.public boolean postfire() throws IllegalActionException
postfire
in interface Executable
postfire
in class AtomicActor<TypedIOPort>
IllegalActionException
- If the base class throws it