# comm.BCHDecoder

Decode data using BCH decoder

## Description

The `BCHDecoder` object recovers a binary message vector from a binary BCH codeword vector. For proper decoding, the codeword and message length values in this object must match the properties in the corresponding `comm.BCHEncoder` System object™.

To decode a binary message from a BCH codeword:

1. Define and set up your BCH decoder object. See Construction.

2. Call `step` to recover a binary message vector from a binary BCH codeword vector according to the properties of `comm.BCHDecoder`. The behavior of `step` is specific to each object in the toolbox.

### Note

Starting in R2016b, instead of using the `step` method to perform the operation defined by the System object, you can call the object with arguments, as if it were a function. For example, ```y = step(obj,x)``` and `y = obj(x)` perform equivalent operations.

## Construction

`dec = comm.BCHDecoder` creates a BCH decoder System object, `dec`, that performs BCH decoding.

`dec = comm.BCHDecoder(N,K)` creates a BCH decoder object, `dec`, with the `CodewordLength` property set to `N` and the `MessageLength` property set to `K`.

`dec = comm.BCHDecoder(N,K,GP)` creates a BCH decoder object, `dec`, with the `CodewordLength` property set to `N`, the `MessageLength` property set to `K`, and the `GeneratorPolynomial` property set to `GP`.

`dec = comm.BCHDecoder(N,K,GP,S)` creates a BCH decoder object, `dec`, with the `CodewordLength` property set to `N`, the `MessageLength` property set to `K`, the `GeneratorPolynomial` property set to `GP`, and the `ShortMessageLength` property set to `S`.

`dec = comm.BCHDecoder(N,K,GP,S,Name,Value)` creates a BCH decoder object, `dec`, with the `CodewordLength` property set to `N`, the `MessageLength` property set to `K`, the `GeneratorPolynomial` property set to `GP`, the `ShortMessageLength` property set to `S`, and each specified property `Name` set to the specified `Value`.

`dec = comm.BCHDecoder(Name,Value)` creates a BCH decoder object, `dec`, with each specified property set to the specified value. You can specify additional name-value pair arguments in any order as (`Name1`,`Value1`,...,`NameN`,`ValueN`).

