CHU broadcast codes

CHU is a radio station in Canada that continuously broadcasts time of day information. It is operated by the National Research Council of Canada to disseminate official time across Canada, and around the world as permitted by ionospheric conditions. CHU transmits on 3330 kHz, 7850 kHz, and 14670 kHz using AM compatible modulation (upper sideband, carrier reinserted). Between 31 and 39 seconds (inclusive) past the minute, CHU transmits a time code which can be read by a computer with a Bell 103 compatible modem. This time code includes time of day UTC, day of year (1-366), Gregorian year (four digits), leap second warning, DUT1, TAI-UTC and a Canadian daylight time indicator.

The data is in the form of an FSK data stream. The frequencies are compatible with the Bell 103 standard: 2225 Hz mark and 2025 Hz space. The carrier is active between 0.010 and 0.510 seconds 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 ms past the second. (1 start bit + 8 data bits + 2 stop bits) x 10 characters = 110 bits. Each bit takes 1/300 of a second (300 bps). So the whole code takes 366.66... ms, and starts at 500 - 366.66... = 133.33... ms past the second. So graphically, each second looks like this:

Data is in the form of an FSK data stream
  1. Ticking noise (10 cycles of 1000 Hz)
  2. 2225 Hz mark tone for 123.33... ms to allow modems to set up
  3. Data stream for 366.66... ms
  4. 2225 Hz mark tone for 10 ms to avoid false overrun of the stop bits
  5. Silence until the end of the second.

The data stream itself consists of ten bytes. There are two formats: format "B" for second 31 and format "A" 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 frames look like this:

A frame: 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.

B frame: xz yy yy tt aa.

z is the absolute value of DUT1 in tenths of a second. yyyy is the Gregorian year, tt is the BCD difference between TAI and UTC (in seconds), aa is a byte for a code number for the daylight saving time pattern in effect at this time across all time zones of Canada. The x is coded as follows:


Historically, since 1972, a leap second has been added just before 00:00:00 UTC on January 1 or July 1, at intervals of from 6 months to 2.5 years, depending on the irregular variations of the Earth's rotation. These are "positive leap seconds", and can be inserted at the end of each quarter of the year.

Civil time scales around the world are based on UTC, and will all have the leap second occur at the same instant. International Atomic Time, TAI, does not use leap seconds. TAI may be calculated from the UTC time and the tt CHU code byte (remember it is nibble reversed): TAI = UTC + tt. Some other technical time scales are based on TAI, to avoid leap seconds. GPS system time, TDT and TT are examples. To calculate UT1, the time used for positional astronomy, surveying and navigation,

use UT1 = UTC + (z/10)s if x is even
or UT1 = UTC - (z/10)s if x is odd.

A sample A frame as received from the modem might look like this:

36 95 21 51 53 36 95 21 51 53

Note that these numbers are in hex. This translates to the 359th day of the year (Dec 25, or Dec 24 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 DUT1 of -0.1 s, year 1993, TAI-UTC=27 s, serial number 00 for Canada's daylight saving pattern.