The following information is provided by Nick Sayer <email@example.com>, updated by Raymond Pelletier <RAYMOND.PELLETIER@nrc.ca>
CHU is a radio station in Canada that broadcasts time of day information sort of like WWV. CHU transmits on 3330 kHz, 7335 kHz, and 14670 kHz using AM compatable single-sideband full carrier modulation. Between 31 and 39 seconds (inclusive) past the minute, CHU transmits a computer readable timecode. This timecode includes time of day UTC, day of year (1-366), Gregorian year, leap second warning, DUT (the difference between UTC and UT1, which is an astronomical timescale. The difference is an integral number of tenths of a second between -.9 and +.9. If the difference exceeds .7, they schedule a leap second), and a Canadian daylight time indicator.
The datastream is in the form of an AFSK datastream. The frequencies are compatable with the Bell 103 standard: 2225 Hz mark and 2025 Hz space. The carrier is active between 10 and 510 msec past the second. Each byte of data is encoded as one start bit, 8 data bits and two stop bits. There are ten bytes in each packet, and the last stop bit ends at precisely 500 msec past the second. (1 start bit + 8 data bits + 2 stop bits) 10 characters = 110 bits. Each bit takes 1/300 of a second (300 baud). So the whole code takes 366.66.. msec. 500-366.66... = 133.33... msec. So graphically, each second looks like this:
000 050 100 150 200 250 300 350 400 450 500 550 | | | | | ^ ^ ^ ^ ^ 1 2 3 4 5 1 - Ticking noise. 2 - 2225 Hz mark tone for 123.333 msec to allow modems to set up 3 - Data stream 4 - 2225 Hz mark tone for 10 msec to avoid false overrun of the stop bits 5 - silence until the end of the second.
The datastream itself consists of ten bytes. There are two possible formats at the moment: One for second 31 and the other for seconds 32 through 39. Each format has 5 bytes of data, then 5 bytes of redundancy. The "A" format redundancy bytes are exactly the same as the data bytes. The "B" format redundancy bytes are exactly inverted (one's complement, NOT, XOR 0xff, etc) from the data bytes. This is how one can tell what sort of frame was received.
Once the data is received and the redundancy bytes are checked, the next thing to do is to swap the least and most significant nibbles in each byte. After doing all of this, the A frame looks like this:
6d dd hh mm ss
ddd is the day of the year. hh:mm:ss is the time UTC. 6 is a constant. Each nibble is a BCD digit of the B frame.
xd yy yy tt aa
d is the absolute value of DUT in tenths of a second, yyyy, is the gregorian year, tt is the difference between TAI and UTC, aa is a byte for a code number for the daylight saving time pattern in effect at this time accross all time zones of Canada. 00 is the code for the pattern in effect at this date. If policies change the hour or date of daylight saving time in any zone, this will be documented and a new code number will be assigned. The x is coded:
8 4 2 1 | | | | | | | +--- The sign of DUT (0=+). | | +------ Leap second warning. One second will be added. | +--------- Leap second warning. One second will be subtracted. +------------ Even parity bit for this nibble.
A sample A frame as received from the modem might look like this:
36 56 21 51 53 36 56 21 51 53
Note that these numbers are in hex. This translates to the 365th day of the year (Dec 31, or Dec 30 in a leap year), 12:15:35 UTC.
A sample B frame as received from the modem might look like this:
19 91 39 72 00 e6 6e c6 8d ff
This translates to a DUT of -.1, year 1993, TAI-UTC = 27, serial number 0 and no Canadian daylight time.