The demodulation and decoding algorithms used by this driver are based on a machine language program developed for the TAPR DSP93 DSP unit, which uses the TI 320C25 DSP chip. The analysis, design and performance of the program running on this unit is described in: Mills, D.L. A precision radio clock for WWV transmissions. Electrical Engineering Report 97-8-1, University of Delaware, August 1997, 25 pp. Available from www.eecis.udel.edu/~mills/reports.htm. For use in this driver, the original program was rebuilt in the C language and adapted to the NTP driver interface. The algorithms have been modified somewhat to improve performance under weak signal conditions and to provide an automatic station identification feature.
This driver incorporates several features in common with other audio drivers such as described in the Radio CHU Audio Demodulator/Decoder and the IRIG Audio Decoder pages. They include automatic gain control (AGC), selectable audio codec port and signal monitoring capabilities. For a discussion of these common features, as well as a guide to hookup, debugging and monitoring, see the Reference Clock Audio Drivers page.
The WWV signal format is described in NIST Special Publication 432 (Revised 1990). It consists of three elements, a 5-ms, 1000-Hz pulse, which occurs at the beginning of each second, a 800-ms, 1000-Hz pulse, which occurs at the beginning of each minute, and a pulse-width modulated 100-Hz subcarrier for the data bits, one bit per second. The WWVH format is identical, except that the 1000-Hz pulses are sent at 1200 Hz. Each minute encodes nine BCD digits for the time of century plus seven bits for the daylight savings time (DST) indicator, leap warning indicator and DUT1 correction.
As in the original program, the clock discipline is modelled as a Markov process, with probabilistic state transitions corresponding to a conventional clock and the probabilities of received decimal digits. The result is a performance level which results in very high accuracy and reliability, even under conditions when the minute beep of the signal, normally its most prominent feature, can barely be detected by ear with a shortwave receiver.
The analog audio signal from the shortwave radio is sampled at 8000 Hz and converted to digital representation. The 1000/1200-Hz pulses and 100-Hz subcarrier are first separated using two IIR filters, a 600-Hz bandpass filter centered on 1100 Hz and a 150-Hz lowpass filter. The minute sync pulse is extracted using a 800-ms synchronous matched filter and pulse grooming logic which discriminates between WWV and WWVH signals and noise. The second sync pulse is extracted using a 5-ms FIR matched filter and 8000-stage comb filter.
The phase of the 100-Hz subcarrier relative to the second sync pulse is fixed at the transmitter; however, the audio highpass filter in most radios affects the phase response at 100 Hz in unpredictable ways. The driver adjusts for each radio using two 170-ms synchronous matched filters. The I (in-phase) filter is used to demodulate the subcarrier envelope, while the Q (quadrature-phase) filter is used in a tracking loop to discipline the codec sample clock and thus the demodulator phase.
The data bit probabilities are determined from the subcarrier envelope using a threshold-corrected slicer. The averaged envelope amplitude 30 ms from the beginning of the second establishes the minimum (noise floor) value, while the amplitude 200 ms from the beginning establishes the maximum (signal peak) value. The slice level is midway between these two values. The negative-going envelope transition at the slice level establishes the length of the data pulse, which in turn establish probabilities for binary zero (P0) or binary one (P1). The values are established by linear interpolation between the pulse lengths for P0 (300 ms) and P1 (500 ms) so that the sum is equal to one. If the driver has not synchronized to the minute pulse, or if the data bit amplitude, signal/noise ratio (SNR) or length are below thresholds, the bit is considered invalid and all three probabilities are set to zero.
The difference between the P1 and P0 probabilities, or likelihood, for each data bit is exponentially averaged in a set of 60 accumulators, one for each second, to determine the semi-static miscellaneous bits, such as DST indicator, leap second warning and DUT1 correction. In this design, an average value larger than a positive threshold is interpreted as a hit on one and a value smaller than a negative threshold as a hit on zero. Values between the two thresholds, which can occur due to signal fades or loss of signal, are interpreted as a miss, and result in no change of indication.
The BCD digit in each digit position of the timecode is represented as four data bits, all of which must be valid for the digit itself to be considered valid. If so, the bits are correlated with the bits corresponding to each of the valid decimal digits in this position. If the digit is invalid, the correlated value for all digits in this position is assumed zero. In either case, the values for all digits are exponentially averaged in a likelihood vector associated with this position. The digit associated with the maximum over all of the averaged values then becomes the maximum likelihood selection for this position and the ratio of the maximum over the next lower value becomes the likelihood ratio.
The decoding matrix contains nine row vectors, one for each digit position. Each row vector includes the maximum likelihood digit, likelihood vector and other related data. The maximum likelihood digit for each of the nine digit positions becomes the maximum likelihood time of the century. A built-in transition function implements a conventional clock with decimal digits that count the minutes, hours, days and years, as corrected for leap seconds and leap years. The counting operation also rotates the likelihood vector corresponding to each digit as it advances. Thus, once the clock is set, each clock digit should correspond to the maximum likelihood digit as transmitted.
Each row of the decoding matrix also includes a compare counter and the difference (modulo the radix) between the current clock digit and most recently determined maximum likelihood digit. If a digit likelihood exceeds the decision level and the difference is constant for a number of successive minutes in any row, the maximum likelihood digit replaces the clock digit in that row. When this condition is true for all rows and the second epoch has been reliably determined, the clock is set (or verified if it has already been set) and delivers correct time to the integral second. The fraction within the second is derived from the logical master clock, which runs at 8000 Hz and drives all system timing functions.
The logical master clock is derived from the audio codec clock. Its frequency is disciplined by a frequency-lock loop (FLL) which operates independently of the data recovery functions. At averaging intervals determined by the measured jitter, the frequency error is calculated as the difference between the most recent and the current second epoch divided by the interval. The sample clock frequency is then corrected by this amount using an exponential average. When first started, the frequency averaging interval is eight seconds, in order to compensate for intrinsic codec clock frequency offsets up to 125 PPM. Under most conditions, the averaging interval doubles in stages from the initial value to over 1000 seconds, which results in an ultimate frequency precision of 0.125 PPM, or about 11 ms/day.
It is important that the logical clock frequency is stable and accurately determined, since in most applications the shortwave radio will be tuned to a fixed frequency where WWV or WWVH signals are not available throughout the day. In addition, in some parts of the US, especially on the west coast, signals from either or both WWV and WWVH may be available at different times or even at the same time. Since the propagation times from either station are almost always different, each station must be reliably identified before attempting to set the clock.
Station identification uses the 800-ms minute pulse transmitted by each station. In the acquisition phase the entire minute is searched using both the WWV and WWVH using matched filters and a pulse gate discriminator similar to that found in radar acquisition and tracking receivers. The peak amplitude found determines a range gate and window where the next pulse is expected to be found. The minute is scanned again to verify the peak is indeed in the window and with acceptable amplitude, SNR and jitter. At this point the receiver begins to track the second sync pulse and operate as above until the clock is set.
Once the minute is synchronized, the range gate is fixed and only energy within the window is considered for the minute sync pulse. A compare counter increments by one if the minute pulse has acceptable amplitude, SNR and jitter and decrements otherwise. This is used as a quality indicator and reported in the timecode and also for the autotune function described below.
It is the intent of the design that the accuracy and stability of the indicated time be limited only by the characteristics of the propagation medium. Conventional wisdom is that synchronization via the HF medium is good only to a millisecond under the best propagation conditions. The performance of the NTP daemon disciplined by the driver is clearly better than this, even under marginal conditions. Ordinarily, with marginal to good signals and a frequency averaging interval of 1024 s, the frequency is stabilized within 0.1 PPM and the time within 125 ms. The frequency stability characteristic is highly important, since the clock may have to free-run for several hours before reacquiring the WWV/H signal.
The expected accuracy over a typical day was determined using the DSP93 and an oscilloscope and cesium oscillator calibrated with a GPS receiver. With marginal signals and allowing 15 minutes for initial synchronization and frequency compensation, the time accuracy determined from the WWV/H second sync pulse was reliably within 125 ms. In the particular DSP-93 used for program development, the uncorrected CPU clock frequency offset was 45.8±0.1 PPM. Over the first hour after initial synchronization, the clock frequency drifted about 1 PPM as the frequency averaging interval increased to the maximum 1024 s. Once reaching the maximum, the frequency wandered over the day up to 1 PPM, but it is not clear whether this is due to the stability of the DSP-93 clock oscillator or the changing height of the ionosphere. Once the frequency had stabilized and after loss of the WWV/H signal, the frequency drift was less than 0.5 PPM, which is equivalent to 1.8 ms/h or 43 ms/d. This resulted in a step phase correction up to several milliseconds when the signal returned.
The measured propagation delay from the WWV transmitter at Boulder, CO, to the receiver at Newark, DE, is 23.5±0.1 ms. This is measured to the peak of the pulse after the second sync comb filter and includes components due to the ionospheric propagation delay, nominally 8.9 ms, communications receiver delay and program delay. The propagation delay can be expected to change about 0.2 ms over the day, as the result of changing ionosphere height. The DSP93 program delay was measured at 5.5 ms, most of which is due to the 400-Hz bandpass filter and 5-ms matched filter. Similar delays can be expected of this driver.
The driver then acquires second sync, which can take up to several minutes, depending on signal quality. At the same time the driver accumulates likelihood values for each of the nine digits of the clock, plus the seven miscellaneous bits included in the WWV/H transmission format. The minute units digit is decoded first and, when five repetitions have compared correctly, the remaining eight digits are decoded. When five repetitions of all nine digits have decoded correctly, which normally takes 15 minutes with good signals and up to an hour when buried in noise, and the second sync alarm has not been raised for two minutes, the clock is set (or verified) and is selectable to discipline the system clock.
As long as the clock is set or verified, the system clock offsets are provided once each second to the reference clock interface, where they are saved in a buffer. At the end of each minute, the buffer samples are groomed by the median filter and trimmed-mean averaging functions. Using these functions, the system clock can in principle be disciplined to a much finer resolution than the 125-ms sample interval would suggest, although the ultimate accuracy is probably limited by propagation delay variations as the ionspheric height varies throughout the day and night.
As long as signals are available, the clock frequency is disciplined for use during times when the signals are unavailable. The algorithm refines the frequency offset using increasingly longer averaging intervals to 1024 s, where the precision is about 0.1 PPM. With good signals, it takes well over two hours to reach this degree of precision; however, it can take many more hours than this in case of marginal signals. Once reaching the limit, the algorithm will follow frequency variations due to temperature fluctuations and ionospheric height variations.
It may happen as the hours progress around the clock that WWV and WWVH signals may appear alone, together or not at all. When the driver is first started, the NTP reference identifier appears as NONE. When the driver has acquired one or both stations and mitigated which one is best, it sets the station identifier in the timecode as described below. In addition, the NTP reference identifier is set to the station callsign. If the propagation delays has been properly set with the fudge time1 (WWV) and fudge time2 (WWVH) commands in the configuration file, handover from one station to the other will be seamless.
Once the clock has been set for the first time, it will appear reachable and selectable to discipline the system clock, even if the broadcast signal fades to obscurity. A consequence of this design is that, once the clock is set, the time and frequency are disciplined only by the second sync pulse and the clock digits themselves are driven by the clock state machine and ordinarily never changed. However, as long as the clock is set correctly, it will continue to read correctly after a period of signal loss, as long as it does not drift more than 500 ms from the correct time. Assuming the clock frequency can be disciplined within 1 PPM, the clock could coast without signals for some 5.8 days without exceeding that limit. If for some reason this did happen, the clock would be in the wrong second and would never resynchronize. To protect against this most unlikely situation, if after four days with no signals, the clock is considered unset and resumes the synchronization procedure from the beginning.
To work well, the driver needs a communications receiver with good audio response at 100 Hz. Most shortwave and communications receivers roll off the audio response below 250 Hz, so this can be a problem, especially with receivers using DSP technology, since DSP filters can have very fast rolloff outside the passband. Some DSP transceivers, in particular the ICOM 775, have a programmable low frequency cutoff which can be set as low as 80 Hz. However, this particular radio has a strong low frequency buzz at about 10 Hz which appears in the audio output and can affect data recovery under marginal conditions. Although not tested, it would seem very likely that a cheap shortwave receiver could function just as well as an expensive communications receiver.
The driver includes provisions to automatically tune the radio in response to changing radio propagation conditions throughout the day and night. The radio interface is compatible with the ICOM CI-V standard, which is a bidirectional serial bus operating at TTL levels. The bus can be connected to a serial port using a level converter such as the CT-17. The serial port speed is presently compiled in the program, but can be changed in the driver source file.
Each ICOM radio is assigned a unique 8-bit ID select code, usually expressed in hex format. To activate the CI-V interface, the mode keyword of the server configuration command specifies a nonzero select code in decimal format. A table of ID select codes for the known ICOM radios is given below. Since all ICOM select codes are less than 128, the high order bit of the code is used by the driver to specify the baud rate. If this bit is not set, the rate is 9600 bps for the newer radios; if set, the rate is 1200 bps for the older radios. A missing mode keyword or a zero argument leaves the interface disabled.
If specified, the driver will attempt to open the device /dev/icom and, if successful will activate the autotune function and tune the radio to each operating frequency in turn while attempting to acquire minute sync from either WWV or WWVH. However, the driver is liberal in what it assumes of the configuration. If the /dev/icom link is not present or the open fails or the CI-V bus or radio is inoperative, the driver quietly gives up with no harm done.
Once acquiring minute sync, the driver operates as described above to set the clock. However, during seconds 59, 0 and 1 of each minute it tunes the radio to one of the five broadcast frequencies to measure the sync pulse and data pulse amplitudes and SNR and update the compare counter. Each of the five frequencies are probed in a five-minute rotation to build a database of current propagation conditions for all signals that can be heard at the time. At the end of each rotation, a mitigation procedure scans the database and retunes the radio to the best frequency and station found. For this to work well, the radio should be set for a fast AGC recovery time. This is most important while tracking a strong signal, which is normally the case, and then probing another frequency, which may have much weaker signals.
Reception conditions for each frequency and station are evaluated according to a metric which considers the minute sync pulse amplitude, SNR and jitter, as well as, the data pulse amplitude and SNR. The minute pulse is evaluated at second 0, while the data pulses are evaluated at seconds 59 and 1. The results are summarized in a scoreboard of three bits
If none of the scoreboard bits are set, the compare counter is increased by one to a maximum of six. If any bits are set, the counter is decreased by one to a minimum of zero. At the end of each minute, the frequency and station with the maximum compare count is chosen, with ties going to the highest frequency.
The autotune process produces diagnostic information along with the timecode. This is very useful for evaluating the performance of the algorithm, as well as radio propagation conditions in general. The message is produced once each minute for each frequency in turn after minute sync has been acquired.
wwv5 port agc wwv wwvh
where port and agc are the audio port and gain, respectively, for this frequency and wwv and wwvh are two sets of fields, one each for WWV and WWVH. Each of the two fields has the format
ident score comp sync/snr/jitr
where identencodes the station (C for WWV, H for WWVH) and frequency (2, 5, 10, 15 and 20), score is the scoreboard described above, comp is the compare counter, sync is the minute sync pulse amplitude, snr the SNR of the pulse and jitr is the sample difference between the current epoch and the last epoch. An example is:
wwv5 2 111 C20 0100 6 8348/30.0/-3 H20 0203 0 22/-12.4/8846
Here the radio is tuned to 20 MHz and the line-in port AGC is currently 111 at that frequency. The message contains a report for WWV (C20) and WWVH (H20). The WWV report scoreboard is 0100 and the compare count is 6, which suggests very good reception conditions, and the minute sync amplitude and SNR are well above thresholds (2000 and 20 dB, respectively). Probably the most sensitive indicator of reception quality is the jitter, -3 samples, which is well below threshold (50 ms or 400 samples). While the message shows solid reception conditions from WWV, this is not the case for WWVH. Both the minute sync amplitude and SNR are below thresholds and the jitter is above threshold.
A sequence of five messages, one for each minute, might appear as follows:
wwv5 2 95 C2 0107 0 164/7.2/8100 H2 0207 0 80/-5.5/7754 wwv5 2 99 C5 0104 0 3995/21.8/395 H5 0207 0 27/-9.3/18826 wwv5 2 239 C10 0105 0 9994/30.0/2663 H10 0207 0 54/-16.1/-529 wwv5 2 155 C15 0103 3 3300/17.8/-1962 H15 0203 0 236/17.0/4873 wwv5 2 111 C20 0100 6 8348/30.0/-3 H20 0203 0 22/-12.4/8846
Clearly, the only frequencies that are available are 15 MHz and 20 MHz and propagation may be failing for 15 MHz. However, minute sync pulses are being heard on 5 and 10 MHz, even though the data pulses are not. This is typical of late afternoon when the maximum usable frequency (MUF) is falling and the ionospheric loss at the lower frequencies is beginning to decrease.
The most convenient way to track the driver status is using the ntpq program and the clockvar command. This displays the last determined timecode and related status and error counters, even when the driver is not discipline the system clock. If the debugging trace feature (-d on the ntpd command line)is enabled, the driver produces detailed status messages as it operates. If the fudge flag 4 is set, these messages are written to the clockstats file. All messages produced by this driver have the prefix chu for convenient filtering with the Unix grep command.
In the following descriptions the units of amplitude, phase, probability and likelihood are normalized to the range 0-6000 for convenience. In addition, the signal/noise ratio (SNR) and likelihood ratio are measured in decibels and the words with bit fields are in hex. Most messages begin with a leader in the following format:
wwvn ss stat sigl
where wwvn is the message code, ss the second of minute, stat the driver status word and sigl the second sync pulse amplitude. A full explanation of the status bits is contained in the driver source listing; however, the following are the most useful for debugging.
With debugging enabled the driver produces messages in the following formats:
Format wwv8 messages are produced once per minute by the WWV and WWVH station processes before minute sync has been acquired. They show the progress of identifying and tracking the minute pulse of each station.
wwv8 port agc ident comp ampl snr epoch jitr offs
where port and agc are the audio port and gain, respectively. The identencodes the station (C for WWV, H for WWVH) and frequency (2, 5, 10, 15 and 20). For the encoded frequency, comp is the compare counter, ampl the pulse amplitude, snr the SNR, epoch the sample number of the minute pulse in the minute, jitr the change since the last epoch and offs the minute pulse offset relative to the second pulse. An example is:
wwv8 2 127 C15 2 9247 30.0 18843 -1 1
wwv8 2 127 H15 0 134 -2.9 19016 193 174
Here the radio is tuned to 15 MHz and the line-in port AGC is currently 127 at that frequency. The driver has not yet acquired minute sync, WWV has been heard for at least two minutes, and WWVH is in the noise. The WWV minute pulse amplitude and SNR are well above the threshold (2000 and 6 dB, respectively) and the minute epoch has been determined -1 sample relative to the last one and 1 sample relative to the second sync pulse. The compare counter has incrmented to two; when it gets to three, minute sync has been acquired.
Format wwv3 messages are produced after minute sync has been acquired and until the seconds unit digit is determined. They show the results of decoding each bit of the transmitted timecode.
wwv3 ss stat sigl ampl phas snr prob like
where ss, stat and sigl are as above, ampl is the subcarrier amplitude, phas the subcarrier phase, snr the subcarrier SNR, prob the bit probability and like the bit likelihood. An example is:
wwv3 28 0123 4122 4286 0 24.8 -5545 -1735
Here the driver has acquired minute and second sync, but has not yet determined the seconds unit digit. However, it has just decoded bit 28 of the minute. The results show the second sync pulse amplitude well over the threshold (500), subcarrier amplitude well above the threshold (1000), good subcarrier tracking phase and SNR well above the threshold (10 dB). The bit is almost certainly a zero and the likelihood of a zero in this second is very high.
Format wwv4 messages are produced for each of the nine BCD timecode digits until the clock has been set or verified. They show the results of decoding each digit of the transmitted timecode.
wwv4 ss stat sigl radx ckdig mldig diff cnt like snr
where ss, stat and sigl are as above, radx is the digit radix (3, 4, 6, 10), ckdig the current clock digit, mldig the maximum likelihood digit, diff the difference between these two digits modulo the radix, cnt the compare counter, like the digit likelihood and snr the likelihood ratio. An example is:
wwv4 8 010f 5772 10 9 9 0 6 4615 6.1
Here the driver has previousl set or verified the clock. It has just decoded the digit preceding second 8 of the minute. The digit radix is 10, the current clock and maximum likelihood digits are both 9, the likelihood is well above the threshold (1000) and the likelihood function well above threshold (3.0 dB). Short of a hugely unlikely probability conspiracy, the clock digit is most certainly a 9.
Format wwv2 messages are produced at each master oscillator frequency update, which starts at 8 s, but eventually climbs to 1024 s. They show the progress of the algorithm as it refines the frequency measurement to a precision of 0.1 PPM.
wwv2 ss stat sigl avint avcnt avinc jitr delt freq
where ss, stat and sigl are as above, avint is the averaging interval, avcnt the averaging interval counter, avinc the interval increment, jitr the sample change between the beginning and end of the interval, delt the computed frequency change and freq the current frequency (PPM). An example is:
wwv2 22 030f 5795 256 256 4 0 0.0 66.7
Here the driver has acquired minute and second sync and set the clock. The averaging interval has increased to 256 s on the way to 1024 s, has stayed at that interval for 4 averaging intervals, has measured no change in frequency and the current frequency is 66.7 PPM.
If the CI-V interface for ICOM radios is active, a debug level greater than 1 will produce a trace of the CI-V command and response messages. Interpretation of these messages requires knowledge of the CI-V protocol, which is beyond the scope of this document.
sq yy ddd hh:mm:ss.fff ld du lset agc stn rfrq errs freq cons s sync indicator q quality character yyyy Gregorian year ddd day of year hh hour of day mm minute of hour fff millisecond of second l leap second warning d DST state dut DUT sign and magnitude lset minutes since last set agc audio gain ident station identifier and frequency comp minute sync compare counter errs bit error counter freq frequency offset avgt averaging timeThe fields beginning with year and extending through dut are decoded from the received data and are in fixed-length format. The agc and lset fields, as well as the following driver-dependent fields, are in variable-length format.
An example timecode is:
0 2000 006 22:36:00.000 S +3 1 115 C20 6 5 66.4 1024
Here the clock has been set and no alarms are raised. The year, day and time are displayed along with no leap warning, standard time and DUT +0.3 s. The clock was set on the last minute, the AGC is safely in the middle ot the range 0-255, and the receiver is tracking WWV on 20 MHz. Excellent reeiving conditions prevail, as indicated by the compare count 6 and 5 bit errors during the last minute. The current frequency is 66.4 PPM and the averaging interval is 1024 s, indicating the maximum precision available.
The mode keyword of the server configuration command specifies the ICOM ID select code. A missing or zero argument disables the CI-V interface. Following are the ID select codes for the known radios.
Radio | Hex | Decimal | Radio | Hex | Decimal |
IC725 | 0x28 | 40 | IC781 | 0x26 | 38 |
IC726 | 0x30 | 48 | R7000 | 0x08 | 8 |
IC735 | 0x04 | 4 | R71 | 0x1A | 26 |
IC751 | 0x1c | 28 | R7100 | 0x34 | 52 |
IC761 | 0x1e | 30 | R72 | 0x32 | 50 |
IC765 | 0x2c | 44 | R8500 | 0x4a | 74 |
IC775 | 0x46 | 68 | R9000 | 0x2a | 42 |