Python中的伪随机二进制序列(PRBS)

4

我如何通过Python生成伪随机二进制序列(PRBS)信号?


1
欢迎来到Stack Overflow!我们鼓励您研究问题。如果您已经尝试过某些方法,请将其添加到问题中 - 如果没有,请先研究和尝试您的问题,然后再回来。 - user647772
3个回答

3
请看下面的代码。它有些粗糙,但您可以了解如何使用NumPy创建随机信号和PRBS(伪随机二进制序列)。
import numpy as np
import matplotlib.pyplot as plt

nstep = 300

# random signal generation

a_range = [0,2]
a = np.random.rand(nstep) * (a_range[1]-a_range[0]) + a_range[0] # range for amplitude

b_range = [2, 10]
b = np.random.rand(nstep) *(b_range[1]-b_range[0]) + b_range[0] # range for frequency
b = np.round(b)
b = b.astype(int)

b[0] = 0

for i in range(1,np.size(b)):
    b[i] = b[i-1]+b[i]

# Random Signal
i=0
random_signal = np.zeros(nstep)
while b[i]<np.size(random_signal):
    k = b[i]
    random_signal[k:] = a[i]
    i=i+1

# PRBS
a = np.zeros(nstep)
j = 0
while j < nstep:
    a[j] = 5
    a[j+1] = -5
    j = j+2

i=0
prbs = np.zeros(nstep)
while b[i]<np.size(prbs):
    k = b[i]
    prbs[k:] = a[i]
    i=i+1

plt.figure(0) 
plt.subplot(2,1,1)
plt.plot(random_signal, drawstyle='steps',label='Random Signal')
plt.legend()
plt.subplot(2,1,2)
plt.plot(prbs, drawstyle='steps', label='PRBS')
plt.legend()
plt.show()

enter image description here


3

这是一个基本的prbs31实现,使用单项式多项式: x31 + x28 + 1

def prbs31(code):
    for i in range(32):
        next_bit = ~((code>>30) ^ (code>>27))&0x01
        code = ((code<<1) | next_bit) & 0xFFFFFFFF
    return code

给定一个整数,该函数将逐位生成PRBS序列并返回一个包含下一个32位序列的整数。请注意,输入整数的x31以上的位与输出无关。

XOR和取反用于执行按位(模2)加法。这可能不会改善上面代码的性能,但您可以使用位运算以一次计算更快的性能。例如:

def prbs31_fast(code):
    next_code = (~((code<<1)^(code<<4)) & 0xFFFFFFF0)
    next_code |= (~(( (code<<1 & 0x0E) | (next_code>>31 & 0x01)) ^ (next_code>>28)) & 0x0000000F)
    return next_code

-3
>>> from random import choice
>>> def prbs():
...     while True:
...         yield choice([False, True])

3
这不是一个 PRBS 生成器。 - betontalpfa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接