Hi Jim,

Thanks for the corrections. Was way to tired to get the uniform and normal distributions right.

rand() is then by classical UNIX tradition is generated as a unsigned integer divided by the suitable (32th) power of two, so the maximum value will not be there, and this is why a small bias is introduced, since 0 can be reached but not 1.

In practice the bias is small, but care is taken never the less.

Cheers,
Magnus

On 2022-05-03 03:43, Lux, Jim wrote:
On 5/2/22 6:09 PM, Magnus Danielson via time-nuts wrote:
Matthias,

On 2022-05-02 17:12, Matthias Welwarsky wrote:
Dear all,

I'm trying to come up with a reasonably simple model for an OCXO that I can parametrize to experiment with a GPSDO simlator. For now I have the following matlab function that "somewhat" does what I think is reasonable, but I would
like a reality check.

This is the matlab code:

function [phase] = synth_osc(samples,da,wn,fn)
# aging
phase = (((1:samples)/86400).^2)*da;
# white noise
phase += (rand(1,samples)-0.5)*wn;
# flicker noise
phase += cumsum(rand(1,samples)-0.5)*fn;
end

There are three components in the model, aging, white noise and flicker noise,
with everything expressed in fractions of seconds.

The first term basically creates a base vector that has a quadratic aging function. It can be parametrized e.g. from an OCXO datasheet, daily aging
given in s/s per day.

The second term models white noise. It's just a random number scaled to the
desired 1-second uncertainty.

The third term is supposed to model flicker noise. It's basically a random
walk scaled to the desired magnitude.

<snip>

Another thing. I think the rand function you use will give you a normal distribution rather than one being Gaussian or at least pseudo-Gaussian.

rand() gives uniform distribution from [0,1). (Matlab's doc says (0,1), but I've seen zero, but never seen 1.) What you want is randn(), which gives a zero mean, unity variance Gaussian distribution.

https://www.mathworks.com/help/matlab/ref/randn.html


A very quick-and-dirty trick to get pseudo-Gaussian noise is to take 12 normal distribution random numbers, subtract them pair-wise and then add the six pairs.

That would be for uniform distribution. A time-honored approach from the IBM Scientific Subroutine Package.


The subtraction removes any bias. The 12 samples will create a normalized deviation of 1.0, but the peak-to-peak limit is limited to be within +/- 12, so it may not be relevant for all noise simultations. Another approach is that of Box-Jenkins that creates much better shape, but comes at some cost in basic processing.
_______________________________________________
time-nuts mailing list -- time-nuts@lists.febo.com -- To unsubscribe send an email to time-nuts-le...@lists.febo.com
To unsubscribe, go to and follow the instructions there.
_______________________________________________
time-nuts mailing list -- time-nuts@lists.febo.com -- To unsubscribe send an 
email to time-nuts-le...@lists.febo.com
To unsubscribe, go to and follow the instructions there.

Reply via email to