leo.blog();

Barker code

A Barker code, also known as a Barker sequence, is a sequence of values with excellent autocorrelation properties. Thanks to this, it can be used for synchronization in DSP.

Since we have fast computers, we can come up with these sequences ourselves by trying all sequences and evaluating their autocorrelation properties.

Known Barker codes

Below is a table of the currently known Barker codes up to length 13.

Although the length‑1 sequence (often just 1) is technically a Barker code, practical interest usually begins at length 2.

LengthCode
21, -1
21, 1
31, 1, -1
41, 1, -1, 1
41, 1, 1, -1
51, 1, 1, -1, 1
71, 1, 1, -1, -1, 1, -1
111, 1, 1, -1, -1, -1, 1, -1, -1, 1, -1
131, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1

These are the only ones that are known, and people have checked quite a lot of them. It’s conjectured that these ones are the only ones that exist.

Equivalent codes

If you negate a code, or reverse a code, you get an equivalent code with the same autocorrelation properties. We count them as the same code. Combinations of these “transforms” (such as negation of the reversal etc.) are also equivalent.

Negation of codes

This means in the sequence, every +1 becomes a -1, and every -1 becomes a +1.

CodeNegation of the code
-1, -1, 1, -11, 1, -1, 1
1, -1, -1-1, 1, 1

Reversal of codes

Just flip it around, instead of reading left-to-right, read it right-to-left.

CodeReversal of the code
-1, -1, -1, 1, -1-1, 1, -1, -1, -1
-1, -1, -1, 11, -1, -1, -1

Normalizing codes

To simplify comparisons and storage, one can “normalize” a Barker code to a canonical representation chosen from its four equivalent forms.

One common approach is to generate the four equivalents (original, negated, reversed, and negated–reversed) and choose the lexicographically largest sequence.

I picked “largest” here arbitrarily. You can use any criteria, but largest seems like a good one.

Below is a Python snippet that does this.

def normalize_code(code: list[int]) -> list[int]:
    return max(
        code, # original
        [-x for x in code], # negated
        code[::-1], # reversed
        [-x for x in code[::-1]]) # negated and reversed

Sidelobe level ratio

You can calculate the sidelobe level ratio of the autocorrelation of a length N barker code in dB as 20 * log_{10}(1/N).

The sidelobe level ratio, as given above, indicates how much weaker the largest sidelobe is relative to the main lobe (at zero lag). Lower values imply better discrimination against delayed copies of the signal.

Below are the sidelobe level ratios of all the code lengths with known Barker codes.

Code lengthSidelobe level ratio
2-6 dB
3-9.5 dB
4-12 dB
5-14 dB
7-16.9 dB
11-20.8 dB
13-22.3 dB

Useful links

Leave a Comment