Intro. to Signal Processing:Curve fitting

Intro. to Signal Processing:Curve fitting
[Introduction

[Signal

arithmetic]  [Signals

and noise]   [Smoothing]
  [Differentiation

[Peak

Sharpening]  [Harmonic

analysis]   [Fourier

convolution]  [Fourier

deconvolution]  [Fourier

filter]   [Peak

area measurement]  [Linear

Least Squares]  [Multicomponent

Spectroscopy]  [Iterative

Curve Fitting]  [Hyperlinear

quantitative absorption spectrophotometry] [Appendix

and Case Studies]  [Peak

Finding and Measurement]  [iPeak]  

[iSignal

[Peak

Fitters]   [iFilter

[iPower

[List

of downloadable software]  [Interactive

tools]

index previous next

Curve fitting A: Linear Least Squares

  The objective of curve fitting is to find the parameters of a
mathematical model that describes a set of (usually noisy) data in a
way that minimizes the difference between the model and the data.
The most common approach is the “linear least squares” method, also
called “polynomial least squares”, a well-known mathematical
procedure for finding the coefficients of polynomial
equations that are a “best fit” to a set of X,Y data. A polynomial
equation expresses the dependent variable Y as a weighted sum of a
series of single-valued functions of the independent variable X,
most commonly as a straight line (Y = a + bX, where
a is the intercept and b is the slope),

or a quadratic (Y = a + bX + cX2), or a cubic (Y = a + bX
+ cX2 + dX3), or higher-order polynomial. Those
coefficients (a, b, c, etc) can be used to
predict values of Y for each X. In all these cases, Y is a linear function of the
parameters a, b, c, and/or d. This is why we call it a “linear” least-squares fit, not because the plot of X vs Y
is linear
. Only

for the first-order polynomial Y = a + bX is
the plot of X vs Y linear. And if the model can not be
described by a weighted sum of a series of single-valued functions,
then a different, more computationally laborious, “non-linear”
least-squares method may be used, which will be discussed in a later section.

   “Best fit” simply means that the differences between
the actual measured Y values and the Y values predicted by the model
equation are minimized. It does not mean a
“perfect” fit; in most cases, a least-squares best fit does not
go through all the points
in the data set. Above all, a
least-squares fit must conform to the selected model – for
example, a straight line or a quadratic parabola – and there will
almost always be some data points that do not fall exactly on the
best-fit line, either because of random error in the data or because
the model is not capable of describing the data exactly. It’s not
correct to say “fit data to …” a straight line or to some other
model; it’s actually the other way around: you are fitting a model

to the data. The data are not being modified in
any way; it is the model that is being adjusted to fit the
data.

Least-squares best fits can be calculated by some hand-held
calculators, spreadsheets, and dedicated computer programs (see Math Details below). Although it is
possible to estimate the best-fit straight line by visual estimation
and a straightedge, the least-square method is more objective and
easier to automate. (If you were to give a plot of X,Y data to five
different people and ask them to estimate the best-fit line
visually, you’d get five slightly different answers, but if you gave
the data set to five different computer programs, you’d get the
exact same answer every time).

Here’s a very simple example: the historical prices of different
sizes of SD memory cards advertised in the February 19, 2012, issue
of the New York Times

(Yes, I know, the prices are much lower now, but these were really
the prices back in 2012).

Memory Capacity
in GBytes
Price in US dollars
2 $9.99
4 $10.99
8 $19.99
16 $29.99

What’s the
relationship between memory capacity and cost? Of course, we expect
that the larger-capacity cards should cost more than the
smaller-capacity ones, and if we plot cost vs capacity (graph on the
right), we can see a rough straight-line relationship. A
least-squares algorithm can compute the values of a
(intercept) and b (slope) of the straight line that is a
“best fit” to the data points. Using a linear least-squares
calculation, where X = capacity
and Y = cost, the
straight-line mathematical equation that most simply describes these
data (rounding to the nearest penny) is:

Cost

= $6.56 + Capacity * $1.49

So, $1.49 is the slope and
$6.56 is the intercept.  (The equation
is plotted as the solid line that passes among the data points in
the figure). Basically, this is saying that the cost of a memory
card consists of a fixed cost of $6.56 plus $1.49 for each
Gbyte of capacity. How can we interpret this? The $6.56
represents the costs that are the same regardless of the memory
capacity: a reasonable guess is that it includes things like
packaging (the different cards are the same physical size and are
packaged the same way), shipping, marketing, advertising, and retail
shop shelf space. The $1.49 (actually 1.49 dollars/Gbyte) represents
the increasing retail price of the larger chips inside the larger
capacity cards, which have more value for the consumer and
also probably cost more to make because they use more silicon,
are more complex, and have a higher chip-testing rejection rate in
the production line. So in this case the slope and intercept have
real physical and economic meanings.  

What can we do with this information?  First, we can see how
closely the actual prices conform to this equation: pretty well but not perfectly. The line of
the equation passes among
the data points but does not go exactly through each one. That’s because actual retail
prices are also influenced by several factors that are unpredictable
and random: local competition, supply, demand, and even rounding to
the nearest “neat” number; all those factors constitute the “noise” in these data.  The
least squares procedure also calculates R2,
called the coefficient of
determination
or the correlation

coefficient, which is an indicator of the “goodness of
fit”. R2 is exactly 1.0000
when the fit is perfect, less than that when the fit is imperfect.
The closer to 1.0000 the better. An R2
value of 0.99 means a fairly good fit; 0.999 is a very good fit.
 

The second way we can use these data is to predict the likely prices
of other card capacities, if they were available, by putting in the
memory capacity into the equation and evaluating the cost. For
example, a 12 Gbyte card would be expected to cost $24.44 according
to this model. And a 32 Gbyte card would be predicted to cost
$54.29, but that would be predicting beyond
the range of the available data

it’s called “
extrapolation”– and it’s very risky
because you don’t really know what other factors may
influence the data beyond the last data point. (Y
ou
could

also solve the equation for capacity as a function of cost and use
it to predict how much capacity could be expected to be bought for a
given amount of money, if such a product were available).  

Here’s
another related example: the historical prices of standard high
definition (not UHD) flat-screen LCD TVs as a function
of screen size, as advertised on the Web in the Spring of 2012.
The prices of five selected models, similar except for screen
size
, are plotted against the screen size in inches in the
figure on the left, and are fit to a first-order (straight-line)
model. As for the previous example, the fit is not perfect. The
equation of the best-fit model is shown at the top of the graph,
along with the R2 value
(0.9549) indicating that the fit is not very good. And you can see
from the best-fit line that a 40 inch set would be predicted to have
a negative cost! They would pay you to take these
sets?  I don’t think so. Clearly something is wrong here.

The goodness of fit is shown even more clearly in the little graph
at the bottom of the figure, with the red dots. This shows the
“residuals”, the differences between each data point and the
least-squares fit at that point. You can see that the deviations
from zero are fairly large (±10%), but more important, they are not completely random;
they form a clearly visible U-shaped curve. This is a
tip-off that the straight-line model we have used here may not be
ideal and that we might get a better fit with another model. (Or it
might be just chance: the first and last points might be
higher than expected because those were unusually expensive TVs for
those sizes. How would you really know unless your data collection
was very careful?).

Least-squares calculations can fit not only straight-line data, but
any set of data that can be described by a polynomial,
for example a second-order (quadratic) equation (Y = a + bX
+ cX2).  Applying a
second-order fit to these data, we get the graph on the right. Now
the R2 value is higher,
0.9985, indicating that the fit is better (but again not perfect),
and also the residuals (the red dots at the bottom) are smaller and
more random. This shouldn’t really be a surprise, because the size
of a TV screen is always quoted as the length of the diagonal, from one corner of the
screen to its opposite corner, but the quantity of material, the
difficulty of manufacture, the weight, and the power supply
requirements of the screen should all scale with the screen area. Area is proportional to
the square of the linear measure, so the inclusion of an X2
term in the model is quite reasonable in
this case. With this fit, the 40 inch set would be predicted to cost
under $500, which is more sensible than the linear fit. (The actual
interpretation of the meaning of the best-fit coefficients a, b, and c
is, however, impossible unless we know much more about the
manufacture and marketing of TVs). The least-squares procedure
allows us to model the data with a more-or-less simple polynomial
equation. The point here is that a quadratic model is justified not
just because it fits the data better, but in this case because it is
expected in principal on the basis of the relationship
between length and area. (Incidentally, as you might expect, prices
have dropped considerably since 2012; in 2015, a 65″ flat-screen
HDTV set was available at Costco for under $900).

In general, fitting any set of
data with a higher order polynomial, like a quadratic, cubic or
higher, will reduce the fitting error and make the R2 values closer
to 1.000, because a higher order model has more variable
coefficients to adjust to the data. For example, we could fit the SD
card price data to a
quadratic,
but there is no reason to do so and the fit would only be slightly
better. The danger is that you could be “fitting the noise”, that
is, adjusting to the random noise in that particular data
set, whereas another measurement with different random
noise might give markedly different results. In fact, if you use a
polynomial order that is one less that the number of data points,
the fit will be perfect and R2=1.000. For example, the SD card data
have only 4 data points, and if you fit those data to a 3rd
order (cubic) polynomial, you’ll get a mathematically perfect fit, but one that makes no
sense in the real world (the price turns back down above x=14
Gbytes). It’s really meaningless and misleading – any 4-point

data would have fit a cubic model perfectly, even pure random noise.
The only justification for using a higher order polynomial is if you
have reason to believe that there is a consistent non-linearity

in the data set, as in the TV price example above.

https://i2.wp.com/terpconnect.umd.edu/LinearFit.GIF?w=1170

The graph on the
left shows a third example, taken from analytical chemistry:
a straight-line calibration data set where X = concentration
and Y = instrument reading (Y = a + bX). Click to download that data. The blue
dots are the data points. They don’t all fall in a perfect
straight line because of random noise and measurement error in the
instrument readings and possibly also volumetric errors in
the concentrations of the standards (which are usually prepared in
the laboratory by diluting a stock solution). For this set of
data, the measured slope is 9.7926 and the intercept is 0.199. In
analytical chemistry, the slope of the calibration curve is often
called the “sensitivity”. The intercept indicates the instrument
reading that would be expected if the concentration were zero.
Ordinarily instruments are adjusted (“zeroed”) by the operator to
give a reading of zero for a concentration of zero, but random
noise and instrument drift can cause the intercept to be non-zero
for any particular calibration set. In this particular case, the
data are in fact computer-generated, and the “true” value of the
slope was exactly 10 and of the intercept was exactly zero before
noise was added, and the noise was added by a zero-centered
normally-distributed random-number generator. The presence of the
noise caused this particular measurement of slope to be off by
about 2%. (Had there been a larger number of points in this data
set, the calculated values of slope and intercept would almost
certainly have been better. On average, the accuracy of
measurements of slope and intercept improve with the square root of the number of points
in the data set). With this many data points, it’s mathematically

possible to use an even higher polynomial degree, up to one
less that the number of data points, but it’s not physically reasonable

in most cases; for example, you could fit a 9th
degree polynomial perfectly to these data, but the result is pretty wild. No
analytical instrument has a calibration curve that behaves like
that.

A plot
of the residuals for the calibration data (right) raises a
question. Except for the 6th data point (at a concen­tration of
0.6), the other points seem to form a rough U-shaped curve,
indicating that a quadratic equation might be a better model for
those points than a straight line. Can we reject the 6th point as
being an “outlier”, perhaps caused by a mistake in preparing that
solution standard or in reading the instrument for that point?
Discarding that point would improve

the quality of fit (R2=0.992 instead of 0.986) especially if
a quadratic fit were used
(R2=0.998). The only way to know for sure is to repeat that
standard solution preparation and calibration and see if that U
shape persists in the residuals. Many instruments do give a very
linear calibration response, while others may show a slightly
non-linear response under some circumstances (for

example). But in fact, the calibration data used for this

particular example were computer-generated to be perfectly
linear,
with normally-distributed random numbers added to
simulate noise. So actually that 6th point is really not an
outlier and the underlying data are not really curved, but you
would not know that in a real application
. It would have
been a mistake to discard that 6th point and use a quadratic fit
in this case. Moral: don’t throw out data points just because they
seem a little off, unless you have good reason, and don’t use
higher-order polynomial fits just to get better fits if the
instrument is known to give linear response under those
circumstances. Even perfectly normally-distributed random errors
can occasionally give individual deviations that are quite far
from the average and might tempt you into thinking that they are
outliers. Don’t be fooled. (Full disclosure: I obtained the
above example by “cherry-picking
from among dozens of randomly generated data sets, in order to
find one that, although actually random, seemed to have an
outlier).

Solving the calibration equation for concentration. Once
the calibration curve is established, it can be used to
determine the concentrations of unknown samples that are measured
on the same instrument, for example by solving the equation for concentration as a function of
instrument reading
. The result for the linear case is that
the concentration of the sample Cx is given by
Cx = (Sx –
intercept
)/slope, where Sx is the signal given by the
sample solution, and “
slope” and “intercept” are the results of the
least-squares fit.
If a quadratic fit is used, then you
must use the more complex “quadratic

equation” to solve for concentration, but the problem of
solving the calibration equation for concentration becomes forbiddingly

complex for higher order polynomial fits. (The concentration
and the instrument readings can be recorded in any convenient
units, as long as the same units are used for calibration and for
the measurement of unknowns).

Reliability

of  curve fitting results

How reliable are the slope, intercept and other polynomial
coefficients obtained from least-squares calculations on
experimental data? The single most important factor is the
appropriateness of the model chosen; it’s critical that the model
(e.g. linear, quadratic, gaussian, etc) be a good match to the
actual underlying shape of the data. You can do that either by
choosing a model based on the known and expected behavior of that
system (like using a linear calibration model for an instrument
that is known to give linear response under those conditions)
or by choosing a model that always gives randomly-scattered
residuals that do not exhibit a regular shape. But even with a
perfect model, the least-squares procedure applied to repetitive
sets of measurements will not give the same results every time
because of random error (noise) in the data. If you were to repeat
the entire set of measurements many times and do least-squares
calculations on each data set, the standard deviations of the
coefficients would vary directly with the standard deviation of
the noise and inversely with the square root of the number of data
points in each fit, all else being equal. The problem, obviously,
is that it is not always possible to repeat the entire set of
measurements many times. You may have only one set of measurements, and
each experiment may be very expensive to repeat. So, it would be
great if we had a short-cut method that would let us predict the standard
deviations of the coefficients from a single measurement of the signal, without
actually repeating the measurements.

Here I will describe three general ways to predict
the standard deviations of the polynomial coefficients: algebraic propagation of errors, Monte Carlo simulation, and the bootstrap sampling method.

Algebraic

Propagation of errors.
The classical way is based on the rules for
mathematical error propagation
. The propagation of errors of the
entire curve-fitting
method can be described in closed-form algebra by

breaking down the method into a series of simple differences,
sums, products, and ratios, and applying the rules for
error propagation 
to each step. The result of
this procedure for a first-order (straight line) least-squares fit
are shown in the last three lines of the set of equations in Math Details, below. Essentially, these
equations make use of the deviations from the least-squares line
(the “residuals”) to estimate the standard deviations of the slope
and intercept, based on the assumption that the noise in that
single data set is random and is representative of the
noise that would be obtained upon repeated measurements. Because these predictions are based
only on a single data set, they are good only insofar as
that data set is typical of others that might be obtained
in repeated measurements.
If your random errors happen to
be small when you acquire your data set, you’ll get a
deceptively good-looking fit, but then your estimates of
the standard deviation of the slope and intercept will be too
low, on average. If your random errors happen to be large

in that data set, you’ll get a deceptively bad-looking
fit, but then your estimates of the standard deviation will be too
high, on average. This problem becomes worse when the
number of data points is small. This is not to say that it is not
worth the trouble to calculate the predicted standard deviations
of slope and intercept, but keep in mind that these predictions
are accurate only if the number of data points is large (and only
if the noise is random and normally distributed). Beware: if the
deviations from linearity in your data set are systematic and

not random – for example, if try to fit a straight line to a smooth
curved data set
– then the estimates the standard deviations
of the slope and intercept by these last two equations will be
too high
, because they assume the deviations are caused by
random noise that varies from measurement to measurement, whereas
in fact a smooth curved data
set without random noise
will give the same slope
and intercept from measurement to measurement.  

In the application to analytical calibration, the concentration of the sample Cx
is given by
Cx = (Sx –
intercept
)/slope, where Sx is the signal given by the
sample solution. The uncertainty of all three terms contribute
to the uncertainty of Cx.
The standard deviation of Cx can be estimated from the standard
deviations of slope, intercept, and Sx using the
rules for mathematical
error propagation
. But the problem is that, in
analytical chemistry, the labor and cost of preparing and running
large numbers of standards solution often limits the number of
standards to a rather small set, by statistical standards, so
these estimates of standard deviation are often fairly rough. A
spreadsheet that performs these error-propagation calculations for
your own first-order (linear) analytical calibration data can be
downloaded from http://terpconnect.umd.edu/~toh/models/CalibrationLinear.xls).

For example, the linear calibration example just given in the
previous section, where the “true” value of the slope was 10 and
the intercept was zero, this spreadsheet (whose screen shot shown
on the right) predicts that the slope is 9.8 with a standard
deviation 0.407 (4.2%) and that the intercept is 0.197 with a
standard deviation 0.25 (128%), both well within two standard
deviations of the true values. This spreadsheet also performs the
propagation of error calculations for the calculated
concentrations of each unknown in the last two columns on the
right. In the example in this figure, the instrument readings of
the standards are taken as the unknowns, showing that the
predicted percent concentration errors range from about 5% to 19%
of the true values of those standards. (Note that the standard
deviation of the concentration is greater at high concentrations
than the standard deviation of the slope, and considerably greater
at low concentrations because of the greater influence of the
uncertainly in the intercept). For a further discussion and some
examples, see “The

Calibration Curve Method with Linear Curve Fit“. The
downloadable Matlab/Octave plotit.m
function uses the algebraic method to compute the standard
deviations of least-squares coefficients for any polynomial order.

Monte Carlo simulation. The second way of
estimating the standard deviations of the least-squares
coefficients is to perform a random-number simulation (a type of Monte
Carlo simulation
). This requires that you know (by previous
measurements) the average standard deviation of the random noise
in the data. Using a computer, you construct a model of your data
over the normal range of X and Y values (e.g. Y = intercept
+ slope*X + noise,
where noise is the noise in the data), compute the
slope and intercept of each simulated noisy data set, then repeat
that process many times (usually a few thousand) with different
sets of random noise, and finally compute the standard deviation
of all the resulting slopes and intercepts. This is ordinarily
done with normally-distributed random noise (e.g. the RANDN
function that many programming languages have). These random
number generators produce “white” noise, but other noise colors can
be derived
. If the model is good and the noise in the data
is well-characterized in terms of frequency distribution and
signal amplitude dependence, the results will be a very good
estimate of the expected standard deviations of the
least-squares coefficients. (If the noise is not constant, but
rather varies with the X or Y values, or if the noise is not white
or is not normally distributed, then that behavior must be
included in the simulation). An animated

example is shown on the right, for the case of a 100-point
straight line data set with slope=1, intercept=0, and standard
deviation of the added noise equal to 5% of the maximum value of
y. For each repeated set of simulated data, the fit coefficients
(least-squares measured slope and intercept) are slightly
different because of the noise.

Obviously this method involves programming a computer to compute
the model and is not so convenient as evaluating a
simple algebraic expression. But there are two important
advantages to this method: (1) is has great generality; it can be
applied to curve fitting methods that are too complicated for the
classical closed-form algebraic propagation-of-error calculations,
even iterative non-linear methods;
and (2) its predictions are based on the average noise in the
data, not the noise in just a single data set. For that reason, it
gives more reliable estimations, particularly when the number of
data points in each data set is small. Nevertheless, you can
not always apply this method because you don’t always know
the average standard deviation of the random noise in the
data. This type of computation is easily done in Matlab/Octave and
in spreadsheets.

You can download a MatlabOctave script that compares the Monte
Carlo simulation to the algebraic method above from http://terpconnect.umd.edu/~toh/spectrum/LinearFiMC.m.
By running this script with different sizes of data sets
(“NumPoints” in line 10), you can see that the standard deviation
predicted by the algebraic method fluctuates a lot from run to run
when NumPoints is small (e.g. 10), but the Monte Carlo predictions
are much more steady. When NumPoints is large (e.g. 1000), both
methods agree very well.  

The
Bootstrap.
The

third method is the “bootstrap”
method, a procedure that involves choosing random sub-samples
with replacement from a single data set and analyzing each sample
the same way (e.g. by a least-squares fit). Every sample is
returned to the data set after sampling, so that (a) a particular
data point from the original data set could appear multiple times
in a given sample, and (b) the number of elements in each
bootstrap sub-sample equals the number of elements in the original
data set. As a simple example, consider a data set with 10 x,y pairs
assigned the letters a
through j. The original
data set is represented as [a b
c d e f g h i j
], and some typical bootstrap sub-samples
might be [a b b d e f f h i i]
or [a a c c e f g g i j],
each bootstrap sample containing the same number of data points,
but with about a third of the data pairs skipped, a third
duplicated, and a third left alone. (This is equivalent to
weighting a third of the data pairs by a factor of 2, a third by
0, and a third unweighted). You would use a computer to generate
hundreds or thousands of bootstrap samples like that and to apply
the calculation procedure under investigation (in this case a
linear least-squares) to each set.

If there were no noise
in the data set, and if the model were properly chosen, then all
the points in the original data set and in all the bootstrap
sub-samples would fall exactly on the model line, with the result
that the least-squares results would be the same for every
sub-sample
(click to
see an animation
).

But if there is noise
in the data set, each set would give a slightly different result
(e.g. the least-squares polynomial coefficients), because
each sub-sample has a different subset of the random noise, as the
animation on the right demonstrates.

 The process is illustrated by the animation on the right,
for the same 100-point straight-line data set used above. (You can
see that the variation in the fit coefficients between sub-samples
is the same as for the Monte Carlo simulation above). The greater
the amount of random noise in the data set, the greater would be
the range of results from sample in the bootstrap set. This
enables you to estimate the uncertainty of the quantity you are
estimating, just as in the Monte-Carlo method above. The
difference is that the Monte-Carlo method is based on the
assumption that the noise is known, random, and can be accurately
simulated by a random-number generator on a computer, whereas the
bootstrap method uses the actual noise in the data set at hand,
like the algebraic method, except that it does not need
an algebraic solution of error propagation. The bootstrap
method thus shares its generality with the Monte Carlo approach,
but is limited by the assumption that the noise in that (possibly
small) single data set is representative of the noise that would
be obtained upon repeated measurements. The bootstrap method
cannot, however, correctly estimate the parameter errors resulting
from poor model selection.
The method is examined in detail in its extensive

literature. This type of bootstrap computation is easily
done in Matlab/Octave
and can also be done (with greater difficulty) in spreadsheets.

Comparison of error prediction methods.
The Matlab/Octave script TestLinearFit.m
compares all three of these methods (Monte Carlo
simulation, the algebraic method, and the bootstrap method)
for a 100-point first-order linear least-squares fit. Each method
is repeated on different data sets with the same average slope,
intercept, and random noise, then the standard deviation (SD) of
the slopes (SDslope)
and intercepts (SDint

were compiled and are tabulated below. 

NumPoints = 100  SD of
the Noise = 9.236 x-range = 30
             Simulation  
 Algebraic equation  Bootstrap method
            SDslope SDint
   SDslope SDint      SDslope SDint
Mean SD:    0.1140  4.1158   0.1133
 4.4821     0.1096  4.0203

(You can download this script from http://terpconnect.umd.edu/~toh/spectrum/TestLinearFit.m).

On average, the mean standard deviation (“Mean SD”) of the
three methods agree very well, but the algebraic and bootstrap
methods fluctuate more that the Monte Carlo simulation each time
this script is run, because they are based on the noise in one single 100-point data set,
whereas the Monte Carlo simulation reports the average of
many data sets. Of course, the algebraic method is simpler
and faster to compute than the other methods. However, an
algebraic propagation of errors solution is not always possible to
obtain, whereas the Monte Carlo and bootstrap methods do not
depend on an algebraic solution and can be applied readily to more
complicated curve-fitting situations, such as non-linear iterative least squares,
as will be seen later. 

Effect of the number of data points on least-squares fit
precision
. The spreadsheets EffectOfSampleSize.ods or

EffectOfSampleSize.xlsx,
which collect the results of many runs of TestLinearFit.m with different
numbers of data points (“NumPoints”), demonstrates that the
standard deviation of the slope and the intercept decrease if

the number of data points is increased; on average, the standard

deviations are inversely proportional to the square root of the
number of data points,
which is consistent with the
observation that the slope of a log-log plot is roughly 1/2.

These plots really dramatize the problem of small sample sizes,
but this must be balanced against the cost of obtaining more data
points. For example, in analytical chemistry calibration, a larger
number of calibration points could be obtained either by preparing
and measuring more standard solutions or by reading each of a
smaller number of standards repeatedly. The former approach
accounts for both the volumetric errors in preparing solutions and
the random noise in the instrument readings, but the labor and
cost of preparing and running large numbers of standard solutions,
and safely disposing of them afterwards, is limiting. The latter
approach is less expensive but is less reliable because it
accounts only for the random noise in the instrument readings.
Overall, it better to refine the laboratory techniques and
instrument settings to minimize error that to attempts to
compensate by taking lots of readings.

It’s very important that the
noisy signal not be smoothed
before the least-squares calculations
, because doing so
will not improve the
reliability of the least-squares results, but it will cause both
the algebraic propagation-of-errors and the bootstrap calculations
to seriously underestimate the standard deviation of the
least-squares results. You can demonstrate using the most recent
version of the script TestLinearFit.m
by setting SmoothWidth in line 10 to something higher than 1,
which will smooth the data before the least-squares calculations.
This has no significant effect on the actual standard
deviation as calculated by the Monte Carlo method, but it
does significantly reduce the predicted standard
deviation calculated by the algebraic propagation-of-errors and
(especially) the bootstrap method. For similar reasons, if the
noise is pink rather
than white
, the bootstrap error estimates will also be
low.  Conversely, if the noise is blue, as occurs in
processed signals that have been subjected to some sort of differentiation process or that
have been deconvoluted from
some blurring process, then the errors predicted by the algebraic
propagation-of-errors and the bootstrap methods will be high.
(You can prove this to yourself by running TestLinearFit.m with pink and blue
noise modes selected in lines 23 and 24). Bottom line: error
prediction works best for white noise.

Transforming non-linear relationships

In some cases a fundamentally non-linear relationship can be
transformed into a form that is amenable to polynomial curve
fitting by means of a coordinate transformation (e.g. taking the
log or the reciprocal of the data), and then least-squares method
can be applied to the resulting linear equation. For example, the
signal in the figure below is from a simulation of an exponential
decay (X=time, Y=signal intensity) that has the mathematical form
Y = a exp(bX), where a is the Y-value at
X=0 and b is the decay constant. This is a fundamentally
non-linear problem because Y is a non-linear function of the
parameter b. However, by taking the natural log of both
sides of the equation, we obtain ln(Y)=ln(a) + bX.
In this equation, Y is a linear
function of both parameters ln(a) and b, so it
can be fit by the least squares method in order to
estimate ln(a) and b, from which you get a by computing exp(ln(a)).

In this particular example, the “true” values of the
coefficients are a =1 and b = -0.9, but
random noise has been added to each data point, with a
standard deviation equal to 10% of the value of that data point,
in order to simulate a typical experimental measurement in
the laboratory. An estimate of the values of  ln(a)
and b, given only the
noisy data points, can be determined by least-squares curve
fitting of ln(Y) vs X. 

An exponential least-squares fit
(solid line) applied to a noisy data set (points) in order to
estimate the decay constant, .

The best fit equation, shown by the green solid line in the
figure, is Y =0.959 exp(- 0.905 X), that is, a
= 0.959 and b = -0.905, which are reasonably close to
the expected values of 1 and -0.9, respectively. Thus, even in the
presence of substantial random noise (10% relative standard
deviation), it is possible to get reasonable estimates of the
parameters of the underlying equation (to within about 4%). The
most important requirement is that the model be good, that is,
that the equation selected for the model accurately describes the
underlying behavior of the system (except for noise). Often that
is the most difficult aspect, because the underlying models are
not always known with certainty.  In Matlab and Octave, is
fit can be performed in a single line of code: polyfit(x,log(y),1),
which returns [b log(a)]. (In

Matlab and Octave, “log” is the natural log, “log10” is the
base-10 log). 

Another example of the linearization of an exponential
relationship is explored in in Appendix R: Signal and Noise
in the Stock Market
.

Other examples of non-linear relationships that can be linearized
by coordinate transformation include the logarithmic (Y = a
ln(bX)) and power (Y=aXb)
relationships. Methods of this type used to be very common back in
the days before computers, when fitting anything but a straight
line was difficult. It is still used today to extend the range of
functional relationships that can be handled by common linear
least-squares routines available in spreadsheets and hand-held
calculators. (The downloadable Matlab/Octave function trydatatrans.m tries eight different
simple data transformations on any given x,y data set and fits the
transformed data to a straight line or polynomial). Only a few
non-linear relationships can be handled by simple data
transformation, however. To fit any
arbitrary custom function, you may have to resort to the iterative

curve fitting method, which will be treated in Curve Fitting C.

Fitting

Gaussian and Lorentzian peaks. An

interesting example of the use of transformation to convert a
non-linear relationship into a form that is amenable to
polynomial curve fitting is the use of the natural log (ln)
transformation to convert a positive Gaussian peak, which has the
fundamental functional form exp(-x
2), into a parabola of the form -x2, which can be fit with a second order
polynomial (quadratic) function (y = 
a + bx + cx2). The equation for a Gaussian
peak is y = 
h*exp(-((x-p)./(1/(2*sqrt(ln(2)))*w)) ^2)), where h is

the peak height, p is the x-axis
location of the peak maximum, 
w is

the full width of the peak at half-maximum. The natural log of y
can

be shown to be log(h)-(4 p^2 log(2))/w^2+(8

p x log(2))/w^2-(4 x^2 log(2))/w^2,

which is a quadratic form in the independent variable x because
it is the sum of x^2, x, and constant terms. Expressing each of
the peak parameters h, p, and w in terms
of the three quadratic coefficients, a
little algebra
(courtesy of Wolfram Alpha)
will show that all three parameters of the peak (height, maximum
position, and width) can be calculated from the three quadratic
coefficients a, b,
and 
c;
it’s a classic “3 unknowns in 3 equations” problem. The peak
height is given by exp(ac*(b/(2*c))^2),

the peak position by –b/(2*c), and the peak
half-width by 2.35482/(sqrt(2)*sqrt(-c)). This is called
“Caruana’s Algorithm”; see Streamlining Digital
Signal Processing: A “Tricks of the Trade” Guidebook
, Richard G. Lyons, ed., page 298

One advantage of this type of
Gaussian curve fitting, as opposed to simple visual estimation, is
illustrated in the figure on the left. The signal is a Gaussian
peak with a true peak height of 100 units, a true peak position of
100 units, and a true half-width of 100 units, but it is sparsely
sampled only every 31 units on the x-axis. The resulting data set, shown by
the red points in the upper left, has only 6 data points on the
peak itself.  If we were to take the maximum of those 6
points (the 3rd point from the left, with x=87, y=95) as the peak
maximum, we’d get only a rough approximation to the true values of
peak position (100) and height (100).  If we were to take the
distance between the 2nd the 5th data points as the peak width,
we’d get 3*31=93, compared to the true value of 100.  

However, taking the natural
log
of the data (upper right) produces a parabola that

can be fit with a quadratic least-squares fit (shown by the blue
line in the lower left). From the three coefficients of the
quadratic fit, we can calculate much more accurate values of the
Gaussian peak parameters, shown at the bottom of the figure
(height=100.93; position=99.11; width=99.25). The plot in the
lower right shows the resulting Gaussian fit (in blue) displayed
with the original data (red points). The accuracy of those peak
parameters (about 1% in this example) is limited only by the noise
in the data.

This figure was created in Matlab (or Octave), using this script. (The Matlab/Octave
function gaussfit.m performs the
calculation for an x,y data set. You can also download a
spreadsheet that does the same calculation; it’s available in
OpenOffice Calc (Download link,
Screen shot) and Excel formats).  Note:
in order for this method to work properly, the data set must not
contain any zeros or negative points; if the signal-to-noise ratio
is very poor, it may be useful to skip those points or to
pre-smooth the data slightly to reduce this problem. Moreover, the
original Gaussian peak signal must be a single isolated peak with
a zero baseline, that is, must tend to zero far from the peak
center. In practice, this means that any non-zero baseline must be
subtracted from the data set before applying this method. (A more
general approach to fitting Gaussian peaks, which works for data
sets with zeros and negative numbers and also for data with
multiple overlapping peaks, is the non-linear

iterative curve fitting method, which will be treated
later). 

A similar method can be derived for a Lorentzian
peak, which has the fundamental form y=h/(1+((x-p)/(0.5*w))^2),

by fitting a quadratic to the reciprocal of y. As for
the Gaussian peak, all three parameters of the peak (height h,
maximum position p, and width w) can be calculated
from the three quadratic coefficients a, b, and c
of the quadratic fit: h=4*a/((4*a*c)-b^2), p=
b/(2*a),
and

w= sqrt(((4*a*c)-b^2)/a)/sqrt(a).
Just as for the Gaussian case, the data set must not contain any
zero or negative y values. The Matlab/Octave function lorentzfit.m performs the calculation
for an x,y data set, and the Calc and Excel spreadsheets LorentzianLeastSquares.ods
and LorentzianLeastSquares.xls
perform the same calculation. (By the way, a quick way to test
either of the above methods is to use this simple peak data set: x=5,
20, 35 and y=5, 10, 5, which has a height, position, and width
equal to 10, 20, and 30, respectively, for a single isolated
symmetrical peak of any shape, assuming a baseline of zero).

In order to apply the above methods to signals containing two
or more
Gaussian or Lorentzian peaks, it’s necessary to
locate all the peak maxima first, so that the proper groups of
points centered on each peak can be processed with the algorithms
just discussed. That is discussed in the section on Peak Finding and
Measurement

But there is a downside to using coordinate transformation
methods to convert non-linear relationships into simple polynomial
form, and that is that the noise is also effected by the
transformation, with the result that the propagation

of error from the original data to the final results is
often difficult to predict. For example, in the method just
described for measuring the peak height, position, and width of
Gaussian or Lorentzian peaks, the results depends not only on the
amplitude of noise in the signal, but also on how many points
across the peak are taken for fitting. In particular, as you take
more points far from the peak center, where the y-values approach
zero, the natural log of those points approaches negative infinity
as y approaches zero. The result is that the noise of those
low-magnitude points is unduly magnified and has a disproportional
effect on the curve fitting. This runs counter the usual
expectation that the quality of the parameters derived from curve
fitting improves with the square root of the number of data points
(CurveFittingC.html#Noise).
 A

reasonable compromise in this case is to take only the points
in the top half of the peak
, with Y-values down to one-half
of the peak maximum. If you do that, the error propagation
(predicted by a Monte
Carlo simulation
with constant normally-distributed random
noise) shows that the relative standard deviations of the measured
peak parameters are directly proportional to the noise in the data
and inversely
proportional to the square root of the number of data points (as
expected), but that the proportionality constants differ:

relative standard deviation of the
peak height = 1.73*noise/sqrt(N),

relative standard deviation of
the peak position = noise/sqrt(N), 

relative standard deviation of the
peak width = 3.62*noise/sqrt(N), 

where noise is the
standard deviation of the noise in the data and N in the number of data
points taken for the least-squares fit. You can see from these
results that the measurement of peak position is most precise, followed by the peak height, with the peak width being the least
precise. If one were to include points far from the peak maximum,
where the signal-to-noise ratio is very low, the results would be
poorer than predicted. These predictions depend on knowledge
of the noise in the signal; if only a single sample of that
noise is available for measurement, there is no guarantee
that sample is a representative sample, especially if the
total number of points in the measured signal is small; the
standard deviation of small samples is notoriously variable.
Moreover, these predictions are based on a simulation with constant normally-distributed white
noise; had the actual noise varied with signal level or with
x-axis value, or if the probability distribution had been
something other than normal, those predictions would not
necessarily have been accurate. In such cases the bootstrap method has the advantage that it
samples the actual noise in the signal. 

You can download the Matlab/Octave code for this Monte Carlo
simulation from http://terpconnect.umd.edu/~toh/spectrum/GaussFitMC.m;
view screen capture. A similar
simulation (http://terpconnect.umd.edu/~toh/spectrum/GaussFitMC2.m,
view screen capture) compares this
method to fitting the entire Gaussian peak with the iterative
method in Curve Fitting 3,
finding that the precision of the results are only slightly better
with the (slower) iterative method.   

Note 1: If
you are reading this online, you can right-click on any of
the m-file links above and select Save Link
As…
to download them to your computer for use within
Matlab/Octave.

Note 2: In the curve
fitting techniques described here and in the next two sections,
there is no requirement that the x-axis interval between data
points be uniform, as is the assumption in many of the other
signal processing techniques previously covered.  Curve
fitting algorithms typically accept a set of arbitrarily-spaced
x-axis values and a corresponding set of y-axis values.


Math details.

The least-squares best fit for an x,y data set can be computed
using only basic arithmetic.  Here are the relevant equations
for computing the slope and intercept of the first-order best-fit
equation, y = intercept + slope*x, as well as the predicted
standard deviation of the slope and intercept, and the coefficient
of determination, R2,
which is an indicator of the “goodness of fit”. (R2 is 1.0000 if
the fit is perfect and less than that if the fit is imperfect).

n = number of x,y data points   
sumx = Σx   
sumy = Σy   
sumxy = Σx*y   
sumx2 = Σx*x   
meanx = sumx / n   
meany = sumy / n   
slope = (n*sumxy –
sumx*sumy) / (n*sumx2 – sumx*sumx)   
intercept =
meany-(slope*meanx)   
ssy = Σ(y-meany)^2   
ssr = Σ(y-intercept-slope*x)^2   
R2 = 1-(ssr/ssy)
Standard deviation of the slope =
SQRT(ssr/(n-2))*SQRT(n/(n*sumx2 – sumx*sumx))
Standard deviation of the intercept =
SQRT(ssr/(n-2))*SQRT(sumx2/(n*sumx2 – sumx*sumx))

(In these equations, Σ represents summation; for example, Σx
means the sum of all the x values, and Σx*y means the sum of all
the x*y products, etc). 

The last two lines predict the standard deviation of the slope
and the intercept, based only on that data sample, assuming that
the deviations from the line are random and normally distributed.
These are estimates of the variability of slopes and intercepts
you are likely to get if you repeated the data measurements over
and over multiple times under the same conditions, assuming that
the deviations from the straight line are due to random
variability
and not systematic error caused by
non-linearity. If the deviations are random, they will be slightly
different from time to time, causing the slope and intercept to
vary from measurement to measurement, with a standard deviation
predicted by these last two equations. However, if the deviations
are caused by systematic non-linearity, they will be the same from
from measurement to measurement, in which case the prediction of
these last two equations will not be relevant, and you might be
better off using a.polynomial fit such as a quadratic or cubic.

The reliability of these standard deviation estimates depends on
assumption of random deviations and also on the number of data
points in the curve fit; they improve with the square root of the
number of points. A slightly more
complex set of equations
can be written to fit a
second-order (quadratic or parabolic) equations to a set of data;
instead of a slope and intercept, three coefficients are
calculated, a, b, and c, representing the
coefficients of the quadratic equation ax2+bx+c.

These calculations could be performed
step-by-step by hand, with the aid of a calculator or a
spreadsheet, with a
program
written in any programming language, such as a Matlab or Octave script.

Web sites: Wolfram
Alpha
includes some capabilities for least-squares regression

analysis, including linear, polynomial, exponential, and
logarithmic fits. Zunzun can
curve fit and surface fit 2D and 3D data online with a rich set of
error histograms, error plots, curve plots, surface plots, contour
plots, VRML, auto-generated source code, and PDF file output. Statpages.org can
perform a huge range of statistical calculations and tests, and
there are several Web sites that specialize in plotting and data
visualization that have curve-fitting capabilities, including most
notably Tableau, Plotly and Plotter. Web sites
such as these can be very handy when working from a smartphone,
tablet, or a computer that does not have suitable computational
software.


LeastSquaresSmallhttps://i1.wp.com/terpconnect.umd.edu/QuadraticLeastSquaresSmall.GIF?resize=469%2C287

Spreadsheets
can perform the math described above easily; the spreadsheets pictured above (LeastSquares.xls and LeastSquares.odt for linear
fits and (
QuadraticLeastSquares.xls and QuadraticLeastSquares.ods for quadratic fits), utilize the
expressions given above to compute and plot linear and quadratic
(parabolic) least-squares fit, respectively. The advantage of
spreadsheets is that they are highly customizable for your
particular application and can be deployed on mobile devices
such as tablets or smartphones. For straight-line fits, you can
use the convenient built-in functions slope and intercept.

The LINEST
function
. Modern s
preadsheets also have built-in
facilities for computing polynomial least-squares curve fits of any
order. For example, the LINEST function in both
Excel
and OpenOffice

Calc can be used to compute polynomial and other curvilinear
least-squares fits. In addition to the best-fit polynomial
coefficients, the LINEST function also calculates at the same time
the standard error
values, the
determination coefficient (R2), the standard error value for
the y estimate, the F statistic, the
number of degrees of freedom,
the regression sum of squares, and the residual sum of
squares. A significant inconvenience of LINEST, compared to
working out the math using the series of mathematical expressions
described above, is that it is more difficult to adjust to a
variable number of data points and to remove suspect data points
or to change the order of the polynomial. LINEST is an array
function
, which means that when you enter the formula in one
cell, multiple cells will be used for the output of the function.
You can’t edit a LINEST function just like any other
spreadsheet function.
To specify that LINEST is an array
function, do the following. Highlight the entire formula,
including the “=” sign. On the Macintosh, next, hold down the
“apple” key and press “return.” On the PC hold down the “Ctrl” and
“Shift” keys and press “Enter.” Excel adds “{ }” brackets around
the formula, to show that it is an array. Note that you cannot
type in the “{ }” characters yourself; if you do Excel will treat
the cell contents as characters and not a formula. Highlighting

the full formula and typing the “apple” key or “Ctrl”+”Shift”
and “return” is the only way to enter an array formula.
This

instruction sheet  from Colby College may help.
 Note: If you are working with a template that uses
the LINEST function, and you wish to change the number of data
points, the easiest way to do that is to select the rows or
columns containing the data, right-click on the row or column heading

(1,2,3 or a,b,c, etc). and use the Insert or Delete

in the right-click menu. If you do it that way, the LINEST
function referring to those rows or columns will be adjusted automatically.
That’s easier than trying to edit the LINEST function directly.
(If you are inserting rows or columns, you must drag-copy the
formulas from the older rows or columns into the newly inserted
empty ones). See CalibrationCubic5Points.xls
for an example.

Application to analytical calibration and measurement.

There are specific
versions of these spreadsheets
that also calculate the
concentrations of the unknowns (download complete set as CalibrationSpreadsheets.zip).

There are linear, quadratic, and cubic versions, as well versions
that perform a log-log conversion on the x and y data, apply
point-by-point weighting, and perform correction for sensor or
instrument drift. The linear

version computes the estimated standard deviations of the
slope and intercept and of the calculated concentrations of the
unknowns using the algebraic

method. One of the quadratic versions, CalibrationQuadraticB.xlsx,
computes the concentration standard deviation (column L)
and percent relative standard deviation (column M) using
the bootstrap method. In some cases, better overall results
can be obtained by weighting some calibration points more than
others, especially when the concentrations values cover a wide
range. There are weighted versions of the linear (
CalibrationLinearWeighted.xls) and quadratic (CalibrationQuadraticWeighted.xls) templates, plus a quantitative comparison

of weighted and unweighted calibrations (graphic) for a test
case where the concentrations vary over a 1000-fold range. Of

course these spreadsheets can be used for just about any
measurement calibration application; just change the labels of the
columns and axes to match your particular application. A typical
application of these spreadsheet templates to pXRF (X-ray
fluorescence) analysis is shown in this YouTube video:
https://www.youtube.com/watch?v=U3kzgVz4HgQ

There is also another set

of spreadsheets that perform Monte
Carlo simulations
of the calibration and measurement
process using several widely-used analytical calibration
methods, including first-order (straight line) and second order
(curved line) least squares fits. Typical systematic and random
errors in both signal and in volumetric measurements are
included, for the purpose of demonstrating how non-linearity,
interferences, and random errors combine to influence the final
result (the so-called “propagation of errors”).

For fitting peaks,
GaussianLeastSquares.odt,
is a
n OpenOffice
spreadsheet that fits a quadratic function to the natural log of
y(x) and computes the height, position, and width of the Gaussian
that is a best fit to y(x).
 There is also an Excel
version (GaussianLeastSquares.xls). LorentzianLeastSquares.ods
and LorentzianLeastSquares.xls fits a quadratic function to the
reciprocal of y(x) and computes the height, position, and width of
the Lorentzian that is a best fit to y(x).
Note
that for either of the peaks fits, the data may not contain zeros
or negative points, and the baseline (value that y approaches far
from the peak center) must be zero.
See Fitting Peaks, above.


SPECTRUM,
the freeware signal-processing application for Mac OS8, includes a
simple least-squares curve fitting for linear (straight-line),
polynomials of order 2 through 5, and exponential, logarithmic, and
power relationships.


Matlab and Octave have simple built-in functions for
least-squares curve fitting: polyfit and
polyval. For example, if you have a set of
x,y data points in the vectors “x” and “y”, then the coefficients
for the least-squares fit are given by coef=polyfit(x,y,n),
where “n” is the order of the polynomial fit: n = 1 for a
straight-line fit, 2 for a quadratic (parabola) fit, etc. The
polynomial coefficients ‘coef” are given in decreasing powers of x.
For a straight-line fit (n=1), coef(1) is the slope (“b”)
and coef(2) is the intercept (“a”). For a quadratic fit
(n=2), coef(1) is the x2
term (“c”), coef(2) is the x term (“b”) and coef(3)
is the constant term (“a”).

The fit equation can be evaluated using the function polyval, for example fity=polyval(coef,x).
This works for any order of polynomial fit (“n”). You can plot the
data and the fitted equation together using the plot
function: plot(x,y,'ob',x,polyval(coef,x),'-r'), which
plots the data as blue circles and the fitted equation as a red
line. You can plot the residuals by writing plot(x,y-polyval(coef,x)).

When the number of data points is small, you might notice that the
fitted curve is displayed as a series of straight-line segments,
which can look ugly. You can get a smoother plot of the fitted
equation, evaluated at more finely divided values of x, by defining
xx=linspace(min(x),max(x)); and
then using xx rather than x to evaluate and plot the fit: plot(x,y,'ob',xx,polyval(coef,xx),'-r').

[coef,S] = polyfit(x,y,n) returns
the polynomial coefficients coef and a structure

‘S’ used to obtain error estimates.
>> [coef,S]=polyfit(x,y,1)
coef =
    1.4913    6.5552
S =
        R: [2x2 double]
       df: 2
    normr: 2.2341
>> S.R
ans =
  -18.4391   -1.6270
        
0   -1.1632

The vector of standard deviations of the coefficients can

be computed from S by: sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)',
in the same order as the coefficients.

Matrix Method. Alternatively, you may perform the polynomial
least squares calculations for the row vectors x,y without

using the Matlab/Octave built-in polyfit function by using the matrix

method with the Matlab “/” symbol, meaning “right matrix
divide”.  The coefficients of a first order fit are given by y/[x;ones(size(y))]
and a second order (quadratic) fit by y/[x.^2;x;ones(size(y))]
. For higher-order polynomials, just add another row to the
denominator matrix, for example a third-order fit would be y/[x.^3;x.^2;x;ones(size(y))]
and so on. The coefficients are returned in the same order as
polyfit, in decreasing powers of x (e,g, for a first-order fit, slope

first (the x^1 term) then intercept (the x^0 term).
Using the example of the first-order fit to the SD memory card
prices:

>>x=[2 4 8 16];
>> y=[9.99 10.99 19.99 29.99];
>> polyfit(x,y,1)
ans =
    1.4913    6.5552
>> y/[x;ones(size(y))]
ans =
    1.4913    6.5552

which shows that the slope and intercept results for the
polyfit function and for the matrix method are the same. (The slope
and intercept results are the same, but the polyfit function has the
advantage that it also can compute the error estimates with little
extra affort, as described above).

Click to view enlarged figureThe plotit.m function.

The graph on the left (click to see a larger size) was generated by
a simple downloadable Matlab/Octave function

plotit(data) or plotit(data,polyorder),
that uses all the techniques mentioned in the previous paragraph.
It accepts ‘data’ in the form of a single vector, or a pair of
vectors “x” and “y”, or a 2xn or nx2 matrix with x in first row or
column and y in the second, and plots the data points as red
dots. 

If the optional input argument “polyorder” is provided, plotit fits
a polynomial of order “polyorder” to the data and plots the fit as a
green line and displays the fit coefficients and the goodness-of-fit
measure R2
in the upper left corner of the graph. 

Here is a Matlab/Octave example of the use of
plotit.m to perform the coordinate transformation
described in a previous
section
to fit an exponential relationship,
showing both the original exponential data and the
transformed data with a linear fit in the figure(2)
and figure(1)
windows, respectively (click
to download
): 

x=1:.1:2.6;
a=1;
b=-.9;
y = a.*exp(b.*x);
y=y+y.*.1.*rand(size(x));
figure(1)
[coeff,R2]=plotit(x,log(y),1);
ylabel('ln(y)');
title('Plot of x vs the natural log (ln) of
y')

aa=exp(coeff(2));
bb=coeff(1);
yy= aa.*exp(bb.*x);
figure(2)
plot(x,y,'r.',x,yy,'g')
xlabel('x');
ylabel('y');
title(['y =
a*exp(b*x)     a = '
num2str(aa)  '     b = '
num2str(bb)  '    R2 =  '
num2str(R2) ] ) ;

In version 5 or 6 the

syntax of plotit can be  [coef, RSquared, StdDevs] = plotit(x,y,n).
It returns the best-fit coefficients ‘
coeff‘, in
decreasing powers of x,
the

standard deviations of those coefficientsStdDevs’
in the same order, and the R-squared value.
To compute the relative

standard deviations, just type StdDevs./coef.
For

example, the following script computes a straight line
with 5 data points and a slope of
10, an intercept of zero, and noise
equal to 1.0. then uses plotit.m to
plot and fit the data to a
first-order linear model (straight
line) and compute the estimated
standard deviation of the slope and
intercept, if you run this over and
over again, you will observe that
the measured slope and intercept are
almost always withing two standard
deviations of 10 and zero
respectively. Try it with different
values of Noise.


NumPoints=5;
slope=10;
Noise=1;
x=round(10.*rand(size(1:NumPoints)));
y=slope*x+Noise.*randn(size(x));
[coef,RSquared,StdDevs]=plotit(x,y,1)


Comparing two data sets. Plotit can also be
used to compare to two different dependent variable
vectors (e.g. y1 and y2) if they share the same
independent variables
x, for example to
determine the similarity of two different spectra
measured over the same wavelengths as was done previously
by simple division
:

 [coeff,R2]=plotit(y1,y2,1)

 The closer the R2 value is to 1.000, the more
similar they are. If y1 and y2 are two measurements
of the same signal with different random noise, the
plot will show a random
scatter of points along a straight line
with a
slope of 1. If the y1 and y2 are the same signal with different
amplitudes, the slope

of the line will equal their
average ratio
. If the data

points are curved and loop around,
the two y vectors are more different
than the random noise.

In

version 6 the syntax can be optionally


plotit(x,y
,n,datastyle,fitstyle), where
datastyle and

fitstyle are

optional strings specifying the line and symbol style and
color, in standard Matlab convention. The strings, in single
quotes, are made from one element from any or all the
following 3 columns:
b  
blue        .  
point            

-    solid
g  
green       o  
circle           
:    dotted

r  
red        
x  
x-mark           
-.   dashdot

c  
cyan        +  
plus             

--   dashed  
m   magenta    
*  
star           
(none) no line

y   yellow     
s   square

k  
black       d  
diamond

w  
white       v  
triangle (down)

 
             

^   triangle (up)
      
        
<   triangle (left)

               

>   triangle (right)
               

p   pentagram
               

h   hexagram
For example,
plotit(x,y,3,'or','-g') plots the data as red circles
and the fit as a green solid line (the default is red dots and
a blue line, respectively).

You can use plotit.m to linearize and plot other nonlinear relationships,
such as:
y = a exp(bx) : [coeff,R2]=plotit(x,log(y),1);

a=exp(coeff(2)); b=coeff(1);
y = a ln(bx) : [coeff,R2]=plotit(log(x),y,1);
a
=coeff(1); b=log(coeff(2));

y=axb
:
[coeff,R2]=plotit(log(x),log(y),1); a=exp(coeff(2));
b
=coeff(1);
y=start(1+rate)x:
[coeff,R2]=plotit(x,log(y),1);

start=exp(coeff(2)); rate=exp(coeff(1))-1;
This last one is the expression for compound interest, which
is used in Appendix R:
Signal and Noise in the Stock Market
.

<meta name="GENERATOR" content="OpenOffice 4.1.2 (Win32)"/> Don't forget that in Matlab/Octave, "log" means <i>natural<br /> log</i>; the <i>base-10</i> log is denoted by "log10".</p> <p><a target="_blank" name="Matlab_Bootstrap"/ rel="noopener noreferrer"><b>Estimating the coefficient errors</b>.<br /> The <a target="_blank" href="plotit.m" rel="noopener noreferrer">plotit </a>function version 2 also has a<br /> built-in <a target="_blank" href="#Bootstrap" rel="noopener noreferrer"><i>bootstrap routine</i></a> that<br /> computes coefficient error estimates by the bootstrap method<br /> (Standard deviation STD and relative standard deviation RSD) and<br /> returns the results in the matrix "BootResults" (of size 5 x<br /> polyorder+1). You can change the number of bootstrap samples in line<br /> 101. The calculation is triggered by including a 4th <i>output<br /> </i>argument, e.g. <span style="font-family: monospace;">[coef,<br /> RSquared, </span><span style="font-family: monospace;"><span><span><span style="font-style: normal;"><span style="font-weight: normal;"><span style="color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: monospace;">StdDevs, </span></span></span></span></span>BootResults]=</p> <p> plotit(x,y,polyorder)</span>. This works for any polynomial<br /> order.  For example:</p> <p><span style="font-family: monospace;"><br />>> x=0:100;</span><br style="font-family: monospace;"/><span style="font-family: monospace;">>><br /> y=100+(x*100)+100.*randn(size(x));</span><br style="font-family: monospace;"/><span style="font-family: monospace;">>> [FitResults, GOF,<br /> baseline, coeff, residual, xi, yi, BootResults] = plotit(x,y,1);</span></p> <p>computes straight line with an intercept and slope of 100, plus<br /> random noise with a standard deviation of 100, then fits a straight<br /> line to that data and prints out a table of bootstrap error<br /> estimates, with the slope in the first column and the intercept in<br /> the second column:</p> <p><span style="font-family: monospace;"><br />Bootstrap Results</span><br style="font-family: monospace;"/><span style="font-family: monospace;">Mean:       </p> <p> 100.359      88.01638</span><br style="font-family: monospace;"/><span style="font-family: monospace;">STD:        </p> <p> 0.204564      15.4803</span><br style="font-family: monospace;"/><span style="font-family: monospace;">STD (IQR):  <br /> 0.291484      20.5882</span><br style="font-family: monospace;"/><span style="font-family: monospace;">% RSD:   <br />    0.203832      17.5879</span><br style="font-family: monospace;"/><span style="font-family: monospace;">% RSD (IQR):<br /> 0.290441      23.3914</span></p> <p><a target="_blank" href="http://terpconnect.umd.edu/BootStrapQuadratic.gif" rel="noopener noreferrer"><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;"><img loading="lazy" src="https://i0.wp.com/terpconnect.umd.edu/BootStrapQuadratic.gif?resize=297%2C288" title="Click to enlarge." alt width="297" height="288" border="2" align="right" data-recalc-dims="1" data-lazy-src="https://i0.wp.com/terpconnect.umd.edu/BootStrapQuadratic.gif?resize=297%2C288&is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img loading="lazy" src="https://i0.wp.com/terpconnect.umd.edu/BootStrapQuadratic.gif?resize=297%2C288" title="Click to enlarge." alt="" width="297" height="288" border="2" align="right" data-recalc-dims="1"/></noscript></span></a><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;">The variation <a target="_blank" href="plotfita.m" rel="noopener noreferrer">plotfita</a> <i>animates </i>the bootstrap<br /> process for instructional purposes, <a target="_blank" href="http://terpconnect.umd.edu/BootStrapQuadratic.gif" rel="noopener noreferrer">as shown in the animation on the<br /> right</a> a quadratic fit. You must include the output<br /> arguments, for example:<br /> <tt>[coef, RSquared, BootResults]=plotfita([1 2 3 4 5 6],[1<br /> 3 4 3 2 1],2);</tt></p> <p>The variation <a target="_blank" href="logplotfit.m" rel="noopener noreferrer">logplotfit</a> plots and<br /> fits log(x) vs log(y), for data that follows a <a target="_blank" href="http://en.wikipedia.org/wiki/Power_law" rel="noopener noreferrer">power law<br /> relationship</a> or that covers a very wide numerical range. </p> <p></span><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;"><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;"><b>Finding</p> <p> the right polynomial order.</b> </span>My downloadable<br /> function <a target="_blank" href="trypoly.m" rel="noopener noreferrer">trypoly(x,y)</a> fits the data in<br /> x,y with a series of polynomials of degree 1 through length(x)-1<br /> and returns the coefficients of determination (R2) of each fit as<br /> a vector, showing that, for <i>any </i>data, the </span><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;"><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;">coefficient of determination<br /> R2 </span>approaches 1 as the polynomial order approaches<br /> length(x)-1. The variant <a target="_blank" href="trypolyplot%28x,y%29.m" rel="noopener noreferrer">trypolyplot(x,y)</a><br /> creates a bar graph.  <a target="_blank" href="trypoly.png" rel="noopener noreferrer">Here's an<br /> example graphic</a>.  </p> <p><b>Finding the right data transformation.</b> The related </p> <p></span><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; display: inline ! important; float: none;">function</span> <a target="_blank" href="trydatatrans.m" rel="noopener noreferrer">trydatatrans(x,y,polyorder)</a> tries 8<br /> different simple data transformations on the data x,y, fits the<br /> transformed data to a polynomial of order 'polyorder', displays<br /> results<a target="_blank" href="trydatatrans.png" rel="noopener noreferrer"> graphically in 3 x 3 array of<br /> small plots</a> and returns the R2 values in a vector.</p> <p><b><a target="_blank" name="MatlabFittingPeak"/ rel="noopener noreferrer">Fitting Gaussian and Lorentzian<br /> peaks.</b> </p> <h3><a target="_blank" href="#basics" rel="noopener noreferrer"><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium; display: inline ! important; float: none;"><span><span><img loading="lazy" alt title="Back to top of this section." src="https://i2.wp.com/terpconnect.umd.edu/btt.png?resize=50%2C50" width="50" height="50" border="0" align="right" data-recalc-dims="1" data-lazy-src="https://i2.wp.com/terpconnect.umd.edu/btt.png?resize=50%2C50&is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img loading="lazy" alt="" title="Back to top of this section." src="https://i2.wp.com/terpconnect.umd.edu/btt.png?resize=50%2C50" width="50" height="50" border="0" align="right" data-recalc-dims="1"/></noscript></span></span></span></a></h3> <p> A simple user-defined Matlab/Octave function that fits a Gaussian<br /> function to an x,y signal is <a target="_blank" href="gaussfit.m" rel="noopener noreferrer">gaussfit.m</a>,<br /> which implements the x vs ln(y) quadratic fitting method <a target="_blank" href="#FittingPeaks" rel="noopener noreferrer">described above</a>. It takes the form <span style="font-family: monospace;">[Height,Position,Width]=gaussfit(x,y)</span>.<br /> For example, </p> <p><span style="font-family: monospace;">>><br /> x=50:150;y=100.*gaussian(x,100,100)+10.*randn(size(x));</span><br style="font-family: monospace;"/><span style="font-family: monospace;">>><br /> [Height,Position,Width]=gaussfit(x,y)  </span></p> <p>returns [Height,Position,Width] clustered around 100,100,100. A<br /> similar function for Lorentzian peaks is <a target="_blank" href="lorentzfit.m" rel="noopener noreferrer">lorentzfit.m</a>,which</p> <p> takes the form </p> <p><span style="font-family: monospace;">[Height,Position,Width]=lorentzfit(x,y)</span>.</p> <p>An expanded variant of the gaussfit.m function is <a target="_blank" href="bootgaussfit.m" rel="noopener noreferrer">bootgaussfit.m</a>, which does the same<br /> thing but also optionally plots the data and the fit and computes<br /> estimates of the random error in the height, width, and position of<br /> the fitted Gaussian function by the bootstrap sampling method.<br />  For example:</p> <div style="margin-left: 40px;"><span style="font-family: monospace;">>><br /> x=50:150;y=100.*gaussian(x,100,100)+10.*randn(size(x));</span><br style="font-family: monospace;"/><span style="font-family: monospace;">>><br /> [Height,Position,Width,BootResults]=bootgaussfit(x,y,1);</span></div> <p> This does the same as the previous example but also displays error<br /> estimates in a table and returns the 3x5 matrix <span style="font-family: monospace;">BootResults</span>. Type "help<br /> bootgaussfit" for help.  <span style="font-family: monospace;"/><span style="font-family: monospace;">              <br /> Height    <br /> Position      </p> <p> Width </span><br style="font-family: monospace;"/><span style="font-family: monospace;">Bootstrap Mean: 100.84 <br />    101.325      98.341</span><br style="font-family: monospace;"/><span style="font-family: monospace;">Bootstrap STD: <br /> 1.3458    <br /> 0.63091      2.0686</span><br style="font-family: monospace;"/><span style="font-family: monospace;">Bootstrap IQR: <br /> 1.7692    <br /> 0.86874      2.9735</span><br style="font-family: monospace;"/><span style="font-family: monospace;">Percent RSD:   <br /> 1.3346    <br /> 0.62266      2.1035</span><br style="font-family: monospace;"/><span style="font-family: monospace;">Percent IQR:   <br /> 1.7543    <br /> 0.85737      3.0237</span></p> <p><span style="font-style: italic;">It's important that the noisy<br /> signal (x.y) not be <a target="_blank" href="Smoothing.html#NOT_smooth" rel="noopener noreferrer">smoothed</a> </span>if<br /> the</p> <p> bootstrap error predictions are to be accurate. Smoothing the data<br /> will cause the bootstrap method to seriously underestimate the<br /> precision of the results.</p> <p>The gaussfit.m and lorentzfit.m functions are simple and easy but<br /> they do not work well with very noisy peaks or for overlapping<br /> peaks. As a demonstration, <a target="_blank" href="OverlappingPeaks.m" rel="noopener noreferrer">OverlappingPeaks.m</a><br /> is a demo script that shows how to use gaussfit.m to measure <a target="_blank" href="OverlappingPeaks.png" rel="noopener noreferrer">two overlapping partially gaussian<br /> peaks</a>.   It requires careful selection of the optimum<br /> data regions around the top of each peak. Try changing the<br /> relative position and height of the second peak or adding noise<br /> (line 3) and see how it effects the accuracy. This function needs<br /> the gaussian.m, gaussfit.m, and peakfit.m functions in the path.<br /> The script also performs a measurement by the <a target="_blank" href="CurveFittingC.html" rel="noopener noreferrer">iterative method</a> using peakfit.m,<br /> which is <a target="_blank" href="OverlappingPeaks.txt" rel="noopener noreferrer"><i>more accurate</i> but<br /> <i>takes about times longer</i> to compute</a>.  </p> <p>The downloadable Matlab-only functions <a target="_blank" href="isignal.html" rel="noopener noreferrer">iSignal.m</a><br /> and <a target="_blank" href="InteractivePeakFitter.htm#Keypress_operated_version:_ipf.m" rel="noopener noreferrer">ipf.m</a>,<br /> whose principal functions are fitting <i>peaks</i>, also have a<br /> function for fitting <i>polynomials </i>of any order (<b>Shift-o</b>).</p> <p></p> <p>Recent versions of Matlab have a convenient tool for interactive<br /> manually-controlled (rather than programmed) polynomial curve<br /> fitting in the Figure window. Click for a video example: <a target="_blank" href="http://www.youtube.com/watch?v=EypwejBhN34" rel="noopener noreferrer">(external link<br /> to YouTube)</a>.</p> <p> The <i>Matlab Statistics Toolbox</i> includes two types of<br /> bootstrap functions, "<a target="_blank" href="bootstrp.txt" rel="noopener noreferrer">bootstrp</a>" and "<a target="_blank" href="jackknife.txt" rel="noopener noreferrer">jackknife</a>".  To open the reference<br /> page in Matlab's help browser, type "doc bootstrp" or "doc<br /> jackknife". </p> <hr/> <p><a target="_blank" href="TOC.html" rel="noopener noreferrer"><img src="https://i1.wp.com/terpconnect.umd.edu/bh.gif?w=1170" alt="index" data-recalc-dims="1" data-lazy-src="https://i1.wp.com/terpconnect.umd.edu/bh.gif?w=1170&is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img src="https://i1.wp.com/terpconnect.umd.edu/bh.gif?w=1170" alt="index" data-recalc-dims="1"/></noscript></a> <a target="_blank" href="Integration.html" rel="noopener noreferrer"><img src="https://i0.wp.com/terpconnect.umd.edu/bb.gif?w=1170" alt="previous" data-recalc-dims="1" data-lazy-src="https://i0.wp.com/terpconnect.umd.edu/bb.gif?w=1170&is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img src="https://i0.wp.com/terpconnect.umd.edu/bb.gif?w=1170" alt="previous" data-recalc-dims="1"/></noscript></a> <a target="_blank" href="CurveFittingB.html" rel="noopener noreferrer"><img src="https://i1.wp.com/terpconnect.umd.edu/bf.gif?w=1170" alt="next" data-recalc-dims="1" data-lazy-src="https://i1.wp.com/terpconnect.umd.edu/bf.gif?w=1170&is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img src="https://i1.wp.com/terpconnect.umd.edu/bf.gif?w=1170" alt="next" data-recalc-dims="1"/></noscript></a></p> <h3><a target="_blank" href="#basics" rel="noopener noreferrer"><span style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium; display: inline ! important; float: none;"><span><span><img loading="lazy" alt title="Back to top of this section." src="https://i2.wp.com/terpconnect.umd.edu/btt.png?resize=50%2C50" width="50" height="50" border="0" align="right" data-recalc-dims="1" data-lazy-src="https://i2.wp.com/terpconnect.umd.edu/btt.png?resize=50%2C50&is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img loading="lazy" alt="" title="Back to top of this section." src="https://i2.wp.com/terpconnect.umd.edu/btt.png?resize=50%2C50" width="50" height="50" border="0" align="right" data-recalc-dims="1"/></noscript></span></span></span></a></h3> <hr/> <p> Last updated April, 2019. This page is part of "<a target="_blank" href="https://terpconnect.umd.edu/%7Etoh/spectrum/" rel="noopener noreferrer"><b>A Pragmatic<br /> Introduction to Signal Processing</b></a>", created and<br /> maintained by <a target="_blank" href="http://www.wam.umd.edu/%7Etoh/" rel="noopener noreferrer">Prof. Tom<br /> O'Haver </a>, Department of Chemistry and Biochemistry, The<br /> University of Maryland at College Park. Comments, suggestions and<br /> questions should be directed to Prof. O'Haver at <a target="_blank" href="mailto:toh@umd.edu?subject=CurveFittingA" rel="noopener noreferrer">toh@umd.edu</a>. <br />Unique visits since May 17, 2008:<br /> <!-- Start of StatCounter Code --></p> <p> <noscript></p> <div class="statcounter"><a target="_blank" href="http://www.statcounter.com/free_hit_counter.html" target="_blank" rel="noopener noreferrer"><img class="statcounter jetpack-lazy-image" src="http://c45.statcounter.com/3716888/0/b9644933/0/" alt="counter create hit" data-lazy-src="http://c45.statcounter.com/3716888/0/b9644933/0/?is-pending-load=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"><noscript><img class="statcounter" src="http://c45.statcounter.com/3716888/0/b9644933/0/" alt="counter create hit"/></noscript></a></div> <p></noscript><br /> <!-- End of StatCounter Code --></p> <p> </body></div> <p></br><br /> https://terpconnect.umd.edu/~toh/spectrum/CurveFitting.html</p> <div id='jp-relatedposts' class='jp-relatedposts' > </div> </div> </div> <div class="entry-sidebar uk-width-1-5@m uk-flex-first@m uk-first-column"> <div class="post-enty-meta"> <ul class="content uk-list uk-list-divider"> <li class="author"> <strong>Written by:</strong> <span>admin</span> </li> <li class="date"> <strong>Posted on:</strong> <span>August 5, 2019</span> </li> </ul> </div> <div class="post-share-container"> <div class="meta-share"> <a href="https://twitter.com/share?text=Intro. to Signal Processing:Curve fitting&url=https%3A%2F%2Fichanneltech.com%2Fintro-to-signal-processingcurve-fitting%2F" data-uk-tooltip="Share on Twitter" onclick="pss_onClick( this.href );return false;"> <i class="fa fa-twitter"></i> </a> <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fichanneltech.com%2Fintro-to-signal-processingcurve-fitting%2F" data-uk-tooltip="Share on Facebook" onclick="pss_onClick( this.href );return false;"> <i class="fa fa-facebook-official"></i> </a> <a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fichanneltech.com%2Fintro-to-signal-processingcurve-fitting%2F&title=Intro. to Signal Processing:Curve fitting&summary=Intro.+to+Signal+Processing%3ACurve+fitting+%5BIntroduction%5D%C2%A0+%5BSignal+arithmetic%5D%C2%A0+%5BSignals+and+noise%5D+%C2%A0+%5BSmoothing%5D+%C2%A0+%5BDifferentiation%5D%C2%A0+%5BPeak+Sharpening%5D%C2%A0+%5BHarmonic+analysis%5D+%C2%A0+%5BFourier+convolution%5D%C2%A0+%5BFourier+deconvolution%5D%C2%A0+%5BFourier+filter%5D+%C2%A0+%5BPeak+area+measurement%5D%C2%A0+%5BLinear+Least+Squares%5D%C2%A0+%5BMulticomponent+Spectroscopy%5D%C2%A0+%5BIterative+Curve+Fitting%5D%C2%A0+%5BHyperlinear+quantitative%26hellip%3B&source=https://ichanneltech.com/" data-uk-tooltip="Share on Linkedin" onclick="pss_onClick( this.href );return false;"> <i class="fa fa-linkedin"></i> </a> </div> </div> </div> </div><!-- .entry-content --> </article><!-- #post-## --> </div> </main> </div> </div> <!-- site-footer --> <footer> <div data-elementor-type="wp-post" data-elementor-id="5138" class="elementor elementor-5138" data-elementor-settings="[]"> <div class="elementor-inner"> <div class="elementor-section-wrap"> <section class="elementor-element elementor-element-d7ba3f9 pr__section elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-id="d7ba3f9" data-element_type="section" id="pr_contact" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-row"> <div class="elementor-element elementor-element-b6fa8d0 elementor-column elementor-col-33 elementor-top-column" data-id="b6fa8d0" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-baae923 elementor-shape-circle elementor-widget elementor-widget-social-icons" data-id="baae923" data-element_type="widget" data-widget_type="social-icons.default"> <div class="elementor-widget-container"> <div class="elementor-social-icons-wrapper"> <a class="elementor-icon elementor-social-icon elementor-social-icon-facebook-f elementor-animation-float elementor-repeater-item-dcf3cb4" href="https://fb.com/ichanneltech" target="_blank"> <span class="elementor-screen-only">Facebook-f</span> <i class="fab fa-facebook-f"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-animation-float elementor-repeater-item-e1419ba" href="https://twitter.com/ichanneltech" target="_blank"> <span class="elementor-screen-only">Twitter</span> <i class="fab fa-twitter"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-instagram elementor-animation-float elementor-repeater-item-caea876" href="https://instagram.com/ichanneltech" target="_blank"> <span class="elementor-screen-only">Instagram</span> <i class="fab fa-instagram"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-telegram elementor-animation-float elementor-repeater-item-c6abdf8" href="https://t.me/ichanneltech" target="_blank"> <span class="elementor-screen-only">Telegram</span> <i class="fab fa-telegram"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-whatsapp elementor-animation-float elementor-repeater-item-691f969" href="https://wa.me/2348030655234" target="_blank"> <span class="elementor-screen-only">Whatsapp</span> <i class="fab fa-whatsapp"></i> </a> </div> </div> </div> </div> </div> </div> <div class="elementor-element elementor-element-c98f719 elementor-column elementor-col-33 elementor-top-column" data-id="c98f719" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-e7cb69b elementor-widget elementor-widget-html" data-id="e7cb69b" data-element_type="widget" data-widget_type="html.default"> <div class="elementor-widget-container"> <style> .pixe-single-post-header-full, .section-title.thumbnail-bg{ margin-top:-170px; } .page-id-326 header.site-header .pr-main-menu > .menu-item > a, .page-id-326 .elementor-widget-heading .elementor-heading-title>a, .page-id-330 header.site-header .pr-main-menu > .menu-item > a, .page-id-330 .elementor-widget-heading .elementor-heading-title>a, .page-id-326 #mobile-header .toggle-icon i, .page-id-326 .mobile-logo h1.site-title a, .page-id-330 #mobile-header .toggle-icon i, .page-id-330 .mobile-logo h1.site-title a, .page-id-330 .lang select, .page-id-226 .lang select, .page-id-330 .lang, .page-id-226 .lang{ color:#101010!important; } .page-id-326 .elementor-104 .elementor-element.elementor-element-3f9125c, .page-id-330 .elementor-104 .elementor-element.elementor-element-3f9125c, .page-id-326 #mobile-header, .page-id-330 #mobile-header{ background-color:#fff!important; } </style> </div> </div> <div class="elementor-element elementor-element-f34c135 elementor-widget elementor-widget-heading" data-id="f34c135" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <h2 class="elementor-heading-title elementor-size-default">Let's Talk?</h2> </div> </div> </div> </div> </div> <div class="elementor-element elementor-element-9e9d60d elementor-column elementor-col-33 elementor-top-column" data-id="9e9d60d" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-74cfe66 elementor-widget elementor-widget-pr-modal" data-id="74cfe66" data-element_type="widget" data-widget_type="pr-modal.default"> <div class="elementor-widget-container"> <div class="pr-button-container"> <a class="pr-button pr-button-lg pr-button-style1-right" data-uk-toggle="target: #pr-modal-section-74cfe66"><div class="pr-button-text-icon-wrapper"><span >Make an enquiry!</span></div> </a> </div> <div class="pr-modal-wrapper"> <div id="pr-modal-section-74cfe66" data-uk-modal="" class="uk-modal uk-modal-full"> <div class="uk-modal-dialog"> <button class="uk-modal-close-default" type="button" data-uk-close></button> <div data-uk-height-viewport="offset-top: .uk-modal-header; offset-bottom: .uk-modal-footer" class="uk-modal-body"> <style>.elementor-33 .elementor-element.elementor-element-3cceff83 > .elementor-element-populated{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;}.elementor-33 .elementor-element.elementor-element-3cceff83 > .elementor-element-populated > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-33 .elementor-element.elementor-element-427c7c01 .elementor-spacer-inner{height:124px;}.elementor-33 .elementor-element.elementor-element-fe90df9 .elementor-text-editor{text-align:center;}.elementor-33 .elementor-element.elementor-element-fe90df9{color:#ffffff;font-size:48px;font-weight:100;line-height:1.3em;}.elementor-33 .elementor-element.elementor-element-fe90df9 > .elementor-widget-container{padding:38px 0px 0px 0px;}.elementor-33 .elementor-element.elementor-element-2899c47e .elementor-spacer-inner{height:220px;}.elementor-33 .elementor-element.elementor-element-2839c267:not(.elementor-motion-effects-element-type-background), .elementor-33 .elementor-element.elementor-element-2839c267 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:#B2F4F8;background-image:url("https://ichanneltech.com/wp-content/uploads/2019/05/content-prlx.jpg");background-position:center center;background-size:auto;}.elementor-33 .elementor-element.elementor-element-2839c267 > .elementor-background-overlay{background-color:#000000;opacity:0.27;transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-33 .elementor-element.elementor-element-2839c267{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;}.elementor-33 .elementor-element.elementor-element-107f8be8 > .elementor-container > .elementor-row > .elementor-column > .elementor-column-wrap > .elementor-widget-wrap{align-content:center;align-items:center;}.elementor-33 .elementor-element.elementor-element-dff4358{text-align:center;}.elementor-33 .elementor-element.elementor-element-dff4358 .elementor-heading-title{color:#000000;font-size:65px;}.elementor-33 .elementor-element.elementor-element-395bebc3{text-align:center;}.elementor-33 .elementor-element.elementor-element-395bebc3 .elementor-social-icon{background-color:rgba(0,0,0,0);font-size:15px;}.elementor-33 .elementor-element.elementor-element-395bebc3 .elementor-social-icon i{color:#000000;}.elementor-33 .elementor-element.elementor-element-395bebc3 .elementor-social-icon svg{fill:#000000;}.elementor-33 .elementor-element.elementor-element-395bebc3 .elementor-social-icon:not(:last-child){margin-right:19px;}.elementor-33 .elementor-element.elementor-element-2e833749 > .elementor-container > .elementor-row > .elementor-column > .elementor-column-wrap > .elementor-widget-wrap{align-content:center;align-items:center;}.elementor-33 .elementor-element.elementor-element-2dddf076:not(.elementor-motion-effects-element-type-background) > .elementor-column-wrap, .elementor-33 .elementor-element.elementor-element-2dddf076 > .elementor-column-wrap > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:rgba(226,226,226,0.13);}.elementor-33 .elementor-element.elementor-element-2dddf076 > .elementor-element-populated{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;padding:0% 10% 0% 0%;}.elementor-33 .elementor-element.elementor-element-2dddf076 > .elementor-element-populated > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group{padding-right:calc( 15px/2 );padding-left:calc( 15px/2 );margin-bottom:15px;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-form-fields-wrapper{margin-left:calc( -15px/2 );margin-right:calc( -15px/2 );margin-bottom:-15px;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group.recaptcha_v3-bottomleft, .elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group.recaptcha_v3-bottomright{margin-bottom:0;}body.rtl .elementor-33 .elementor-element.elementor-element-1a492518 .elementor-labels-inline .elementor-field-group > label{padding-left:0px;}body:not(.rtl) .elementor-33 .elementor-element.elementor-element-1a492518 .elementor-labels-inline .elementor-field-group > label{padding-right:0px;}body .elementor-33 .elementor-element.elementor-element-1a492518 .elementor-labels-above .elementor-field-group > label{padding-bottom:0px;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-type-html{padding-bottom:0px;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group .elementor-field{color:#000000;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group .elementor-field, .elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-subgroup label{font-size:15px;font-weight:300;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group:not(.elementor-field-type-upload) .elementor-field:not(.elementor-select-wrapper){background-color:rgba(226,226,226,0.09);border-color:rgba(110,193,228,0.78);border-width:1px 1px 1px 1px;border-radius:0px 0px 0px 0px;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group .elementor-select-wrapper select{background-color:rgba(226,226,226,0.09);border-color:rgba(110,193,228,0.78);border-width:1px 1px 1px 1px;border-radius:0px 0px 0px 0px;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-field-group .elementor-select-wrapper::before{color:rgba(110,193,228,0.78);}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-button{font-size:15px;font-weight:600;text-transform:uppercase;border-radius:0px 0px 0px 0px;padding:15px 45px 15px 45px;}.elementor-33 .elementor-element.elementor-element-1a492518 .e-form__buttons__wrapper__button-next{background-color:#009ee2;color:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-button[type="submit"]{background-color:#009ee2;color:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-button[type="submit"] svg *{fill:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .e-form__buttons__wrapper__button-previous{color:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .e-form__buttons__wrapper__button-next:hover{background-color:#00ce1b;color:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-button[type="submit"]:hover{background-color:#00ce1b;color:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .elementor-button[type="submit"]:hover svg *{fill:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518 .e-form__buttons__wrapper__button-previous:hover{color:#ffffff;}.elementor-33 .elementor-element.elementor-element-1a492518{--e-form-steps-indicators-spacing:20px;--e-form-steps-indicator-padding:30px;--e-form-steps-indicator-inactive-secondary-color:#ffffff;--e-form-steps-indicator-active-secondary-color:#ffffff;--e-form-steps-indicator-completed-secondary-color:#ffffff;--e-form-steps-divider-width:1px;--e-form-steps-divider-gap:10px;}.elementor-33 .elementor-element.elementor-element-2a212fb3:not(.elementor-motion-effects-element-type-background) > .elementor-column-wrap, .elementor-33 .elementor-element.elementor-element-2a212fb3 > .elementor-column-wrap > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:#70c4d1;}.elementor-33 .elementor-element.elementor-element-2a212fb3 > .elementor-element-populated{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;padding:40px 30px 40px 30px;}.elementor-33 .elementor-element.elementor-element-2a212fb3 > .elementor-element-populated > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-33 .elementor-element.elementor-element-6f51d8b4.elementor-view-stacked .elementor-icon{background-color:#ffffff;}.elementor-33 .elementor-element.elementor-element-6f51d8b4.elementor-view-framed .elementor-icon, .elementor-33 .elementor-element.elementor-element-6f51d8b4.elementor-view-default .elementor-icon{fill:#ffffff;color:#ffffff;border-color:#ffffff;}.elementor-33 .elementor-element.elementor-element-6f51d8b4.elementor-position-right .elementor-icon-box-icon{margin-left:0px;}.elementor-33 .elementor-element.elementor-element-6f51d8b4.elementor-position-left .elementor-icon-box-icon{margin-right:0px;}.elementor-33 .elementor-element.elementor-element-6f51d8b4.elementor-position-top .elementor-icon-box-icon{margin-bottom:0px;}.elementor-33 .elementor-element.elementor-element-6f51d8b4 .elementor-icon i{transform:rotate(0deg);}.elementor-33 .elementor-element.elementor-element-6f51d8b4 .elementor-icon-box-content .elementor-icon-box-title{color:#ffffff;font-size:36px;font-weight:400;}.elementor-33 .elementor-element.elementor-element-6f51d8b4 .elementor-icon-box-content .elementor-icon-box-description{font-weight:400;}.elementor-33 .elementor-element.elementor-element-5c00808 .elementor-text-editor{text-align:center;}.elementor-33 .elementor-element.elementor-element-5c00808{color:#ffffff;font-size:15px;font-weight:300;}.elementor-33 .elementor-element.elementor-element-5c00808 > .elementor-widget-container{margin:0px 0px 0px 0px;padding:-1px 4px 0px 4px;}.elementor-33 .elementor-element.elementor-element-7a9ee94e .elementor-text-editor{text-align:center;}.elementor-33 .elementor-element.elementor-element-7a9ee94e{color:#ffffff;font-size:15px;font-weight:200;line-height:1.2em;letter-spacing:0.5px;}.elementor-33 .elementor-element.elementor-element-7947d926 .elementor-text-editor{text-align:center;}.elementor-33 .elementor-element.elementor-element-7947d926{color:#ffffff;font-size:16px;font-weight:200;line-height:1.2em;letter-spacing:0.5px;}.elementor-33 .elementor-element.elementor-element-7947d926 > .elementor-widget-container{margin:-10px 0px 0px 0px;}.elementor-33 .elementor-element.elementor-element-11e302a2{text-align:center;}.elementor-33 .elementor-element.elementor-element-11e302a2 .elementor-social-icon{background-color:rgba(0,0,0,0);font-size:15px;}.elementor-33 .elementor-element.elementor-element-11e302a2 .elementor-social-icon i{color:#ffffff;}.elementor-33 .elementor-element.elementor-element-11e302a2 .elementor-social-icon svg{fill:#ffffff;}.elementor-33 .elementor-element.elementor-element-11e302a2 .elementor-social-icon:not(:last-child){margin-right:19px;}.elementor-33 .elementor-element.elementor-element-2e833749{padding:25px 0px 0px 0px;}.elementor-33 .elementor-element.elementor-element-107f8be8:not(.elementor-motion-effects-element-type-background), .elementor-33 .elementor-element.elementor-element-107f8be8 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:rgba(226,226,226,0.13);}.elementor-33 .elementor-element.elementor-element-107f8be8{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;padding:100px 0px 100px 0px;}.elementor-33 .elementor-element.elementor-element-107f8be8 > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}@media(min-width:768px){.elementor-33 .elementor-element.elementor-element-2dddf076{width:62.1%;}.elementor-33 .elementor-element.elementor-element-2a212fb3{width:37.9%;}}@media(max-width:1024px){.elementor-33 .elementor-element.elementor-element-2899c47e .elementor-spacer-inner{height:90px;}.elementor-33 .elementor-element.elementor-element-2839c267{padding:0px 25px 0px 25px;}.elementor-33 .elementor-element.elementor-element-2a212fb3 > .elementor-element-populated{padding:15px 15px 15px 15px;}.elementor-33 .elementor-element.elementor-element-6f51d8b4 .elementor-icon-box-content .elementor-icon-box-title{font-size:32px;}.elementor-33 .elementor-element.elementor-element-107f8be8{padding:100px 25px 100px 25px;}}@media(max-width:767px){.elementor-33 .elementor-element.elementor-element-fe90df9{font-size:25px;}.elementor-33 .elementor-element.elementor-element-2899c47e .elementor-spacer-inner{height:115px;}.elementor-33 .elementor-element.elementor-element-2839c267{padding:0px 20px 0px 20px;}.elementor-33 .elementor-element.elementor-element-dff4358 .elementor-heading-title{font-size:35px;}.elementor-33 .elementor-element.elementor-element-2dddf076 > .elementor-element-populated{padding:0px 0px 35px 0px;}.elementor-33 .elementor-element.elementor-element-6f51d8b4 .elementor-icon-box-icon{margin-bottom:0px;}.elementor-33 .elementor-element.elementor-element-6f51d8b4 .elementor-icon-box-content .elementor-icon-box-description{font-size:13px;}.elementor-33 .elementor-element.elementor-element-7a9ee94e{font-size:13px;}.elementor-33 .elementor-element.elementor-element-7947d926{font-size:13px;}.elementor-33 .elementor-element.elementor-element-107f8be8{padding:50px 20px 50px 20px;}}</style> <div data-elementor-type="page" data-elementor-id="33" class="elementor elementor-33" data-elementor-settings="[]"> <div class="elementor-inner"> <div class="elementor-section-wrap"> <section class="elementor-element elementor-element-2839c267 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-id="2839c267" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-background-overlay"></div> <div class="elementor-container elementor-column-gap-no"> <div class="elementor-row"> <div class="elementor-element elementor-element-3cceff83 elementor-column elementor-col-100 elementor-top-column" data-id="3cceff83" data-element_type="column" data-settings="{"background_background":"classic"}"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-427c7c01 elementor-widget elementor-widget-spacer" data-id="427c7c01" data-element_type="widget" data-widget_type="spacer.default"> <div class="elementor-widget-container"> <div class="elementor-spacer"> <div class="elementor-spacer-inner"></div> </div> </div> </div> <div class="elementor-element elementor-element-fe90df9 elementor-widget elementor-widget-text-editor" data-id="fe90df9" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <div class="elementor-text-editor elementor-clearfix"><p>We design all in one tech solution for the complex needs of the <strong>capital management</strong> industry.</p></div> </div> </div> <div class="elementor-element elementor-element-2899c47e elementor-widget elementor-widget-spacer" data-id="2899c47e" data-element_type="widget" data-widget_type="spacer.default"> <div class="elementor-widget-container"> <div class="elementor-spacer"> <div class="elementor-spacer-inner"></div> </div> </div> </div> </div> </div> </div> </div> </div> </section> <section class="elementor-element elementor-element-107f8be8 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-id="107f8be8" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-no"> <div class="elementor-row"> <div class="elementor-element elementor-element-293e3b95 elementor-column elementor-col-100 elementor-top-column" data-id="293e3b95" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-dff4358 elementor-widget elementor-widget-heading" data-id="dff4358" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <h3 class="elementor-heading-title elementor-size-default">Get In touch</h3> </div> </div> <div class="elementor-element elementor-element-395bebc3 elementor-shape-square elementor-widget elementor-widget-social-icons" data-id="395bebc3" data-element_type="widget" data-widget_type="social-icons.default"> <div class="elementor-widget-container"> <div class="elementor-social-icons-wrapper"> <a class="elementor-icon elementor-social-icon elementor-social-icon-facebook-f elementor-repeater-item-8984ca6" href="https://facebook.com/iChanneltech" target="_blank"> <span class="elementor-screen-only">Facebook-f</span> <i class="fab fa-facebook-f"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-6da8dbe" href="https://twitter.com/ichanneltech" target="_blank"> <span class="elementor-screen-only">Twitter</span> <i class="fab fa-twitter"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-whatsapp elementor-repeater-item-2190cc6" href="https://wa.me/2348030655234" target="_blank"> <span class="elementor-screen-only">Whatsapp</span> <i class="fab fa-whatsapp"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-telegram elementor-repeater-item-2229324" href="https://t.me/IChanneltech" target="_blank"> <span class="elementor-screen-only">Telegram</span> <i class="fab fa-telegram"></i> </a> </div> </div> </div> <section class="elementor-element elementor-element-2e833749 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-inner-section" data-id="2e833749" data-element_type="section"> <div class="elementor-container elementor-column-gap-no"> <div class="elementor-row"> <div class="elementor-element elementor-element-2dddf076 elementor-column elementor-col-50 elementor-inner-column" data-id="2dddf076" data-element_type="column" data-settings="{"background_background":"classic"}"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-1a492518 elementor-button-align-end elementor-mobile-button-align-center elementor-widget elementor-widget-form" data-id="1a492518" data-element_type="widget" data-settings="{"button_width":"100","step_next_label":"Next","step_previous_label":"Previous","step_type":"number_text","step_icon_shape":"circle"}" data-widget_type="form.default"> <div class="elementor-widget-container"> <form class="elementor-form" method="post" id="new-form001" name="New Form"> <input type="hidden" name="post_id" value="33"/> <input type="hidden" name="form_id" value="1a492518"/> <input type="hidden" name="queried_id" value="5138"/> <div class="elementor-form-fields-wrapper elementor-labels-"> <div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-name elementor-col-50 elementor-field-required"> <label for="form-field-name" class="elementor-field-label elementor-screen-only">Name</label><input size="1" type="text" name="form_fields[name]" id="form-field-name" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Name" required="required" aria-required="true"> </div> <div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-50 elementor-field-required"> <label for="form-field-email" class="elementor-field-label elementor-screen-only">Email</label><input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Email" required="required" aria-required="true"> </div> <div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-b26ecb6 elementor-col-50 elementor-field-required"> <label for="form-field-b26ecb6" class="elementor-field-label elementor-screen-only">Phone</label><input size="1" type="text" name="form_fields[b26ecb6]" id="form-field-b26ecb6" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Phone" required="required" aria-required="true"> </div> <div class="elementor-field-type-select elementor-field-group elementor-column elementor-field-group-field_1 elementor-col-50 elementor-field-required"> <label for="form-field-field_1" class="elementor-field-label elementor-screen-only">Subject</label> <div class="elementor-field elementor-select-wrapper "> <select name="form_fields[field_1]" id="form-field-field_1" class="elementor-field-textual elementor-size-sm" required="required" aria-required="true"> <option value=""></option><option value="Business Application Consulting">Business Application Consulting</option><option value="General IT Consulting ">General IT Consulting </option><option value="Software Development">Software Development</option><option value="E-learning Solution">E-learning Solution</option><option value="Cloud Hosting Services">Cloud Hosting Services</option><option value="ERP Solution">ERP Solution</option><option value="Website Designing">Website Designing</option><option value="Smart Home ">Smart Home </option><option value="Procurement">Procurement</option><option value="Maintenance">Maintenance</option> </select> </div> </div> <div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-894019a elementor-col-50 elementor-field-required"> <label for="form-field-894019a" class="elementor-field-label elementor-screen-only">Company</label><input size="1" type="text" name="form_fields[894019a]" id="form-field-894019a" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Company Name" required="required" aria-required="true"> </div> <div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100 elementor-field-required"> <label for="form-field-message" class="elementor-field-label elementor-screen-only">Message</label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[message]" id="form-field-message" rows="4" placeholder="Message" required="required" aria-required="true"></textarea> </div> <div class="elementor-field-type-recaptcha elementor-field-group elementor-column elementor-field-group-field_2 elementor-col-100"> <div class="elementor-field" id="form-field-field_2"><div class="elementor-g-recaptcha" data-sitekey="6Ld6L4gUAAAAAG2ZSETT9POEFUYXLb1DDPHEEM2V" data-type="v2_checkbox" data-theme="light" data-size="normal"></div></div> </div> <div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons"> <button type="submit" class="elementor-button elementor-size-sm"> <span > <span class=" elementor-button-icon"> </span> <span class="elementor-button-text">Send Message</span> </span> </button> </div> </div> </form> </div> </div> </div> </div> </div> <div class="elementor-element elementor-element-2a212fb3 elementor-column elementor-col-50 elementor-inner-column" data-id="2a212fb3" data-element_type="column" data-settings="{"background_background":"classic"}"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-6f51d8b4 elementor-view-default elementor-position-top elementor-vertical-align-top elementor-widget elementor-widget-icon-box" data-id="6f51d8b4" data-element_type="widget" data-widget_type="icon-box.default"> <div class="elementor-widget-container"> <div class="elementor-icon-box-wrapper"> <div class="elementor-icon-box-icon"> <span class="elementor-icon elementor-animation-" > <i aria-hidden="true" class="fas fa-mobile-alt"></i> </span> </div> <div class="elementor-icon-box-content"> <h3 class="elementor-icon-box-title"> <span >(234) 803-065-5234</span> </h3> </div> </div> </div> </div> <div class="elementor-element elementor-element-5c00808 elementor-widget elementor-widget-text-editor" data-id="5c00808" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <div class="elementor-text-editor elementor-clearfix"><p>Available from 9:00 – 19:00</p></div> </div> </div> <div class="elementor-element elementor-element-7a9ee94e elementor-widget elementor-widget-text-editor" data-id="7a9ee94e" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <div class="elementor-text-editor elementor-clearfix"><p><strong><span style="color: #333399;">Address</span> </strong>Queen Elizabeth Road Ago Tapa Street, Mokola</p></div> </div> </div> <div class="elementor-element elementor-element-7947d926 elementor-widget elementor-widget-text-editor" data-id="7947d926" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <div class="elementor-text-editor elementor-clearfix"><p><strong><span style="color: #333399;">Email</span> </strong>hello@ichanneltech.com</p></div> </div> </div> <div class="elementor-element elementor-element-11e302a2 elementor-shape-square elementor-widget elementor-widget-social-icons" data-id="11e302a2" data-element_type="widget" data-widget_type="social-icons.default"> <div class="elementor-widget-container"> <div class="elementor-social-icons-wrapper"> <a class="elementor-icon elementor-social-icon elementor-social-icon-facebook-f elementor-repeater-item-8984ca6" href="https://facebook.com/iChanneltech" target="_blank"> <span class="elementor-screen-only">Facebook-f</span> <i class="fab fa-facebook-f"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-6da8dbe" href="https://twitter.com/ichanneltech" target="_blank"> <span class="elementor-screen-only">Twitter</span> <i class="fab fa-twitter"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-whatsapp elementor-repeater-item-2190cc6" href="https://wa.me/2348030655234" target="_blank"> <span class="elementor-screen-only">Whatsapp</span> <i class="fab fa-whatsapp"></i> </a> <a class="elementor-icon elementor-social-icon elementor-social-icon-telegram elementor-repeater-item-2229324" href="https://t.me/IChanneltech" target="_blank"> <span class="elementor-screen-only">Telegram</span> <i class="fab fa-telegram"></i> </a> </div> </div> </div> </div> </div> </div> </div> </div> </section> </div> </div> </div> </div> </div> </section> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </section> <section class="elementor-element elementor-element-dc373cc elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-id="dc373cc" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-row"> <div class="elementor-element elementor-element-1ad5001 elementor-column elementor-col-50 elementor-top-column" data-id="1ad5001" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-a49a390 pr-infobox-content-align-center elementor-widget elementor-widget-pr-infobox" data-id="a49a390" data-element_type="widget" data-widget_type="pr-infobox.default"> <div class="elementor-widget-container"> <a href="https://www.google.com/maps/place/IChannel+Technologies/@7.4021687,3.8920451,15.75z/data=!4m5!3m4!1s0x0:0x9c459a717b407d9a!8m2!3d7.401608!4d3.891645" target="_blank" > <div class="pr-infobox"> <div class="infobox-content"> <h3 class="title">Queen Elizabeth Road, Mokola, Ibadan</h3> <p>+234 803 065 5234</p> </div> </div></a> </div> </div> </div> </div> </div> <div class="elementor-element elementor-element-2a7854b elementor-column elementor-col-50 elementor-top-column" data-id="2a7854b" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-b02f2c6 pr-infobox-content-align-center elementor-widget elementor-widget-pr-infobox" data-id="b02f2c6" data-element_type="widget" data-widget_type="pr-infobox.default"> <div class="elementor-widget-container"> <div class="pr-infobox"> <div class="infobox-content"> <h3 class="title">Lagos, Nigeria</h3> <p>Opening soon</p> </div> </div> </div> </div> </div> </div> </div> </div> </div> </section> <section class="elementor-element elementor-element-f5aadf2 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-id="f5aadf2" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-row"> <div class="elementor-element elementor-element-cb89cd1 elementor-column elementor-col-50 elementor-top-column" data-id="cb89cd1" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-6f29a37 elementor-widget elementor-widget-text-editor" data-id="6f29a37" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <div class="elementor-text-editor elementor-clearfix">2020 © <a style="color: #fff;" href="http://ichanneltech.com">IChannel Technologies</a>, All rights reserved.</div> </div> </div> </div> </div> </div> <div class="elementor-element elementor-element-34d6525 elementor-column elementor-col-50 elementor-top-column" data-id="34d6525" data-element_type="column"> <div class="elementor-column-wrap elementor-element-populated"> <div class="elementor-widget-wrap"> <div class="elementor-element elementor-element-efb094f elementor-align-right elementor-tablet-align-center elementor-widget elementor-widget-pr-nav" data-id="efb094f" data-element_type="widget" data-widget_type="pr-nav.default"> <div class="elementor-widget-container"> <div class="pr-primary-navigation pr_nav_anime_br"> <nav itemtype="http://schema.org/SiteNavigationElement" itemscope="itemscope" class="pr-nav-primary" aria-label="Elementor Menu"> <ul data-uk-scrollspy-nav="closest: li; scroll: false" class="pr-main-menu" id="menu-footer-menu"><li id="menu-item-5105" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-5105"><a href="#">Terms of use</a></li> <li id="menu-item-57" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-57"><a href="#">Privacy Policy</a></li> <li id="menu-item-58" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-58"><a href="#">Cookie Policy</a></li> </ul> </nav> </div> </div> </div> </div> </div> </div> </div> </div> </section> </div> </div> </div> <div id='jp-relatedposts' class='jp-relatedposts' > </div></footer> </div> <script type="text/javascript"> var c = document.body.className; c = c.replace(/woocommerce-no-js/, 'woocommerce-js'); document.body.className = c; </script> <link rel='stylesheet' id='elementor-post-5139-css' href='https://ichanneltech.com/wp-content/uploads/elementor/css/post-5139.css?ver=1596559825' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-post-5138-css' href='https://ichanneltech.com/wp-content/uploads/elementor/css/post-5138.css?ver=1596559825' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-post-33-css' href='https://ichanneltech.com/wp-content/uploads/elementor/css/post-33.css?ver=1596559825' type='text/css' media='all' /> <link rel='stylesheet' id='google-fonts-2-css' href='https://fonts.googleapis.com/css?family=Roboto%3A100%2C100italic%2C200%2C200italic%2C300%2C300italic%2C400%2C400italic%2C500%2C500italic%2C600%2C600italic%2C700%2C700italic%2C800%2C800italic%2C900%2C900italic%7CRoboto+Condensed%3A100%2C100italic%2C200%2C200italic%2C300%2C300italic%2C400%2C400italic%2C500%2C500italic%2C600%2C600italic%2C700%2C700italic%2C800%2C800italic%2C900%2C900italic&ver=5.5.3' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-icons-shared-0-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/fontawesome.min.css?ver=5.12.0' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-icons-fa-brands-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/brands.min.css?ver=5.12.0' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-icons-fa-solid-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/solid.min.css?ver=5.12.0' type='text/css' media='all' /> <link rel='stylesheet' id='jet-elements-css' href='https://ichanneltech.com/wp-content/plugins/jet-elements/assets/css/jet-elements.css?ver=2.2.17' type='text/css' media='all' /> <link rel='stylesheet' id='jet-elements-skin-css' href='https://ichanneltech.com/wp-content/plugins/jet-elements/assets/css/jet-elements-skin.css?ver=2.2.17' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-icons-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/eicons/css/elementor-icons.min.css?ver=5.7.0' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-animations-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/animations/animations.min.css?ver=2.9.14' type='text/css' media='all' /> <link rel='stylesheet' id='elementor-pro-css' href='https://ichanneltech.com/wp-content/plugins/elementor-pro/assets/css/frontend.min.css?ver=2.10.3' type='text/css' media='all' /> <link rel='stylesheet' id='pr-icons-css' href='https://ichanneltech.com/wp-content/plugins/pixerex-elements/assets/css/iconfont.css?ver=1.0.0' type='text/css' media='all' /> <link rel='stylesheet' id='pr-style-css' href='https://ichanneltech.com/wp-content/plugins/pixerex-elements/assets/css/pr-style.css?ver=1.0.0' type='text/css' media='all' /> <link rel='stylesheet' id='slick-css' href='https://ichanneltech.com/wp-content/plugins/pixerex-elements/assets/css/slick.css?ver=1.0.0' type='text/css' media='all' /> <link rel='stylesheet' id='social-share-style-css' href='https://ichanneltech.com/wp-content/plugins/pixerex-elements/assets/css/social-share.css?ver=1.0.0' type='text/css' media='all' /> <link rel='stylesheet' id='font-awesome-5-all-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/all.min.css?ver=2.9.14' type='text/css' media='all' /> <link rel='stylesheet' id='font-awesome-4-shim-css' href='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/v4-shims.min.css?ver=2.9.14' type='text/css' media='all' /> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/usernoise/js/usernoise.js?ver=4.1.7' id='usernoise-button-js'></script> <script type='text/javascript' src='https://c0.wp.com/c/5.5.3/wp-includes/js/jquery/ui/effect.min.js' id='jquery-effects-core-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/theplus_elementor_addon/assets/js/extra/jquery.downCount.js?ver=5.5.3' id='downCount-js-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/theplus_elementor_addon/assets/js/extra/isotope.pkgd.js?ver=5.5.3' id='isotope-js-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/theplus_elementor_addon/assets/js/extra/packery-mode.pkgd.min.js?ver=5.5.3' id='packery-mode-js-js'></script> <script type='text/javascript' src='https://c0.wp.com/p/jetpack/8.9.1/_inc/build/photon/photon.min.js' id='jetpack-photon-js'></script> <script type='text/javascript' id='contact-form-7-js-extra'> /* <![CDATA[ */ var wpcf7 = {"apiSettings":{"root":"https:\/\/ichanneltech.com\/wp-json\/contact-form-7\/v1","namespace":"contact-form-7\/v1"}}; /* ]]> */ </script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.2.2' id='contact-form-7-js'></script> <script type='text/javascript' src='https://c0.wp.com/p/woocommerce/4.4.1/assets/js/jquery-blockui/jquery.blockUI.min.js' id='jquery-blockui-js'></script> <script type='text/javascript' id='wc-add-to-cart-js-extra'> /* <![CDATA[ */ var wc_add_to_cart_params = {"ajax_url":"\/wp-admin\/admin-ajax.php","wc_ajax_url":"\/?wc-ajax=%%endpoint%%","i18n_view_cart":"View cart","cart_url":"https:\/\/ichanneltech.com","is_cart":"","cart_redirect_after_add":"no"}; /* ]]> */ </script> <script type='text/javascript' src='https://c0.wp.com/p/woocommerce/4.4.1/assets/js/frontend/add-to-cart.min.js' id='wc-add-to-cart-js'></script> <script type='text/javascript' src='https://c0.wp.com/p/woocommerce/4.4.1/assets/js/js-cookie/js.cookie.min.js' id='js-cookie-js'></script> <script type='text/javascript' id='woocommerce-js-extra'> /* <![CDATA[ */ var woocommerce_params = {"ajax_url":"\/wp-admin\/admin-ajax.php","wc_ajax_url":"\/?wc-ajax=%%endpoint%%"}; /* ]]> */ </script> <script type='text/javascript' src='https://c0.wp.com/p/woocommerce/4.4.1/assets/js/frontend/woocommerce.min.js' id='woocommerce-js'></script> <script type='text/javascript' id='wc-cart-fragments-js-extra'> /* <![CDATA[ */ var wc_cart_fragments_params = {"ajax_url":"\/wp-admin\/admin-ajax.php","wc_ajax_url":"\/?wc-ajax=%%endpoint%%","cart_hash_key":"wc_cart_hash_e9b3cafeea86bd51f464d6774b13d96f","fragment_name":"wc_fragments_e9b3cafeea86bd51f464d6774b13d96f","request_timeout":"5000"}; /* ]]> */ </script> <script type='text/javascript' src='https://c0.wp.com/p/woocommerce/4.4.1/assets/js/frontend/cart-fragments.min.js' id='wc-cart-fragments-js'></script> <script type='text/javascript' id='wc-cart-fragments-js-after'> jQuery( 'body' ).bind( 'wc_fragments_refreshed', function() { var jetpackLazyImagesLoadEvent; try { jetpackLazyImagesLoadEvent = new Event( 'jetpack-lazy-images-load', { bubbles: true, cancelable: true } ); } catch ( e ) { jetpackLazyImagesLoadEvent = document.createEvent( 'Event' ) jetpackLazyImagesLoadEvent.initEvent( 'jetpack-lazy-images-load', true, true ); } jQuery( 'body' ).get( 0 ).dispatchEvent( jetpackLazyImagesLoadEvent ); } ); </script> <script type='text/javascript' id='wws-public-script-js-extra'> /* <![CDATA[ */ var wwsObj = {"supportNumber":"2348030655234","autoPopup":null,"plugin_url":"https:\/\/ichanneltech.com\/wp-content\/plugins\/wordpress-whatsapp-support\/","is_mobile":"0","is_product":"0","current_page_url":"https:\/\/ichanneltech.com\/intro-to-signal-processingcurve-fitting\/","current_popup_template":"1","is_popup_display_on_current_page":"1","group_invitation_id":"XYZ12345678","admin_ajax_url":"https:\/\/ichanneltech.com\/wp-admin\/admin-ajax.php","scroll_lenght":null,"auto_popup_time":"10","is_gdpr":"0","predefined_text":"----------------------%0A\r\nPage Title: Intro. to Signal Processing:Curve fitting%0A\r\nPage URL: https:\/\/ichanneltech.com\/intro-to-signal-processingcurve-fitting\/","debuggin_status":null}; /* ]]> */ </script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/wordpress-whatsapp-support/assets/public/js/wws-public-script.js?ver=1.6.5' id='wws-public-script-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/themes/2020theme/assets/js/anime.min.js?ver=2.2' id='anime-js-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/themes/2020theme/assets/js/jquery.easing.js?ver=1.3' id='jquery-easing-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/pixerex-elements/assets/js/uikit.min.js?ver=1.0.0' id='uikit-js'></script> <script type='text/javascript' id='pixe-load-more-script-js-extra'> /* <![CDATA[ */ var pixe_loadmore = {"ajaxurl":"https:\/\/ichanneltech.com\/wp-admin\/admin-ajax.php","posts":"{\"page\":0,\"name\":\"intro-to-signal-processingcurve-fitting\",\"error\":\"\",\"m\":\"\",\"p\":0,\"post_parent\":\"\",\"subpost\":\"\",\"subpost_id\":\"\",\"attachment\":\"\",\"attachment_id\":0,\"pagename\":\"\",\"page_id\":0,\"second\":\"\",\"minute\":\"\",\"hour\":\"\",\"day\":0,\"monthnum\":0,\"year\":0,\"w\":0,\"category_name\":\"\",\"tag\":\"\",\"cat\":\"\",\"tag_id\":\"\",\"author\":\"\",\"author_name\":\"\",\"feed\":\"\",\"tb\":\"\",\"paged\":0,\"meta_key\":\"\",\"meta_value\":\"\",\"preview\":\"\",\"s\":\"\",\"sentence\":\"\",\"title\":\"\",\"fields\":\"\",\"menu_order\":\"\",\"embed\":\"\",\"category__in\":[],\"category__not_in\":[],\"category__and\":[],\"post__in\":[],\"post__not_in\":[],\"post_name__in\":[],\"tag__in\":[],\"tag__not_in\":[],\"tag__and\":[],\"tag_slug__in\":[],\"tag_slug__and\":[],\"post_parent__in\":[],\"post_parent__not_in\":[],\"author__in\":[],\"author__not_in\":[],\"ignore_sticky_posts\":false,\"suppress_filters\":false,\"cache_results\":false,\"update_post_term_cache\":true,\"lazy_load_term_meta\":true,\"update_post_meta_cache\":true,\"post_type\":\"\",\"posts_per_page\":10,\"nopaging\":false,\"comments_per_page\":\"50\",\"no_found_rows\":false,\"order\":\"DESC\"}","current_page":"1","max_page":"0"}; /* ]]> */ </script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/themes/2020theme/assets/js/load-more.js?ver=1.0' id='pixe-load-more-script-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/themes/2020theme/assets/js/main-script.js?ver=1.0' id='pixe-scripts-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/jetpack/vendor/automattic/jetpack-lazy-images/src/js/lazy-images.min.js?ver=1.0.0' id='jetpack-lazy-images-js'></script> <script type='text/javascript' src='https://c0.wp.com/c/5.5.3/wp-includes/js/wp-embed.min.js' id='wp-embed-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/pixerex-core/plugins/customizer/modules/webfont-loader/vendor-typekit/webfontloader.js?ver=3.0.28' id='webfont-loader-js'></script> <script type='text/javascript' id='webfont-loader-js-after'> WebFont.load({google:{families:['Poppins:700,400,600:cyrillic,cyrillic-ext,devanagari,greek,greek-ext,khmer,latin,latin-ext,vietnamese,hebrew,arabic,bengali,gujarati,tamil,telugu,thai']}}); </script> <script type='text/javascript' src='https://www.google.com/recaptcha/api.js?render=explicit&ver=2.10.3' id='elementor-recaptcha-api-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/pixerex-elements/assets/js/pr-main.js?ver=1.0.0' id='pr-js-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/font-awesome/js/v4-shims.min.js?ver=2.9.14' id='font-awesome-4-shim-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/theplus_elementor_addon/assets/js/extra/ResizeSensor.min.js?ver=1.7.0' id='plus-resize-sensor-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/theplus_elementor_addon/assets/js/extra/sticky-sidebar.min.js?ver=3.3.1' id='plus-sticky-sidebar-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/theplus_elementor_addon/assets/js/extra/jquery.jsticky.js?ver=1.1.0' id='jsticky-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=2.9.14' id='elementor-frontend-modules-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor-pro/assets/lib/sticky/jquery.sticky.min.js?ver=2.10.3' id='elementor-sticky-js'></script> <script type='text/javascript' id='elementor-pro-frontend-js-before'> var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/ichanneltech.com\/wp-admin\/admin-ajax.php","nonce":"06553a70cd","i18n":{"toc_no_headings_found":"No headings were found on this page."},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"google":{"title":"Google+","has_counter":true},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"delicious":{"title":"Delicious"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"}},"menu_cart":{"cart_page_url":"https:\/\/ichanneltech.com","checkout_page_url":"https:\/\/ichanneltech.com"},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/ichanneltech.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; </script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=2.10.3' id='elementor-pro-frontend-js'></script> <script type='text/javascript' src='https://c0.wp.com/c/5.5.3/wp-includes/js/jquery/ui/position.min.js' id='jquery-ui-position-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/dialog/dialog.min.js?ver=4.7.6' id='elementor-dialog-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/waypoints/waypoints.min.js?ver=4.0.2' id='elementor-waypoints-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/swiper/swiper.min.js?ver=5.3.6' id='swiper-js'></script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/lib/share-link/share-link.min.js?ver=2.9.14' id='share-link-js'></script> <script type='text/javascript' id='elementor-frontend-js-before'> var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","downloadImage":"Download image"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"version":"2.9.14","urls":{"assets":"https:\/\/ichanneltech.com\/wp-content\/plugins\/elementor\/assets\/"},"settings":{"page":[],"general":{"elementor_lightbox_enable_counter":"yes","elementor_lightbox_enable_fullscreen":"yes","elementor_lightbox_enable_zoom":"yes","elementor_lightbox_enable_share":"yes","elementor_lightbox_title_src":"title","elementor_lightbox_description_src":"description"},"editorPreferences":[]},"post":{"id":730,"title":"Intro.%20to%20Signal%20Processing%3ACurve%20fitting%20-%20IChannel%20Technologies","excerpt":"","featuredImage":false}}; </script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=2.9.14' id='elementor-frontend-js'></script> <script type='text/javascript' id='jet-elements-js-extra'> /* <![CDATA[ */ var jetElements = {"ajaxUrl":"https:\/\/ichanneltech.com\/wp-admin\/admin-ajax.php","isMobile":"false","templateApiUrl":"https:\/\/ichanneltech.com\/wp-json\/jet-elements-api\/v1\/elementor-template","devMode":"false","messages":{"invalidMail":"Please specify a valid e-mail"}}; /* ]]> */ </script> <script type='text/javascript' src='https://ichanneltech.com/wp-content/plugins/jet-elements/assets/js/jet-elements.min.js?ver=2.2.17' id='jet-elements-js'></script> <script type='text/javascript' src='https://stats.wp.com/e-202048.js' async='async' defer='defer'></script> <script type='text/javascript'> _stq = window._stq || []; _stq.push([ 'view', {v:'ext',j:'1:8.9.1',blog:'151027325',post:'730',tz:'1',srv:'ichanneltech.com'} ]); _stq.push([ 'clickTrackerInit', '151027325', '730' ]); </script> </body> </html>