Fit curve to nonsmooth empirical bit error rate (BER) data
fitber = berfit(empEbNo,empber)
fitber = berfit(empEbNo,empber,fitEbNo)
fitber = berfit(empEbNo,empber,fitEbNo,options)
fitber = berfit(empEbNo,empber,fitEbNo,options,fittype
)
[fitber,fitprops] = berfit(...)
berfit(...)
berfit(empEbNo,empber,fitEbNo,options,'all'
)
fitber = berfit(empEbNo,empber)
fits a
curve to the empirical BER data in the vector empber
and
returns a vector of fitted bit error rate (BER) points. The values
in empber
and fitber
correspond
to the E_{b}/N_{0} values,
in dB, given by empEbNo
. The vector empEbNo
must
be in ascending order and must have at least four elements.
Note:
The |
fitber = berfit(empEbNo,empber,fitEbNo)
fits
a curve to the empirical BER data in the vector empber
corresponding
to the E_{b}/N_{0} values,
in dB, given by empEbNo
. The function then evaluates
the curve at the E_{b}/N_{0} values,
in dB, given by fitEbNo
and returns the fitted
BER points. The length of fitEbNo
must equal or
exceed that of empEbNo
.
fitber = berfit(empEbNo,empber,fitEbNo,options)
uses
the structure options
to override the default options
used for optimization. These options are the ones used by the fminsearch
function.
You can create the options
structure using the optimset
function.
Particularly relevant fields are described in the table below.
Field | Description |
---|---|
options.Display | Level of display: 'off' (default)
displays no output; 'iter' displays output at
each iteration; 'final' displays only the final
output; 'notify' displays output only if the
function does not converge. |
options.MaxFunEvals | Maximum number of function evaluations before optimization ceases. The default is 10^{4}. |
options.MaxIter | Maximum number of iterations before optimization ceases. The default is 10^{4}. |
options.TolFun | Termination tolerance on the closed-form function used to generate the fit. The default is 10^{-4}. |
options.TolX | Termination tolerance on the coefficient values of the closed-form function used to generate the fit. The default is 10^{-4}. |
fitber = berfit(empEbNo,empber,fitEbNo,options,
specifies
which closed-form function fittype
)berfit
uses to fit
the empirical data, from the possible fits listed in Algorithms below. fittype
can
be 'exp'
, 'exp+const'
, 'polyRatio'
,
or 'doubleExp+const'
. To avoid overriding default
optimization options, use options = []
.
[fitber,fitprops] = berfit(...)
returns
the MATLAB structure fitprops
, which describes
the results of the curve fit. Its fields are described in the table
below.
Field | Description |
---|---|
fitprops.fitType | The closed-form function
type used to generate the fit: 'exp' , 'exp+const' , 'polyRatio' ,
or 'doubleExp+const' . |
fitprops.coeffs | The coefficients used to
generate the fit. If the function cannot find a valid fit, fitprops.coeffs is
an empty vector. |
fitprops.sumSqErr | The sum squared error between the log of the fitted BER points and the log of the empirical BER points. |
fitprops.exitState | The exit condition of berfit : 'The
curve fit converged to a solution.' , 'The maximum
number of function evaluations was exceeded.' , or 'No
desirable fit was found' . |
fitprops.funcCount | The number of function evaluations used in minimizing the sum squared error function. |
fitprops.iterations | The number of iterations taken in minimizing the sum squared error function. This is not necessarily equal to the number of function evaluations. |
berfit(...)
plots the
empirical and fitted BER data.
berfit(empEbNo,empber,fitEbNo,options,
plots
the empirical and fitted BER data from all the possible fits, listed
in the Algorithms below, that
return a valid fit. To avoid overriding default options, use 'all'
)options
= []
.
Note: A valid fit must be
If a fit does not confirm to this criteria, it is rejected. |
The examples below illustrate the syntax of the function, but they use hard-coded or theoretical BER data for simplicity. For an example that uses empirical BER data from a simulation, see Example: Curve Fitting for an Error Rate Plot.
The code below plots the best fit for a sample set of data.
EbNo = 0:13;
berdata = [.2 .15 .13 .12 .08 .09 .08 .07 .06 .04 .03 .02 .01 .004];
berfit(EbNo,berdata); % Plot the best fit.
The curve connects the points created by evaluating the fit
expression at the values in EbNo
. To make the curve
look smoother, use a syntax like berfit(EbNo,berdata,[0:0.2:13])
.
This alternative syntax uses more points when plotting the curve,
but it does not change the fit expression.
The next example demonstrates a fit for a BER curve with an
error floor. We generate the empirical BER array by simulating a channel
with a null (ch = [0.5 0.47]
) with BPSK modulation
and linear MMSE equalizer at the receiver. We run the berfit with
the 'all'
option. The 'doubleExp+const'
fit
does not provide a valid fit, and the 'exp'
fit
type does not work well for this data. The 'exp+const'
and 'polyRatio'
fits
closely match the simulated data.
EbNo = -10:3:15;
empBER = [0.3361 0.3076 0.2470 0.1878 0.1212 0.0845 0.0650 0.0540 0.0474];
figure; berfit(EbNo, empBER, [], [], 'all');
The following code illustrates the use of the options
input
structure as well as the fitprops
output structure.
The 'notify'
value for the display level causes
the function to produce output when one of the attempted fits does
not converge. The exitState
field of the output
structure also indicates which fit converges and which fit does not.
M = 8; EbNo = 3:10; berdata = berfading(EbNo,'psk',M,2); % Compute theoretical BER. noisydata = berdata.*[.93 .92 1 .59 .08 .15 .01 .01]; % Say when fit fails to converge. options = optimset('display','notify'); disp('*** Trying exponential fit.') % Poor fit [fitber1,fitprops1] = berfit(EbNo,noisydata,EbNo,... options,'exp') disp('*** Trying polynomial ratio fit.') % Good fit [fitber2,fitprops2] = berfit(EbNo,noisydata,EbNo,... options,'polyRatio')
The berfit
function fits the BER data using
unconstrained nonlinear optimization via the fminsearch
function.
The closed-form functions that berfit
considers
are listed in the table below, where x is the E_{b}/N_{0} in
linear terms (not dB) and f is
the estimated BER. These functions were empirically found to provide
close fits in a wide variety of situations, including exponentially
decaying BERs, linearly varying BERs, and BER curves with error rate
floors.
Value
of fittype | Functional Expression |
---|---|
'exp' | $$f(x)={a}_{1}\mathrm{exp}\left[\frac{-{\left(x-{a}_{2}\right)}^{{a}_{3}}}{{a}_{4}}\right]$$ |
'exp+const' | $$f(x)={a}_{1}\mathrm{exp}\left[\frac{-{(x-{a}_{2})}^{{a}_{3}}}{{a}_{4}}\right]+{a}_{5}$$ |
'polyRatio' | $$f(x)={\scriptscriptstyle \frac{{a}_{1}{x}^{2}+{a}_{2}x+{a}_{3}}{{x}^{3}+{a}_{4}{x}^{2}+{a}_{5}x+{a}_{6}}}$$ |
'doubleExp+const' | $$\begin{array}{l}{a}_{1}\mathrm{exp}\left[\frac{-{\left(x-{a}_{2}\right)}^{{a}_{3}}}{{a}_{4}}\right]\\ \begin{array}{cc}& \end{array}+{a}_{5}\mathrm{exp}\left[\frac{-{\left(x-{a}_{6}\right)}^{{a}_{7}}}{{a}_{8}}\right]+{a}_{9}\end{array}$$ |
The sum squared error function that fminsearch
attempts
to minimize is
$$F={\displaystyle \sum {[\mathrm{log}(\text{empiricalBER})-\mathrm{log}(\text{fittedBER})]}^{2}}$$
where the fitted BER points are the
values in fitber
and the sum is over the E_{b}/N_{0} points
given in empEbNo
. It is important to use the log
of the BER values rather than the BER values themselves so that the
high-BER regions do not dominate the objective function inappropriately.
For a general description of unconstrained nonlinear optimization, see the following work.
[1] Chapra, Steven C., and Raymond P. Canale, Numerical Methods for Engineers, Fourth Edition, New York, McGraw-Hill, 2002.