freebsd-skq/html/driver7.htm

658 lines
25 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta name="generator" content="HTML Tidy, see www.w3.org">
<title>Radio CHU Audio Demodulator/Decoder</title>
</head>
<body>
<h3>Radio CHU Audio Demodulator/Decoder</h3>
<hr>
<h4>Synopsis</h4>
Address: 127.127.7.<i>u</i> <br>
Reference ID: <tt>CHU</tt> <br>
Driver ID: <tt>CHU</tt> <br>
Modem Port: <tt>/dev/chu<i>u</i></tt>; 300 baud, 8-bits, no parity
<br>
Autotune Port: <tt>/dev/icom</tt>; 1200/9600 baud, 8-bits, no
parity <br>
Audio Device: <tt>/dev/chu_audio</tt> and <tt>/dev/audioctl</tt>
<h4>Description</h4>
<p>This driver synchronizes the computer time using data encoded in
radio transmissions from Canadian time/frequency station CHU in
Ottawa, Ontario. It replaces an earlier one, built by Dennis
Ferguson in 1988, which required a special line discipline to
preprocessed the signal. The new driver includes more powerful
algorithms implemented directly in the driver and requires no
preprocessing.</p>
<p>CHU transmissions are made continuously on 3330 kHz, 7335 kHz
and 14670 kHz in upper sideband, compatible AM mode. An ordinary
shortwave receiver can be tuned manually to one of these
frequencies or, in the case of ICOM receivers, the receiver can be
tuned automatically as propagation conditions change throughout the
day and night. The performance of this driver when tracking the
station is ordinarily better than 1 ms in time with frequency drift
less than 0.5 PPM when not tracking the station.</p>
<p>While there are currently no known commercial CHU receivers, a
simple but effective receiver/demodulator can be constructed from
an ordinary shortwave receiver and Bell 103 compatible, 300-b/s
modem or modem chip, as described in the <a href="gadget.htm">
Gadget Box PPS Level Converter and CHU Modem</a> page. The driver
can use the modem to receive the radio signal and demodulate the
data or, if available, the driver can use the audio codec of the
Sun workstation or another with compatible audio interface. In the
latter case, the driver implements the modem using DSP routines, so
the radio can be connected directly to either the microphone on
line input port.</p>
<p>This driver incorporates several features in common with other
audio drivers such as described in the <a href="driver36.htm">Radio
WWV/H Audio Demodulator/Decoder</a> and the <a href="driver6.htm">
IRIG Audio Decoder</a> 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 <a href=
"audio.htm">Reference Clock Audio Drivers</a> page.</p>
<p>Ordinarily, the driver poll interval is set to 14 (about 4.5 h),
although this can be changed with configuration commands. As long
as the clock is set or verified at least once during this interval,
the NTP algorithms will consider the source reachable and
selectable to discipline the system clock. However, if this does
not happen for eight poll intervals, the algorithms will consider
the source unreachable and some other source will be chosen (if
available) to discipline the system clock.</p>
<p>The decoding algorithms process the data using
maximum-likelihood techniques which exploit the considerable degree
of redundancy available in each broadcast message or burst. As
described below, every character is sent twice and, in the case of
format A bursts, the burst is sent eight times every minute. In the
case of format B bursts, which are sent once each minute, the burst
is considered correct only if every character matches its
repetition in the burst. In the case of format A messages, a
majority decoder requires at least six repetitions for each digit
in the timecode and more than half of the repetitions decode to the
same digit. Every character in every burst provides an independent
timestamp upon arrival with a potential total of over 60 timestamps
for each minute.</p>
<p>A timecode in the format described below is assembled when all
bursts have been received in the minute. The timecode is considered
valid and the clock set when at least one valid format B burst has
been decoded and the above requirements are met. The <tt>yyyy</tt>
year field in the timecode indicates whether a valid format B burst
has been received. Upon startup, this field is initialized at zero;
when a valid format B burst is received, it is set to the current
Gregorian year. The <tt>q</tt> quality character field in the
timecode indicates whether a valid timecode has been determined. If
any of the high order three bits of this character are set, the
timecode is invalid.</p>
<p>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 is lost. Since the signals are almost always
available during some period of the day and the NTP clock
discipline algorithms are designed to work well even in this case,
it is unlikely that the system clock could drift more than a few
tens of milliseconds during periods of signal loss. 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.</p>
<p>The last three fields in the timecode are useful in assessing
the quality of the radio channel during the most recent minute
bursts were received. The <tt>bcnt</tt> field shows the number of
format A bursts in the range 1-8. The <tt>dist</tt> field shows the
majority decoder distance, or the minimum number of sample
repetitions for each digit of the timecode in the range 0-16. The
<tt>tsmp</tt> field shows the number of timestamps determined in
the range 0-60. For a valid timecode, <tt>bcnt</tt> must be at
least 3, <tt>dist</tt> must be greater than <tt>bcnt</tt> and <tt>
tsmp</tt> must be at least 20.</p>
<h4>Program Operation</h4>
<p>The program consists of four major parts: the DSP modem, maximum
likelihood UART, burst assembler and majority decoder. The DSP
modem demodulates Bell 103 modem answer-frequency signals; that is,
frequency-shift keyed (FSK) tones of 2225 Hz (mark) and 2025 Hz
(space). This is done using a 4th-order IIR filter and
limiter/discriminator with 500-Hz bandpass centered on 2125 Hz and
followed by a FIR raised-cosine lowpass filter optimized for the
300-b/s data rate. Alternately, the driver can be compiled to
delete the modem and input 300 b/s data directly from an external
modem via a serial port.</p>
<p>The maximum likelihood UART is implemented using a set of eight
11-stage shift registers, one for each of eight phases of the
300-b/s bit clock. At each phase a new baseband signal value from
the DSP modem is shifted into the corresponding register and the
maximum and minimum over all 11 samples computed. This establishes
a slice level midway between the maximum and minimum over all
stages. For each stage, a signal level above this level is a mark
(1) and below is a space (0). A quality metric is calculated for
each register with respect to the slice level and the a-priori
signal consisting of a mark bit (previous stop bit), space (start)
bit, eight arbitrary information bits and the first of the two mark
(stop) bits.</p>
<p>The shift registers are processed in round-robin order as each
modem value arrives until one of them shows a valid framing pattern
consisting of a mark bit, space bit, eight arbitrary data bits and
a mark bit. When found, the data bits from the register with the
best metric is chosen as the maximum likelihood character and the
UART begins to process the next character.</p>
<p>The burst assembler processes characters either from the maximum
likelihood UART or directly from the serial port as configured. A
burst begins when a character is received and is processed after a
timeout interval when no characters are received. If the interval
between characters is greater than two characters, but less than
the timeout interval, the burst is rejected as a runt and a new
burst begun. As each character is received, a timestamp is captured
and saved for later processing.</p>
<p>A valid burst consists of ten characters in two replicated
five-character blocks. A format B block contains the year and other
information in ten hexadecimal digits. A format A block contains
the timecode in ten decimal digits, the first of which is a framing
code (6). The burst assembler must deal with cases where the first
character of a format A burst is lost or is noise. This is done
using the framing code to correct the phase, either one character
early or one character late.</p>
<p>The burst distance is incremented by one for each bit in the
first block that matches the corresponding bit in the second block
and decremented by one otherwise. In a format B burst the second
block is bit-inverted relative to the first, so a perfect burst of
five 8-bit characters has distance -40. In a format A block the two
blocks are identical, so a perfect burst has distance +40. Format B
bursts must be perfect to be acceptable; however, format A bursts,
which are further processed by the majority decoder, are acceptable
if the distance is at least 28.</p>
<p>Each minute of transmission includes eight format A bursts
containing two timecodes for each second from 31 through 39. The
majority decoder uses a decoding matrix of ten rows, one for each
digit position in the timecode, and 16 columns, one for each 4-bit
code combination that might be decoded at that position. In order
to use the character timestamps, it is necessary to reliably
determine the second number of each burst. In a valid burst, the
last digit of the two timecodes in the block must match and the
value must be in the range 2-9 and greater than in the previous
burst.</p>
<p>As each hex digit of a valid burst is processed, the value at
the row corresponding to the digit position in the timecode and
column corresponding to the code found at that position is
incremented. At the end of each minute of transmission, each row of
the decoding matrix encodes the number of occurrences of each code
found at the corresponding position of the timecode. However, the
first digit (framing code) is always 6, the ninth (second tens) is
always 3 and the last (second units) changes for each burst, so are
not used.</p>
<p>The maximum over all occurrences at each timecode digit position
is the distance for that position and the corresponding code is the
maximum likelihood candidate. If the distance is zero, the decoder
assumes a miss; if the distance is not more than half the total
number of occurrences, the decoder assumes a soft error; if two
different codes with the same distance are found, the decoder
assumes a hard error. In all these cases the decoder encodes a
non-decimal character which will later cause a format error when
the timecode is reformatted. The decoding distance is defined as
the minimum distance over the first nine digits; the tenth digit
varies over the seconds and is uncounted.</p>
<p>The result of the majority decoder is a nine-digit timecode
representing the maximum likelihood candidate for the transmitted
timecode in that minute. Note that the second and fraction within
the minute are always zero and that the actual reference point to
calculate timestamp offsets is backdated to the first second of the
minute. At this point the timecode block is reformatted and the
year, days, hours and minutes extracted along with other
information from the format B burst, including DST state, DUT1
correction and leap warning. The reformatting operation checks the
timecode for invalid code combinations that might have been left by
the majority decoder and rejects the entire timecode if found.</p>
<p>If the timecode is valid, it is passed to the reference clock
interface along with the backdated timestamp offsets accumulated
over the minute. A perfect set of nine bursts could generate as
many as 90 timestamps, but the maximum the interface can handle is
60. These are processed by the interface using a median filter and
trimmed-mean average, so the resulting system clock correction is
usually much better than would otherwise be the case with radio
noise, UART jitter and occasional burst errors.</p>
<h4>Autotune</h4>
<p>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 standard 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 <tt>
icom.h</tt> header file.</p>
<p>Each ICOM radio is assigned a unique 8-bit ID select code,
usually expressed in hex format. To activate the CI-V interface,
the <tt>mode</tt> keyword of the <tt>server</tt> 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 <tt>mode</tt>
keyword or a zero argument leaves the interface disabled.</p>
<p>If specified, the driver will attempt to open the device <tt>
/dev/icom</tt> and, if successful will tune the radio to 3.330 MHz.
If after five minutes at this frequency not more than two format A
bursts have been received for any minute, the driver will tune to
7.335 MHz, then to 14.670 MHz, then return to 3.330 MHz and
continue in this cycle. However, the driver is liberal in what it
assumes of the configuration. If the <tt>/dev/icom</tt> 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.</p>
<h4>Radio Broadcast Format</h4>
<p>The CHU time broadcast includes an audio signal compatible with
the Bell 103 modem standard (mark = 2225 Hz, space = 2025 Hz). It
consist of nine, ten-character bursts transmitted at 300 b/s and
beginning each second from second 31 to second 39 of the minute.
Each character consists of eight data bits plus one start bit and
two stop bits to encode two hex digits. The burst data consist of
five characters (ten hex digits) followed by a repeat of these
characters. In format A, the characters are repeated in the same
polarity; in format B, the characters are repeated in the opposite
polarity.</p>
<p>Format A bursts are sent at seconds 32 through 39 of the minute
in hex digits</p>
<p><tt>6dddhhmmss6dddhhmmss</tt></p>
<p>The first ten digits encode a frame marker (<tt>6</tt>) followed
by the day (<tt>ddd</tt>), hour (<tt>hh</tt>), minute (<tt>mm</tt>)
and second (<tt>ss</tt>). Since format A bursts are sent during the
third decade of seconds the tens digit of <tt>ss</tt> is always 3.
The driver uses this to determine correct burst synchronization.
These digits are then repeated with the same polarity.</p>
<p>Format B bursts are sent at second 31 of the minute in hex
digits</p>
<p><tt>xdyyyyttaaxdyyyyttaa</tt></p>
<p>The first ten digits encode a code (<tt>x</tt> described below)
followed by the DUT1 (<tt>d</tt> in deciseconds), Gregorian year
(<tt>yyyy</tt>), difference TAI - UTC (<tt>tt</tt>) and daylight
time indicator (<tt>aa</tt>) peculiar to Canada. These digits are
then repeated with inverted polarity.</p>
<p>The <tt>x</tt> is coded</p>
<dl>
<dt><tt>1</tt></dt>
<dd>Sign of DUT (0 = +)/dd&gt;</dd>
<dt><tt>2</tt></dt>
<dd>Leap second warning. One second will be added.</dd>
<dt><tt>4</tt></dt>
<dd>Leap second warning. One second will be subtracted. This is not
likely to happen in our universe.</dd>
<dt><tt>8</tt></dt>
<dd>Even parity bit for this nibble.</dd>
</dl>
<p>By design, the last stop bit of the last character in the burst
coincides with 0.5 second. Since characters have 11 bits and are
transmitted at 300 b/s, the last stop bit of the first character
coincides with 0.5 - 10 * 11/300 = 0.133 second. Depending on the
UART, character interrupts can vary somewhere between the beginning
of bit 9 and end of bit 11. These eccentricities can be corrected
along with the radio propagation delay using the <tt>fudge
time1</tt> variable.</p>
<h4>Debugging Aids</h4>
<p>The most convenient way to track the program status is using the
<tt>ntpq</tt> program and the <tt>clockvar</tt> command. This
displays the last determined timecode and related status and error
counters, even when the program is not discipline the system clock.
If the debugging trace feature (<tt>-d</tt> on the <tt>ntpd</tt>
command line)is enabled, the program produces detailed status
messages as it operates. If the <tt>fudge flag 4</tt> is set, these
messages are written to the <tt>clockstats</tt> file. All messages
produced by this driver have the prefix <tt>chu</tt> for convenient
filtering with the Unix <tt>grep</tt> command.</p>
<p>With debugging enabled the driver produces messages in the
following formats:</p>
<p>A format <tt>chuA</tt> message is produced for each format A
burst received in seconds 32 through 39 of the minute:</p>
<p><tt>chuA n b s code</tt></p>
<p>where <tt>n</tt> is the number of characters in the burst
(0-11), <tt>b</tt> the burst distance (0-40), <tt>s</tt> the
synchronization distance (0-40) and <tt>code</tt> the burst
characters as received. Note that the hex digits in each character
are reversed and the last ten digits inverted, so the burst</p>
<p><tt>11 40 1091891300ef6e76ecff</tt></p>
<p>is interpreted as containing 11 characters with burst distance
40. The nibble-swapped timecode shows DUT1 +0.1 second, year 1998
and TAI -UTC 31 seconds.</p>
<p>A format <tt>chuB</tt> message is produced for each format B
burst received in second 31 of the minute:</p>
<p><tt>chuB n b f s m code</tt></p>
<p>where <tt>n</tt> is the number of characters in the burst
(0-11), <tt>b</tt> the burst distance (0-40), <tt>f</tt> the field
alignment (-1, 0, 1), <tt>s</tt>the synchronization distance
(0-16), <tt>m</tt>the burst number (2-9) and <tt>code</tt> the
burst characters as received. Note that the hex digits in each
character are reversed, so the burst</p>
<p><tt>10 38 0 16 9 06851292930685129293</tt></p>
<p>is interpreted as containing 11 characters with burst distance
38, field alignment 0, synchronization distance 16 and burst number
9. The nibble-swapped timecode shows day 58, hour 21, minute 29 and
second 39.</p>
<p>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.</p>
<h4>Monitor Data</h4>
When enabled by the <tt>filegen</tt> facility, every received
timecode is written to the <tt>clockstats</tt> file in the
following format:
<pre>
sq yy ddd hh:mm:ss.fff ld dut lset agc rfrq bcnt dist tsmp
s sync indicator
q quality character
yyyy Gregorian year
ddd day of year
hh hour of day
mm minute of hour
ss second of minute
fff millisecond of second
l leap second warning
d DST state
dut DUT sign and magnitude in deciseconds
lset minutes since last set
agc audio gain (0-255)
rfrq radio frequency
bcnt burst count
dist decoding distance
tsmp timestamps captured
</pre>
The fields beginning with <tt>year</tt> and extending through <tt>
dut</tt> are decoded from the received data and are in fixed-length
format. The <tt>agc</tt> and <tt>lset</tt> fields, as well as the
following driver-dependent fields, are in variable-length format.
<dl>
<dt><tt>s</tt></dt>
<dd>The sync indicator is initially <tt>?</tt> before the clock is
set, but turns to space when the clock is correctly set.</dd>
<dt><tt>q</tt></dt>
<dd>The quality character is a four-bit hexadecimal code showing
which alarms have been raised during the most recent minute. Each
bit is associated with a specific alarm condition according to the
following:
<dl>
<dt><tt>8</tt></dt>
<dd>Decoder alarm. A majority of repetitions for at least one digit
of the timecode fails to agree.</dd>
<dt><tt>4</tt></dt>
<dd>Timestamp alarm. Fewer than 20 timestamps have been
determined.</dd>
<dt><tt>2</tt></dt>
<dd>Format alarm. The majority timecode contains invalid bit
combinations.</dd>
<dt><tt>1</tt></dt>
<dd>Frame alarm. A framing or format error occurred on at least one
burst during the minute.</dd>
</dl>
It is important to note that one or more of the above alarms does
not necessarily indicate a clock error, but only that the decoder
has detected a condition that may in future result in an
error.</dd>
<dt><tt>yyyy ddd hh:mm:ss.fff</tt></dt>
<dd>The timecode format itself is self explanatory. Note that the
Gregorian year is decoded directly from the transmitted
timecode.</dd>
<dt><tt>l</tt></dt>
<dd>The leap second warning is normally space, but changes to <tt>
L</tt> if a leap second is to occur at the end of the month of June
or December.</dd>
<dt><tt>d</tt></dt>
<dd>The DST code for Canada encodes the state for all
provinces.</dd>
<dt><tt>dut</tt></dt>
<dd>The DUT sign and magnitude shows the current UT1 offset
relative to the displayed UTC time, in deciseconds.</dd>
<dt><tt>lset</tt></dt>
<dd>Before the clock is set, the interval since last set is the
number of minutes since the program was started; after the clock is
set, this is number of minutes since the time was last verified
relative to the broadcast signal.</dd>
<dt><tt>agc</tt></dt>
<dd>The audio gain shows the current codec gain setting in the
range 0 to 255. Ordinarily, the receiver audio gain control or IRIG
level control should be set for a value midway in this range.</dd>
<dt><tt>rfrq</tt></dt>
<dd>The current radio frequency, if the CI-V interface is active,
or 'X' if not.</dd>
<dt><tt>bcnt</tt></dt>
<dd>The number of format A bursts received during the most recent
minute bursts were received.</dd>
<dt><tt>dist</tt></dt>
<dd>The minimum decoding distance determined during the most recent
minute bursts were received.</dd>
<dt><tt>tsmp</tt></dt>
<dd>The number of timestamps determined during the most recent
minute bursts were received.</dd>
</dl>
<h4>Modes</h4>
<p>The <tt>mode</tt> keyword of the <tt>server</tt> 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.</p>
<table cols="6" width="100%">
<tr>
<td>Radio</td>
<td>Hex</td>
<td>Decimal</td>
<td>Radio</td>
<td>Hex</td>
<td>Decimal</td>
</tr>
<tr>
<td>IC725</td>
<td>0x28</td>
<td>40</td>
<td>IC781</td>
<td>0x26</td>
<td>38</td>
</tr>
<tr>
<td>IC726</td>
<td>0x30</td>
<td>48</td>
<td>R7000</td>
<td>0x08</td>
<td>8</td>
</tr>
<tr>
<td>IC735</td>
<td>0x04</td>
<td>4</td>
<td>R71</td>
<td>0x1A</td>
<td>26</td>
</tr>
<tr>
<td>IC751</td>
<td>0x1c</td>
<td>28</td>
<td>R7100</td>
<td>0x34</td>
<td>52</td>
</tr>
<tr>
<td>IC761</td>
<td>0x1e</td>
<td>30</td>
<td>R72</td>
<td>0x32</td>
<td>50</td>
</tr>
<tr>
<td>IC765</td>
<td>0x2c</td>
<td>44</td>
<td>R8500</td>
<td>0x4a</td>
<td>74</td>
</tr>
<tr>
<td>IC775</td>
<td>0x46</td>
<td>68</td>
<td>R9000</td>
<td>0x2a</td>
<td>42</td>
</tr>
</table>
<h4>Fudge Factors</h4>
<dl>
<dt><tt>time1 <i>time</i></tt></dt>
<dd>Specifies the propagation delay for CHU (45:18N 75:45N), in
seconds and fraction, with default 0.0.</dd>
<dt><tt>time2 <i>time</i></tt></dt>
<dd>Not used by this driver.</dd>
<dt><tt>stratum <i>number</i></tt></dt>
<dd>Specifies the driver stratum, in decimal from 0 to 15, with
default 0.</dd>
<dt><tt>refid <i>string</i></tt></dt>
<dd>Specifies the driver reference identifier, an ASCII string from
one to four characters, with default <tt>CHU</tt>.</dd>
<dt><tt>flag1 0 | 1</tt></dt>
<dd>Not used by this driver.</dd>
<dt><tt>flag2 0 | 1</tt></dt>
<dd>When the audio driver is compiled, this flag selects the audio
input port, where 0 is the mike port (default) and 1 is the line-in
port. It does not seem useful to select the compact disc player
port.</dd>
<dt><tt>flag3 0 | 1</tt></dt>
<dd>When the audio driver is compiled, this flag enables audio
monitoring of the input signal. For this purpose, the speaker
volume must be set before the driver is started.</dd>
<dt><tt>flag4 0 | 1</tt></dt>
<dd>Enable verbose <tt>clockstats</tt> recording if set.</dd>
</dl>
<h4>Additional Information</h4>
<a href="refclock.htm">Reference Clock Drivers</a> <br>
<a href="audio.htm">Reference Clock Audio Drivers</a>
<hr>
<a href="index.htm"><img align="left" src="pic/home.gif" alt=
"gif"></a>
<address><a href="mailto:mills@udel.edu">David L. Mills
&lt;mills@udel.edu&gt;</a></address>
</body>
</html>