## Properties

 `CodewordLength` Codeword length Specify the codeword length of the BCH code as a double-precision positive integer scalar. The default is `15`. The values of the `CodewordLength` and `MessageLength` properties must produce a valid narrow-sense BCH code. For a full-length BCH code, the value of this property must take the form ${2}^{M}-1$, where M is an integer such that $3\le M\le 16$. The default is `15`. `MessageLength` Message length Specify the message length as a double-precision positive integer scalar. The values of the `CodewordLength` and `MessageLength` properties must produce a valid narrow-sense BCH code. The default is `5`. `ShortMessageLengthSource` Short message length source Specify the source of the shortened message as either `Auto` or `Property`. When this property is set to `Auto`, the BCH code is defined by the `CodewordLength`, `MessageLength`, `GeneratorPolynomial`, and `PrimitivePolynomial` properties. When `ShortMessageLengthSource` is set to `Property`, you must specify the `ShortMessageLength` property, which is used with the other properties to define the BCH code. The default is `Auto`. `ShortMessageLength` Shortened message length Specify the length of the shortened message as a double-precision positive integer scalar whose value must be less than or equal to `MessageLength`. When `ShortMessageLength` < `MessageLength`, the BCH code is shortened. The default is `5`. `GeneratorPolynomialSource` Source of generator polynomial Specify the source of the generator polynomial as either `Auto` or `Property`. Set this property to `Auto` to create the generator polynomial automatically. Set `GeneratorPolynomialSource` to `Property` to specify a generator polynomial using the `GeneratorPolynomial`  property. The default is `Auto`. `GeneratorPolynomial` Generator polynomial Specify the generator polynomial as a binary double-precision row vector, a binary Galois field row vector that represents the coefficients of the generator polynomial in order of descending powers, or as a polynomial character vector. The length of the generator polynomial requires a value of `CodewordLength`–`MessageLength`+`1`. This property applies when you set `GeneratorPolynomialSource` to `Property`. The default is `'X^10 + X^8 + X^5 + X^4 + X^2 + X + 1'`, which is the result of `bchgenpoly``(15,5,[],'double')` and corresponds to a `15,5` code. `CheckGeneratorPolynomial` Enable generator polynomial checking Set this property to `true` to perform a generator polynomial check the first time you call the `step` method. The default is `true`. This check verifies that the specified generator polynomial is valid. For larger codes, disabling the check reduces processing time. As a best practice, perform the check at least once before setting this property to `false`. This property applies when you set `GeneratorPolynomialSource` to `Property`. The default is `true`. `PrimitivePolynomialSource` Source of primitive polynomial Specify the source of the primitive polynomial as `Auto` or `Property`. Set this property to `Auto` to create a primitive polynomial of degree M=`ceil(log2(CodewordLength+1))`. Set `PrimitivePolynomialSource` to `Property` to specify a polynomial using the `PrimitivePolynomial` property. The default is `Auto`. `PrimitivePolynomial` Primitive polynomial Specify the primitive polynomial of order M, that defines the finite Galois field GF(2). Use a double-precision, binary row vector with the coefficients of the polynomial in order of descending powers or a polynomial character vector. This property applies when you set the `PrimitivePolynomialSource` property to `Property`. The default is `'X^4 + X + 1'`, which is the result of `fliplr(de2bi(primpoly(4)))`. `PuncturePatternSource` Source of puncture pattern Specify the source of the puncture pattern as `None` or `Property`. Set this property to `None` to disable puncturing. Set it to `Property` to decode punctured codewords. This decoding is based on a puncture pattern vector you specify in the `PuncturePattern` property. The default is `None`. `PuncturePattern` Puncture pattern vector Specify the pattern that the object uses to puncture the encoded data. Use a double-precision binary column vector of length `CodewordLength`–`MessageLength`. Zeros in the puncture pattern vector indicate the position of the parity bits that the object punctures or excludes from each codeword. This property applies when you set `PuncturePatternSource` to `Property`. The default is `[ones(8,1); zeros(2,1)]`. `ErasuresInputPort` Enable erasures input Set this property to `true` to specify a vector of erasures as a `step` method input. The erasures vector is a double-precision or logical binary column vector that indicates which bits of the input codewords to erase or ignore. Values of `1` in the erasures vector correspond to erased bits in the same position of the (possibly punctured) input codewords. Set this property to `false` to disable erasures. The default is `false`. `NumCorrectedErrorsOutputPort` Output number of corrected errors Set this property to `true` so that the `step` method outputs the number of corrected errors. The default is `true`.

## Input and Output Signal Lengths in BCH and RS System Objects

The notation `y = c * x` denotes that `y` is an integer multiple of `x`.

The number of punctures equals the number of zeros in the puncture vector.

M is the degree of the primitive polynomial. Each group of M bits represents an integer between `0` and `2M–1` that belongs to the finite Galois field `GF(2M)`.

ShortMessageLengthSource

`comm.BCHEncoder`

```comm.RSEncoder (BitInput = false)```

`comm.BCHDecoder`

```comm.RSDecoder (BitInput = false)```

```comm.RSEncoder (BitInput = true)```

```comm.RSDecoder (BitInput = true)```

Auto

`Input Length:`

```c * MessageLength```

```Output Length:```

```c * ( CodewordLength – number of punctures) ```

`Input Length: `

```c * (CodewordLength – number of punctures) ```

`Output Length: `

```c * MessageLength```

```Erasures Length: ```

```c * ( CodewordLength – number of punctures)```

`Input Length:`

```c * (MessageLength * M)```

```Output Length:```

```c * (( CodewordLength – number of punctures) * M)```

`Input Length: `

```c * ( (CodewordLength – number of punctures) * M)```

`Output Length:`

```c * (MessageLength * M)```

```Erasures Length: ```

c * (CodewordLength – number of punctures)

Property

`Input Length: `

```c * ShortMessageLength```

```Output Length:```

```c * (CodewordLength - MessageLength + ShortMessageLength - number of punctures)```

`Input Length: `

```c * (CodewordLength - MessageLength + ShortMessageLength - number of punctures)```

