Skip to content

komm.BinarySymmetricChannel

Binary symmetric channel (BSC). It is a discrete memoryless channel with input and output alphabets $\mathcal{X} = \mathcal{Y} = \{ 0, 1 \}$. The channel is characterized by a parameter $p$, called the crossover probability. With probability $1 - p$, the output symbol is identical to the input symbol, and with probability $p$, the output symbol is flipped. Equivalently, the channel can be modeled as $$ Y_n = X_n + Z_n, $$ where $Z_n$ are iid Bernoulli random variables with $\Pr[Z_n = 1] = p$. For more details, see CT06, Sec. 7.1.4.

Attributes:

  • crossover_probability (Optional[float])

    The channel crossover probability $p$. Must satisfy $0 \leq p \leq 1$. The default value is 0.0, which corresponds to a noiseless channel.

Input:

  • input_sequence (Array1D[int])

    The input sequence.

Output:

  • output_sequence (Array1D[int])

    The output sequence.

Examples:

>>> np.random.seed(1)
>>> bsc = komm.BinarySymmetricChannel(0.1)
>>> bsc([0, 1, 1, 1, 0, 0, 0, 0, 0, 1])
array([0, 1, 0, 1, 0, 1, 0, 0, 0, 1])

transition_matrix: npt.NDArray[np.float64] property

The transition probability matrix of the channel. It is given by $$ p_{Y \mid X} = \begin{bmatrix} 1-p & p \\ p & 1-p \end{bmatrix}. $$

Examples:

>>> bsc = komm.BinarySymmetricChannel(0.1)
>>> bsc.transition_matrix
array([[0.9, 0.1],
       [0.1, 0.9]])

mutual_information

Returns the mutual information $\mathrm{I}(X ; Y)$ between the input $X$ and the output $Y$ of the channel. It is given by $$ \mathrm{I}(X ; Y) = \Hb(p + \pi - 2 p \pi) - \Hb(p), $$ in bits, where $\pi = \Pr[X = 1]$, and $\Hb$ is the binary entropy function.

Parameters:

Same as the corresponding method of the general class.

Examples:

>>> bsc = komm.BinarySymmetricChannel(0.1)
>>> bsc.mutual_information([0.45, 0.55])
np.float64(0.5263828452309445)

capacity

Returns the channel capacity $C$. It is given by $$ C = 1 - \Hb(p), $$ in bits, where $\Hb$ is the binary entropy function.

Examples:

>>> bsc = komm.BinarySymmetricChannel(0.1)
>>> bsc.capacity()
np.float64(0.5310044064107188)