Attached are some more renderings of John Seamons' WWVB data.  This is
what one might expect from a receiver that knows when the phase
reversals happen and takes them out noiselessly---re-reversing the
out-of-phase bursts to recover an approximation of the usual WWVB

The first plot shows the entire interval of the recording, about 210
seconds.  The Y axis is phase in radians.  Whenever the phase was
greater than 90 degrees or less than -90 degrees, that sample was
assumed to be part of a phase-reversed segment, and 180 degrees was
added to bring it into alignment.

The spikes are the phase reversals.  The phase-modulation test ends at
around 138 seconds, and there is an interval of no signal, during
which the phase is random.  Finally the old WWVB picks up at around
158 seconds.

The interesting thing here is the phase jitter during the test, which
seems significantly worse than the normal WWVB signal.  The short
spikes can be ignored---it's the performance during the bulk of any
given one-second interval that's important.  The phase is jumping
around on a second-by-second basis by 0.1 radians or so (about 0.3
microseconds).  The normal WWVB signal, by contrast, is nice and

The second plot shows a closeup.  Around the 85-second mark, for
example, the phase is clearly jumping around.

Also attached is the Octave code that produced the plots (Octave is a
free-software system similar to Matlab).


<<attachment: wwvb-phase1.png>>

<<attachment: wwvb-phase2.png>>

y = wavread('');     # read in the WAV file
x = y(:,1);                                      # extract the first channel (containing the raw samples)
n = length(x);                                   # total number of samples
t = 0:(n-1)';                                    # time vector
fs = 8000;                                       # sample rate

phase0 = 0.1;                                    # carrier parameters
freq0 = 0.23121151;
drift0 = 2.0e-13;

p = phase0 + t.*(freq0+t*drift0);                # vector of carrier phases
c = exp(2*pi*i*p)';                              # synthesize the carrier

z = c.*x;                                        # multiply by carrier to downconvert to complex baseband
zf = filter(ones(1,15),[1],z);                   # simple boxcar lowpass filter
zf = zf/1.67;                                    # rescale so the peak is near 1.0

#plot(real(zf(277000:365000)));                  # plot a segment of the waveform
#grid on;

#plot(zf(1:1e6));                                # plot a constellation diagram of the PM part of the test

q = arg(zf);                                     # extract the phase
q(q>pi/2) -= pi;                                 # remove 180-degree phase reversals
q(q<-pi/2) += pi;

plot(t/fs,q);                                    # plot the result
time-nuts mailing list --
To unsubscribe, go to
and follow the instructions there.

Reply via email to