### Radio CHU Audio Demodulator/Decoder

#### Synopsis

Address: 127.127.7.u
Reference ID: `CHU`
Driver ID: `CHU`
Modem Port: `/dev/chuu`; 300 baud, 8-bits, no parity
Autotune Port: `/dev/icom`; 1200/9600 baud, 8-bits, no parity
Audio Device: `/dev/audio` and `/dev/audioctl`

#### Description

This driver synchronizes the computer time using data encoded in radio transmissions from Canadian time/frequency station CHU in Ottawa, Ontario. 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.

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 Pulse-per-second (PPS) Signal Interfacing page. The driver can be compiled to use a modem to receive the radio signal and demodulate the data. Alternatively, the driver can be compiled to 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.

The driver replaces an earlier one built by Dennis Ferguson in 1988. The earlier driver required a special line discipline which preprocessed the signal in order to improve accuracy and avoid errors. The new driver includes more powerful algorithms implemented directly in the driver and requires no line discipline. It decodes the data using a maximum-likelihood technique which exploits the considerable degree of redundancy available to maximize accuracy and minimize errors.

This driver incorporates several features in common with other audio drivers such as described in the Radio WWV/H 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.

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.

The decoding algorithms take advantage of all the redundancy available in each broadcast message or burst. In each burst described in the next section, 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.

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 `yyyy` 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 will be set to the correct Gregorian year. The `q` 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.

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.

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 `bcnt` field shows the number of format A bursts in the range 1-8. The `dist` 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 `tsmp` field shows the number of timestamps determined in the range 0-60. For a valid timecode, `bcnt` must be at least 3, `dist` must be greater than `bcnt` and `tsmp` must be at least 20.

#### Program Operation

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

#### Autotune

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 `icom.h` header 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 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 `/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.

#### Radio Broadcast Format

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.

Format A bursts are sent at seconds 32 through 39 of the minute in hex digits

`6dddhhmmss6dddhhmmss`

The first ten digits encode a frame marker (`6`) followed by the day (`ddd`), hour (`hh`), minute (`mm`) and second (`ss`). Since format A bursts are sent during the third decade of seconds the tens digit of `ss` is always 3. The driver uses this to determine correct burst synchronization. These digits are then repeated with the same polarity.

Format B bursts are sent at second 31 of the minute in hex digits

`xdyyyyttaaxdyyyyttaa`

The first ten digits encode a code (`x` described below) followed by the DUT1 (`d` in deciseconds), Gregorian year (`yyyy`), difference TAI - UTC (`tt`) and daylight time indicator (`aa`) peculiar to Canada. These digits are then repeated with inverted polarity.

The `x` is coded

`1`
  Sign of DUT (0 = +)/dd>
`2`
  Leap second warning. One second will be added.
`4`
  Leap second warning. One second will be subtracted. This is not likely to happen in our universe.
`8`
  Even parity bit for this nibble.

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 `fudge time1` variable.

#### Debugging Aids

The most convenient way to track the program 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 program is not discipline the system clock. If the debugging trace feature (`-d` on the `ntpd` command line)is enabled, the program 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.

With debugging enabled the driver produces messages in the following formats:

A format `chuA` message is produced for each format A burst received in seconds 32 through 39 of the minute:

`chuA n b s code`

where `n` is the number of characters in the burst (0-11), `b` the burst distance (0-40), `s` the synchronization distance (0-40) and `code` the burst characters as received. Note that the hex digits in each character are reversed and the last ten digits inverted, so the burst

`11 40 1091891300ef6e76ecff`

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.

A format `chuB` message is produced for each format B burst received in second 31 of the minute:

`chuB n b f s m code`

where `n` is the number of characters in the burst (0-11), `b` the burst distance (0-40), `f` the field alignment (- 1, 0, 1), `s`the synchronization distance (0-16), `m`the burst number (2-9) and `code` the burst characters as received. Note that the hex digits in each character are reversed, so the burst

`10 38 0 16 9 06851292930685129293`

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.

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.

#### Monitor Data

When enabled by the `filegen` facility, every received timecode is written to the `clockstats` file in the following format:

            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

The 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.

`s`
  The sync indicator is initially `?` before the clock is set, but turns to space when the clock is correctly set.
`q`
  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:
  `8`
    Decoder alarm. A majority of repetitions for at least one digit of the timecode fails to agree.
  `4`
    Timestamp alarm. Fewer than 20 timestamps have been determined.
  `2`
    Format alarm. The majority timecode contains invalid bit combinations.
  `1`
    Frame alarm. A framing or format error occurred on at least one burst during the minute.
  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.
`yyyy ddd hh:mm:ss.fff`
  The timecode format itself is self explanatory. Note that the Gregorian year is decoded directly from the transmitted timecode.
`l`
  The leap second warning is normally space, but changes to `L` if a leap second is to occur at the end of the month of June or December.
`d`
  The DST code for Canada encodes the state for all provinces.
`dut`
  The DUT sign and magnitude shows the current UT1 offset relative to the displayed UTC time, in deciseconds.
`lset`
  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.
`agc`
  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.
`rfrq`
  The current radio frequency, if the CI-V interface is active, or 'X' if not.
`bcnt`
  The number of format A bursts received during the most recent minute bursts were received.
`dist`
  The minimum decoding distance determined during the most recent minute bursts were received.
`tsmp`
  The number of timestamps determined during the most recent minute bursts were received.

#### Modes

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

#### Fudge Factors

`time1 time`
  Specifies the propagation delay for CHU (45:18N 75:45N), in seconds and fraction, with default 0.0.
`time2 time`
  Not used by this driver.
`stratum number`
  Specifies the driver stratum, in decimal from 0 to 15, with default 0.
`refid string`
  Specifies the driver reference identifier, an ASCII string from one to four characters, with default `CHU`.
`flag1 0 | 1`
  Not used by this driver.
`flag2 0 | 1`
  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.
`flag3 0 | 1`
  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.
`flag4 0 | 1`
  Enable verbose `clockstats` recording if set.

#### Additional Information

Reference Clock Drivers
Reference Clock Audio Drivers

Home