Circular-T nr.357

Following the publication of Circular-T nr. 357 we shall take a look at the RMS error of UTC-UTC(k) in different laboratories across the world. Should we rank the 75 laboratories that have complete UTC-UTC(k) records by RMS error for this month we find the following.

Warning: Past performance is not an indicator of future results.

Circular-T 357 RMS Ranking list, top 10 labs
Rank Lab (Location)       RMS( UTC-UTC(k) ) / ns
1  MIKE (Espoo)           0.524 ns
2  PTB (Braunschweig)     1.056 ns
3  NIST (Boulder)         1.528 ns
4  ORB (Bruxelles)        1.556 ns
5  NPL (Teddington)       1.627 ns
6  NTSC (Lintong)         1.671 ns
7  OP (Paris)             2.090 ns
8  TL (Chung-Li)          2.095 ns
9  USNO (Washington_DC)   2.356 ns
10  SP (Boras)            2.409 ns

It's much easier to be lucky than brilliant, so maybe we have to look one further month back and do the same thing for Circular T 356:

Circular-T 356 RMS Ranking list, top 10 labs
Rank Lab (Location)     RMS( UTC-UTC(k) ) / ns
1  ESTC (Noordwijk)     0.504 ns
2  PTB (Braunschweig)   1.058 ns
3  OP (Paris)           1.198 ns
4  BY (Minsk)           1.340 ns
5  APL (Laurel)         1.409 ns
6  USNO (Washington_DC) 1.468 ns
7  NIST (Boulder)       2.372 ns
8  MIKE (Espoo)         2.683 ns
9  ORB (Bruxelles)      2.711 ns
10  SP (Boras)          2.920 ns

For completeness, here is the whole list for Circular-T nr. 357:

Circular-T 357 RMS Ranking list, all labs with complete data
Rank Lab (Location)       RMS( UTC-UTC(k) ) / ns
1  MIKE (Espoo)           0.524 ns
2  PTB (Braunschweig)     1.056 ns
3  NIST (Boulder)         1.528 ns
4  ORB (Bruxelles)        1.556 ns
5  NPL (Teddington)       1.627 ns
6  NTSC (Lintong)         1.671 ns
7  OP (Paris)             2.090 ns
8  TL (Chung-Li)          2.095 ns
9  USNO (Washington_DC)   2.356 ns
10  SP (Boras)            2.409 ns
11  APL (Laurel)          2.450 ns
12  CNM (Queretaro)       2.793 ns
13  UA (Kharkov)          2.870 ns
14  SG (Singapore)        2.981 ns
15  BY (Minsk)            3.137 ns
16  ONRJ (Rio_de_Janeiro) 3.600 ns
17  JATC (Lintong)        3.604 ns
18  ESTC (Noordwijk)      3.606 ns
19  ROA (San_Fernando)    3.763 ns
20  AOS (Borowiec)        3.944 ns
21  NIM (Beijing)         3.963 ns
22  IT (Torino)           4.025 ns
23  SU (Moskva)           4.842 ns
24  ZA (Pretoria)         5.394 ns
25  NICT (Tokyo)          5.683 ns
26  SMD (Bruxelles)       6.120 ns
27  NMIJ (Tsukuba)        6.273 ns
28  IMBH (Sarajevo)       6.473 ns
29  INXE (Rio_de_Janeiro) 7.582 ns
30  PL (Warszawa)         8.894 ns
31  DMDM (Belgrade)       9.541 ns
32  INTI (Buenos_Aires)   10.073 ns
33  NPLI (New-Delhi)      12.113 ns
34  INM (Bogota_D.C.)     14.139 ns
35  JV (Kjeller)          15.528 ns
36  VMI (Ha_Noi)          17.306 ns
37  UAE (Abu_Dhabi)       17.589 ns
38  VSL (Delft)           18.876 ns
39  TP (Praha)            21.305 ns
40  ICE (San_Jose)        21.597 ns
41  CH (Bern-Wabern)      24.486 ns
42  CNMP (Panama)         27.643 ns
43  CNES (Toulouse)       28.227 ns
44  BEV (Wien)            28.679 ns
45  SCL (Hong_Kong)       29.698 ns
46  NIS (Cairo)           31.465 ns
47  DTAG (Frankfurt/M)    32.215 ns
48  BIRM (Beijing)        32.899 ns
49  INPL (Jerusalem)      33.533 ns
50  NRC (Ottawa)          46.487 ns
51  KRIS (Daejeon)        46.607 ns
52  NAO (Mizusawa)        91.237 ns
53  INCP (Lima)           123.056 ns
54  DLR (Oberpfaffenhofen)147.241 ns
55  LT (Vilnius)          158.796 ns
56  KIM (Serpong-Tangerang)174.536 ns
57  NIMT (Pathumthani)    214.943 ns
58  SIQ (Ljubljana)       297.257 ns
59  MSL (Lower_Hutt)      299.413 ns
60  KZ (Astana)           314.082 ns
61  AUS (Sydney)          413.887 ns
62  SASO (Riyadh)         614.583 ns
63  NMLS (Sepang)         692.325 ns
64  BOM (Skopje)          837.749 ns
65  IFAG (Wettzell)       936.185 ns
66  HKO (Hong_Kong)       1089.931 ns
67  MTC (Makkah)          1167.348 ns
68  SMU (Bratislava)      1419.064 ns
69  NIMB (Bucharest)      1812.964 ns
70  ONBA (Buenos_Aires)   2222.486 ns
71  UME (Gebze-Kocaeli)   2403.381 ns
72  BIM (Sofiya)          7003.478 ns
73  DFNT (Tunis)          20450.450 ns
74  MBM (Podgorica)       52659.580 ns
75  MKEH (Budapest)       65626.933 ns

