diff options
Diffstat (limited to 'html/driver7.htm')
-rw-r--r-- | html/driver7.htm | 657 |
1 files changed, 657 insertions, 0 deletions
diff --git a/html/driver7.htm b/html/driver7.htm new file mode 100644 index 0000000..029ac04 --- /dev/null +++ b/html/driver7.htm @@ -0,0 +1,657 @@ +<!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></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 +<mills@udel.edu></a></address> +</body> +</html> + |