Pseudorandom binary sequence
Seemingly random, difficult to predict bit stream created by a deterministic algorithm
- 4 min read
- 3 chapters
Related on Lably
Through Algorithm, Simulation and Correlation
In telecommunications, pseudorandom binary sequences are known as pseudorandom noise codes (PN or PRN codes) due to their application as pseudorandom noise.
Details
A binary sequence (BS) is a sequence of bits, i.e.
- for .
A BS consists of ones and zeros.
A BS is a pseudorandom binary sequence (PRBS) if its autocorrelation function, given by
has only two values:
where
is called the duty cycle of the PRBS, similar to the duty cycle of a continuous time signal. For a maximum length sequence, where , the duty cycle is 1/2.
A PRBS is 'pseudorandom', because, although it is in fact deterministic, it seems to be random in a sense that the value of an element is independent of the values of any of the other elements, similar to real random sequences.
A PRBS can be stretched to infinity by repeating it after elements, but it will then be cyclical and thus non-random. In contrast, truly random sequence sources, such as sequences generated by radioactive decay or by white noise, are infinite (no pre-determined end or cycle-period). However, as a result of this predictability, PRBS signals can be used as reproducible patterns (for example, signals used in testing telecommunications signal paths).
Sign in to keep reading
2 more chapters are free with a Lably account.
Practical implementation
Pseudorandom binary sequences can be generated using linear-feedback shift registers.
Some common sequence generating monic polynomials are
- PRBS7 =
- PRBS9 =
- PRBS11 =
- PRBS13 =
- PRBS15 =
- PRBS20 =
- PRBS23 =
- PRBS31 =
An example of generating a "PRBS-7" sequence can be expressed in C as
<span id="mwjg"></span><span class="cp" id="mwjw">#include</span><span class="w" id="mwkA"> </span><span class="cpf" id="mwkQ"><stdio.h></span> <span class="cp" id="mwkg">#include</span><span class="w" id="mwkw"> </span><span class="cpf" id="mwlA"><stdint.h></span> <span class="cp" id="mwlQ">#include</span><span class="w" id="mwlg"> </span><span class="cpf" id="mwlw"><stdlib.h></span> <span class="w" id="mwmA"> </span> <span class="kt" id="mwmQ">int</span><span class="w" id="mwmg"> </span><span class="nf" id="mwmw">main</span><span class="p" id="mwnA">(</span><span class="kt" id="mwnQ">int</span><span class="w" id="mwng"> </span><span class="n" id="mwnw">argc</span><span class="p" id="mwoA">,</span><span class="w" id="mwoQ"> </span><span class="kt" id="mwog">char</span><span class="o" id="mwow">*</span><span class="w" id="mwpA"> </span><span class="n" id="mwpQ">argv</span><span class="p" id="mwpg">[])</span><span class="w" id="mwpw"> </span><span class="p" id="mwqA">{</span> <span class="w" id="mwqQ"> </span><span class="kt" id="mwqg">uint8_t</span><span class="w" id="mwqw"> </span><span class="n" id="mwrA">start</span><span class="w" id="mwrQ"> </span><span class="o" id="mwrg">=</span><span class="w" id="mwrw"> </span><span class="mh" id="mwsA">0x02</span><span class="p" id="mwsQ">;</span> <span class="w" id="mwsg"> </span><span class="kt" id="mwsw">uint8_t</span><span class="w" id="mwtA"> </span><span class="n" id="mwtQ">a</span><span class="w" id="mwtg"> </span><span class="o" id="mwtw">=</span><span class="w" id="mwuA"> </span><span class="n" id="mwuQ">start</span><span class="p" id="mwug">;</span> <span class="w" id="mwuw"> </span><span class="kt" id="mwvA">int</span><span class="w" id="mwvQ"> </span><span class="n" id="mwvg">i</span><span class="p" id="mwvw">;</span><span class="w" id="mwwA"> </span> <span class="w" id="mwwQ"> </span><span class="k" id="mwwg">for</span><span class="w" id="mwww"> </span><span class="p" id="mwxA">(</span><span class="n" id="mwxQ">i</span><span class="w" id="mwxg"> </span><span class="o" id="mwxw">=</span><span class="w" id="mwyA"> </span><span class="mi" id="mwyQ">1</span><span class="p" id="mwyg">;;</span><span class="w" id="mwyw"> </span><span class="n" id="mwzA">i</span><span class="o" id="mwzQ">++</span><span class="p" id="mwzg">)</span><span class="w" id="mwzw"> </span><span class="p" id="mw0A">{</span> <span class="w" id="mw0Q"> </span><span class="kt" id="mw0g">int</span><span class="w" id="mw0w"> </span><span class="n" id="mw1A">newbit</span><span class="w" id="mw1Q"> </span><span class="o" id="mw1g">=</span><span class="w" id="mw1w"> </span><span class="p" id="mw2A">(((</span><span class="n" id="mw2Q">a</span><span class="w" id="mw2g"> </span><span class="o" id="mw2w">>></span><span class="w" id="mw3A"> </span><span class="mi" id="mw3Q">6</span><span class="p" id="mw3g">)</span><span class="w" id="mw3w"> </span><span class="o" id="mw4A">^</span><span class="w" id="mw4Q"> </span><span class="p" id="mw4g">(</span><span class="n" id="mw4w">a</span><span class="w" id="mw5A"> </span><span class="o" id="mw5Q">>></span><span class="w" id="mw5g"> </span><span class="mi" id="mw5w">5</span><span class="p" id="mw6A">))</span><span class="w" id="mw6Q"> </span><span class="o" id="mw6g">&</span><span class="w" id="mw6w"> </span><span class="mi" id="mw7A">1</span><span class="p" id="mw7Q">);</span> <span class="w" id="mw7g"> </span><span class="n" id="mw7w">a</span><span class="w" id="mw8A"> </span><span class="o" id="mw8Q">=</span><span class="w" id="mw8g"> </span><span class="p" id="mw8w">((</span><span class="n" id="mw9A">a</span><span class="w" id="mw9Q"> </span><span class="o" id="mw9g"><<</span><span class="w" id="mw9w"> </span><span class="mi" id="mw-A">1</span><span class="p" id="mw-Q">)</span><span class="w" id="mw-g"> </span><span class="o" id="mw-w">|</span><span class="w" id="mw_A"> </span><span class="n" id="mw_Q">newbit</span><span class="p" id="mw_g">)</span><span class="w" id="mw_w"> </span><span class="o" id="mwAQA">&</span><span class="w" id="mwAQE"> </span><span class="mh" id="mwAQI">0x7f</span><span class="p" id="mwAQM">;</span> <span class="w" id="mwAQQ"> </span><span class="n" id="mwAQU">printf</span><span class="p" id="mwAQY">(</span><span class="s" id="mwAQc">"%x</span><span class="se" id="mwAQg">\n</span><span class="s" id="mwAQk">"</span><span class="p" id="mwAQo">,</span><span class="w" id="mwAQs"> </span><span class="n" id="mwAQw">a</span><span class="p" id="mwAQ0">);</span> <span class="w" id="mwAQ4"> </span><span class="k" id="mwAQ8">if</span><span class="w" id="mwARA"> </span><span class="p" id="mwARE">(</span><span class="n" id="mwARI">a</span><span class="w" id="mwARM"> </span><span class="o" id="mwARQ">==</span><span class="w" id="mwARU"> </span><span class="n" id="mwARY">start</span><span class="p" id="mwARc">)</span><span class="w" id="mwARg"> </span><span class="p" id="mwARk">{</span> <span class="w" id="mwARo"> </span><span class="n" id="mwARs">printf</span><span class="p" id="mwARw">(</span><span class="s" id="mwAR0">"repetition period is %d</span><span class="se" id="mwAR4">\n</span><span class="s" id="mwAR8">"</span><span class="p" id="mwASA">,</span><span class="w" id="mwASE"> </span><span class="n" id="mwASI">i</span><span class="p" id="mwASM">);</span> <span class="w" id="mwASQ"> </span><span class="k" id="mwASU">break</span><span class="p" id="mwASY">;</span> <span class="w" id="mwASc"> </span><span class="p" id="mwASg">}</span> <span class="w" id="mwASk"> </span><span class="p" id="mwASo">}</span> <span class="p" id="mwASs">}</span>In this particular case, "PRBS-7" has a repetition period of 127 values.
Notation
The PRBSk or PRBS-k notation (such as "PRBS7" or "PRBS-7") gives an indication of the size of the sequence. is the maximum number of bits that are in the sequence. The k indicates the size of a unique word of data in the sequence. If you segment the N bits of data into every possible word of length k, you will be able to list every possible combination of 0s and 1s for a k-bit binary word, with the exception of the all-0s word. For example, PRBS3 = "1011100" could be generated from . If you take every sequential group of three bit words in the PRBS3 sequence (wrapping around to the beginning for the last few three-bit words), you will find the following 7 word arrangements:
"<u id="mwAUY">101</u>1100" <span typeof="mw:Entity" id="mwAUc">→</span> 101 "1<u id="mwAUg">011</u>100" <span typeof="mw:Entity" id="mwAUk">→</span> 011 "10<u id="mwAUo">111</u>00" <span typeof="mw:Entity" id="mwAUs">→</span> 111 "101<u id="mwAUw">110</u>0" <span typeof="mw:Entity" id="mwAU0">→</span> 110 "1011<u id="mwAU4">100</u>" <span typeof="mw:Entity" id="mwAU8">→</span> 100 "<u id="mwAVA">1</u>0111<u id="mwAVE">00</u>" <span typeof="mw:Entity" id="mwAVI">→</span> 001 (requires wrap) "<u id="mwAVM">10</u>1110<u id="mwAVQ">0</u>" <span typeof="mw:Entity" id="mwAVU">→</span> 010 (requires wrap)
Those 7 words are all of the possible non-zero 3-bit binary words, not in numeric order. The same holds true for any PRBSk, not just PRBS3.