Pulse distribution amplifier output skew

Here is the measured output delay skew from four of my "PDA 2017.01" designs, based on LT1711 comparator driving a 74AC14 schmidt trigger which in turn drives eight 74AC04 output-stages.

Also included is my earlier measurement of an Ettus OctoClock.

Although the PCB was designed with equal-length traces for the output stages it appears that channels 3-4 and 5-6 are consistently late, and some shortening of the traces would improve things. I tried this on one PCB (blue data points) with moderate success.

Measurement setup: 1PPS source to 50-ohm splitter. One output of the splitter drives CH1(start) of a time interval counter (HPAK 53230A), the other output drives the input of the pulse distribution amplifier. Outputs wired to CH2(stop) of the counter and measured for 100 s or more (delay is average of 100 pulses). Counter inputs DC-coupled, 50 Ohms, trigger level 1.0 V.

Frequency Distribution Amplifier 2017.01

1:8 frequency distribution amplifier based on LMH6702 and LMH6609 op-amps.

In particular the power-supply section using a common-mode choke, a Murata BNX025 filter, and low-noise regulators LT1963 and LT3015 seems to work quite well. I also used ferrites (2 kOhm @ 100 MHz) as well as an RC-filter on all supply pins. Perhaps overkill? Performance with the intended AC/DC brick is still to be verified.

Measurements around 10 MHz show a 1 dB compression at over 14 dBm and an IP3 of around 27 to 30 dBm. The gain extends beyond 100 MHz with some gain-peaking.

Some measurements of residual phase-noise with a 3120A phase-meter, at 10 MHz. My earlier distribution amplifier required shielding with aluminium foil as well as powering from a lead-acid battery to achieve a reasonably quiet phase-noise spectrum. These measurements were done with lab power-supplies for +/-12 V to the board and without any shielding.

Finally some measurements of gain vs. frequency with a Rigol spectrum analyzer.


Pulse Distribution Amplifier 2017.01

A new pulse distribution amplifier for 1PPS distribution.

The input is fed to a LT1711 comparator triggering at 1.0 V (set by reference ADR423). This edge is buffered by 74AC14 before 1:8 fan-out to output-stages with three 74AC04 inverters in parallel driving the outputs.

Preliminary measurements show around 200ps channel-to-channel propagation skew - to be improved on by further trace-length matching or tuning. More measurements to follow.

Distribution Amplifier 2017.01

A new distribution amplifier design featuring a 1PPS pulse distribution amplifier (PDA) and a 5/10 MHz frequency distribution amplifier (FDA).

1U 150mm deep rack-enclosure from Schaeffer. Prototype PCBs without soldermask or silkscreen from Prinel. Both the FDA and PDA boards have 1:8 fan-out with 9 BNC (optionally SMA) connectors spaced 16mm apart. The boards fit comfortably side-by side on a 19" rack panel. Some funky BNC-cables with unusually large connectors may not fit side-by-side 16mm apart - a price to pay for the compact design. The plan is to use an +/-12 AC/DC brick power-supply (not shown) which fits in the back of the enclosure.

