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
(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_cardinality: int
property
The channel input cardinality $|\mathcal{X}|$.
For the BSC, it is given by $|\mathcal{X}| = 2$.
output_cardinality: int
property
The channel output cardinality $|\mathcal{Y}|$.
For the BSC, it is given by $|\mathcal{Y}| = 2$.
transition_matrix: npt.NDArray[np.floating]
property
The channel transition probability matrix $p_{Y \mid X}$.
For the BSC, it is given by $$ p_{Y \mid X} = \begin{bmatrix} 1-p & p \\ p & 1-p \end{bmatrix}. $$
Examples:
>>> bsc = komm.BinarySymmetricChannel(0.2)
>>> bsc.transition_matrix
array([[0.8, 0.2],
[0.2, 0.8]])
mutual_information
Returns the mutual information $\mathrm{I}(X ; Y)$ between the input $X$ and the output $Y$ of the channel.
Parameters:
-
input_pmf
(ArrayLike
) –The probability mass function $p_X$ of the channel input $X$. It must be a valid pmf, that is, all of its values must be non-negative and sum up to $1$.
-
base
(LogBase
) –The base of the logarithm to be used. It must be a positive float or the string
'e'
. The default value is2.0
.
Returns:
-
float
–The mutual information $\mathrm{I}(X ; Y)$ between the input $X$ and the output $Y$.
For the BSC, 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.
Examples:
>>> bsc = komm.BinarySymmetricChannel(0.2)
>>> bsc.mutual_information([0.45, 0.55])
np.float64(0.2754734936803773)
capacity
Returns the channel capacity $C$.
Parameters:
-
base
(LogBase
) –The base of the logarithm to be used. It must be a positive float or the string
'e'
. The default value is2.0
.
Returns:
-
float
–The channel capacity $C$.
For the BSC, it is given by $$ C = 1 - \Hb(p), $$ in bits, where $\Hb$ is the binary entropy function.
Examples:
>>> bsc = komm.BinarySymmetricChannel(0.2)
>>> bsc.capacity()
np.float64(0.2780719051126377)
__call__
Transmits the input sequence through the channel and returns the output sequence.
Parameters:
-
input
(ArrayLike
) –The input sequence.
Returns:
-
output
(NDArray[integer]
) –The output sequence.
Examples:
>>> rng = np.random.default_rng(seed=42)
>>> bsc = komm.BinarySymmetricChannel(0.2, rng=rng)
>>> bsc([1, 1, 1, 0, 0, 0, 1, 0, 1, 0])
array([1, 1, 1, 0, 1, 0, 1, 0, 0, 0])