```Output Length:```

`c * ShortMessageLength`

`Erasures Length:`

```c * (CodewordLength - MessageLength + ShortMessageLength - number of punctures)```

`Input Length: `

```c * (ShortMessageLength * M)```

```Output Length:```

```c * ( (CodewordLength - MessageLength + ShortMessageLength - number of punctures) * M)```

`Input Length: `

```c * ((CodewordLength - MessageLength + ShortMessageLength - number of punctures) * M)```

```Output Length:```

```c * (ShortMessageLength * M)```

```Erasures Length:```

```c * (CodewordLength - MessageLength + ShortMessageLength - number of punctures) ```

## Methods

 step Decode data using a BCH decoder
Common to All System Objects
`release`

Allow System object property value changes

## Examples

collapse all

```% The following code transmits a BCH-encoded, 8-DPSK-modulated bit stream % through an AWGN channel. Then, the example demodulates, decodes, and counts errors. enc = comm.BCHEncoder; mod = comm.DPSKModulator('BitInput',true); chan = comm.AWGNChannel(... 'NoiseMethod','Signal to noise ratio (SNR)','SNR',10); demod = comm.DPSKDemodulator('BitOutput',true); dec = comm.BCHDecoder; errorRate = comm.ErrorRate('ComputationDelay',3); for counter = 1:20 data = randi([0 1], 30, 1); encodedData = step(enc, data); modSignal = step(mod, encodedData); receivedSignal = step(chan, modSignal); demodSignal = step(demod, receivedSignal); receivedBits = step(dec, demodSignal); errorStats = step(errorRate, data, receivedBits); end fprintf('Error rate = %f\nNumber of errors = %d\n', ... errorStats(1), errorStats(2))```
```Error rate = 0.015075 Number of errors = 9 ```

Transmit and receive a BPSK-modulated signal encoded with a shortened BCH code, then count errors.

Specify the codeword, message, and shortened message lengths.

```N = 255; K = 239; S = 63;```

Create a BCH (255,239) generator polynomial. Use the generator polynomial to create a BCH encoder and decoder pair. The BCH code is based on the AMR standard.

```gp = bchgenpoly(255,239); bchEncoder = comm.BCHEncoder(N,K,gp,S); bchDecoder = comm.BCHDecoder(N,K,gp,S);```

Create an error rate counter.

`errorRate = comm.ErrorRate('ComputationDelay',3);`

Main processing loop.

```for counter = 1:20 data = randi([0 1],630,1); % Generate binary data encodedData = bchEncoder(data); % BCH encode data modSignal = pskmod(encodedData,2); % BPSK modulate receivedSignal = awgn(modSignal,5); % Pass through AWGN channel demodSignal = pskdemod(receivedSignal,2); % BSPK demodulate receivedBits = bchDecoder(demodSignal); % BCH decode data errorStats = errorRate(data,receivedBits); % Compute error statistics end```

Display the error statistics.

```fprintf('Error rate = %f\nNumber of errors = %d\n', ... errorStats(1), errorStats(2))```
```Error rate = 0.000318 Number of errors = 4 ```

Shorten a (31,26) BCH code to an (11,6) BCH code and use it to encode and decode random binary data.

Create a BCH encoder and decoder pair for a (31,26) code. Specify the generator polynomial, ${x}^{5}+{x}^{2}+1$, and a shortened message length of `6`.

```enc = comm.BCHEncoder(31,26,'x5+x2+1',6); dec = comm.BCHDecoder(31,26,'x5+x2+1',6);```

Encode and decode random binary data and verify that the decoded bit stream matches the original data.

```x = randi([0 1],60,1); y = step(enc,x); z = step(dec,y); isequal(x,z)```
```ans = logical 1 ```

## Selected Bibliography

[1] Clark, George C. Jr., and J. Bibb Cain, Error-Correction Coding for Digital Communications. New York, Plenum Press, 1981.

[2] Wicker, Stephen B., Error Control Systems for Digital Communication and Storage Upper Saddle River, NJ, Prentice Hall, 1995.

## Algorithms

This object implements the algorithm, inputs, and outputs described in Algorithms for BCH and RS Errors-only Decoding.