Some curve fitting or smoothing tools can benefit from knowledge of the noise variance to expect on your data. Kalman filters use this information, also some spline fitting tools. So I wrote a function to extract the noise variance from a signal vector. It also works on any specified dimension of an array.
A few examples of this code in use:
Simple linear data, with purely additive N(0,1) gaussian noise:
t = 0:10000;
x = t + randn(size(t));
mv = estimatenoise(x)
Gaussian noise added to a sine wave (Nominal variance = 0.01)
t = linspace(0,1,1000)';
x = sin(t*50) + randn(size(t))/10;
mv = estimatenoise(x)
Pure gaussian noise, with a nominal variance of 9. (Note that var would have been a better estimator for this particular case...)
mv = estimatenoise(3*randn(2,3,1000),3)
9.6584 8.2696 8.632
9.2404 8.5346 9.7725
A piecewise constant function with multiple discontinuities. The true noise variance should be 0.01.
t = linspace(0,1,1000);
X = round(cos(t*6*pi)) + randn(size(t))/10;
var(X) % var will be wildly in error
Test if estimatenoise is able to recover the variance of a normally distributed random sample with unit variance. (Yes, it will be much slower than var.)
Estimatenoise can now handle non-uniformly spaced series (by request.) In the next example,
the actual noise variance was 1.0 here. Perform the operation 1000 times, then look at the median variance estimate. How well did we do?
t = sort([randn(1,100) , randn(1,100)+5]);
X = repmat(sin(t*5)*100,1000,1) + ...
Estimatenoise is clearly wrong when the spacing is ignored.
Supplying the sampling "times", we get quite a reasonable result.
Estimatenoise also works on data with replicates. In this example, each point will be replicated up to 3 times. The actual noise variance was again 1.0 here. I'll also compare the increase in times required for estimatenoise when t is supplied.
t = sort([0:1:100, 1:2:100, 1:4:100]);
X = repmat(sin(t/10)*100,1000,1)+ ...
Again, estimatenoise is clearly wrong when the non-uniform spacing is ignored.
Elapsed time is 2.690135 seconds.
Supplying the sampling "times", we again get quite a reasonable result. The time penalty is not quite 2x.
Elapsed time is 4.864486 seconds.
John D'Errico (2022). Estimatenoise (https://www.mathworks.com/matlabcentral/fileexchange/16683-estimatenoise), MATLAB Central File Exchange. Retrieved .
MATLAB Release Compatibility
Platform CompatibilityWindows macOS Linux
Inspired: Noise variance estimation, Reverberation Time Calculator, Nth Octave Test Signal, Nth_Oct_Hand_Arm_&_AC_Filter_Tool_Box, Continuous Sound and Vibration Analysis, Sound Power Directivity Analysis
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!