Detailed posts on the PDA and FDA boards to follow.

AllanTools 2016.11 - now with Confidence Intervals!


I've added confidence interval estimation to allantools, based on a 2004 paper by Greenhall & Riley: "Uncertainty of stability variances based on finite differences"

So far not much is automated so you have to run everything manually. After a normal call to allantools.adev() to calculate the ADEV we loop through each (tau, adev) pair and first call allantools.edf_greenhall() to get the number of equivalent-degrees-of-freedom (EDF), and then evaluate a confidence interval with allantools.confidence_interval(). A knowledge or estimate of the noise type "alpha" is required for edf_greenhall() - here we just assume alpha=0.

This example is on github at:

import numpy
import matplotlib.pyplot as plt
import allantools as at
# this demonstrates how to calculate confidence intervals for ADEV
# using the algorithms from Greenhall2004
data_file = '../tests/phasedat/PHASE.DAT'
def read_datafile(filename):
    p = []
    with open(filename) as f:
        for line in f:
            if not line.startswith("#"):  # skip comments
    return p
# read input data from file
phase = read_datafile(data_file)
# normal ADEV computation, giving naive 1/sqrt(N) errors
(taus,devs,errs,ns) = at.adev(phase, taus='octave')
# Confidence-intervals for each (tau,adev) pair separately.
for (t,dev) in zip(taus,devs):
    # Greenhalls EDF (Equivalent Degrees of Freedom)
    # alpha     +2,...,-4   noise type, either estimated or known
    # d         1 first-difference variance, 2 allan variance, 3 hadamard variance
    #           we require: alpha+2*d >1     (is this ever false?)
    # m         tau/tau0 averaging factor
    # N         number of phase observations
    edf = at.edf_greenhall( alpha=0, d=2, m=t, N=len(phase), overlapping = False, modified=False )
    # with the known EDF we get CIs 
    # for 1-sigma confidence we set
    # ci = scipy.special.erf(1/math.sqrt(2)) = 0.68268949213708585
    (lo,hi) = at.confidence_intervals( dev=dev, ci=0.68268949213708585, edf=edf )
    cis.append( (lo,hi) )
# now we are ready to print and plot the results
print "Tau\tmin Dev\t\tDev\t\tMax Dev"
for (tau,dev,ci) in zip(taus,devs,cis):
    print "%d\t%f\t%f\t%f" % (tau, ci[0], dev, ci[1] )
""" output is
Tau	min Dev		Dev		Max Dev
1	0.285114	0.292232	0.299910
2	0.197831	0.205102	0.213237
4	0.141970	0.149427	0.158198
8	0.102541	0.110135	0.119711
16	0.056510	0.062381	0.070569
32	0.049153	0.056233	0.067632
64	0.027109	0.032550	0.043536
128	0.026481	0.033855	0.055737
256	0.007838	0.010799	0.031075
err_lo = [ d-ci[0] for (d,ci) in zip(devs,cis)]
err_hi = [ ci[1]-d for (d,ci) in zip(devs,cis)]
plt.errorbar(taus, devs, yerr=[ err_lo, err_hi ] ,fmt='o')
plt.xlabel('Tau (s)')
plt.title('AllanTools 2016.11 - now with Confidence Intervals!')
# just to check plot the intervals as dots also
plt.plot(taus, [ci[0] for ci in cis],'r.')
plt.plot(taus, [ci[1] for ci in cis],'g.')

Ettus OctoClock distribution amplifier

I measured the phase-noise of an Ettus OctoClock distribution amplifier. These plots compare it to earlier measurements on an SRS FS710 and a Symmetricom 6502 as well as my own TADD-1 inspired AD8055 prototype.

OctoClock schematic here:

10 MHz clock-distribution chip:

For time-nuts kind of stuff (H-masers!) the 10 MHz phase-noise doesn't look that great, and there is something funky going on in the AM noise!? The box is powered by a +6 VDC wall-wart PSU which is probably the cause of all those spikes...

The PPS-channels are based on 7404 hex-inverters and look OK. 200ps of skew is equivalent to 4 cm of trace-length (?) - which seems like a lot if there was an effort to minimize it... For a 1 V/ns rise-time pulse 200ps is equivalent to 200mV of DC-offset in either the signal or the counter trigger-level which also seems like a lot?