| Theoretical | R Documentation |
Functions to calculate the theoretical performance of common modulation
formats. Includes the functions dB (x) (returns 10log10(x)), undB(x)
(reverses dB(x)), Q_( x) (Markum's Q function), and Q_Inv(x)
(returns the
SNR in Decibels to get probability x). Also includes mod_Inv, which returns
the SNR required for a the function f to reach the supplied BER (bit
error rate, or bit error probability).
is.wholenumber(x, tol = sqrt(.Machine$double.eps)) dB(x) undB(x) Q_(x) Q_Inv(perr) QPSKdB(x) DQPSKdB(x) DQPSKDDdB(x) PSQPSKdB(x) MPSKdB(x, M) MPSKdB.8(x) QAMdB.8.star(x) QAMdB(x, M) QAMdB.16(x) mod_Inv(f, perr, guess = Q_Inv(perr)) mod_InvV(f, pv, offset = 0)
x |
a real number |
tol |
the tolerance to test x with. |
perr |
a probability of a bit error. |
M |
The integer number of symbols > 4. |
f |
a function (usually a BER function). |
guess |
a guess for the |
pv |
a vector of BERs. |
offset |
an offset in Decibels for guesses in |
The rest of the functions return the probability of a bit error given the SNR in Decibels.
QPSKdB is Quadrature Phase shift keyed: two bits per symbol.
DQPSK is differentially detected differentially coded QPSK.
DQPSKDDdB is differentially detected differential QPSK (coherently
detected but differentially decoded. See DQPSK above.
PSQPSKdB is polarization-shifted QPSK: it is dual pole, but only
one pole is active at any one time, thus supplying three bits per
symbol. (See Agrell & Karlsson (2009, DOI:10.1109/JLT.2009.2029064)).
MPSKdB(x, M) is generic M-ary phase shift keying of M points in a circle.
MPSKdB.8 simply returns MPSKdB(x, 8)
QAMdB.8.star is the optimal star configuration of 8-ary Quadrature
Amplitude Modulation (QAM), such that
the legs are at \pm1 and \pm(1+√3).
QAMdB(x, M) is generic rectangular QAM constellation of M points.
QAMdB.16 Returns the BER for the rectangular QAM constellation according to
Proakis Eq. 5-2-80.
mod_Inv will take a function f(x) and return the x such that
f(x)==perr
but it does this based on the log( f(x)) and the log( perr), so
f(x)>0.
mod_InvV is a vectorized version (give it a vector of BERs and it returns a
vector of SNRs).
is.wholenumber(x) returns TRUE if c-round(x) < tol.
dB(x) returns 10*log10(x)
undB(x) returns 10^(x/10)
Q_Inv(x) returns 2*dB( -qnorm(x)), which is the
SNR (in Decibels) required to get a probability of error of x.
Q_Inv( Q_( undB( x/2))) = x and Q_( undB( Q_Inv( x)/2))=x
mod_Inv( f, x) returns a list with the SNR in Decibels to
reach the BER
perr such that f( mod_Inv( f, x)$x) = x.
The returned list has elements
$x as the SNR and
$fval as the function value.
pracma::fzero()
dB( 10) # == 10 undB( 20) # == 100 Q_Inv( Q_( undB( 10/2))) # = 10 Q_( undB( Q_Inv( 0.001)/2)) # = 0.001 mod_Inv( QPSKdB, QPSKdB( 7)) # yields 7 mod_InvV(QPSKdB, QPSKdB(c(6,7)))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.