M序列与伪随机二值图

本人没研究过算法,只是偶尔写程序接触到了一点,做个记录。
M序列是伪随机二进制序列,英文maximum length sequence (MLS)就是最长序列的意思。
它的产生是通过线性反馈移位寄存器(LFSR,linear feedback shift register),也就是多项式+一个移位反馈。逻辑上算是比较简单的。
下面是一个4级的LFSR。
The next value of register a3 in a feedback shift register of length 4 is determined by the modulo-2 sum of a0 and a1.

因为是伪随机,所以实际上是有周期的。m级LFSR序列最长周期为2^m-1,因此要获得较好的随机性,多项式的次数要越高越好。
如何衡量生成序列的随机性有多好呢?有个简单的可视化方法,就是伪随机二值图
Python写了一个简单程序,作图如下。可以看到m=8的时候伪随机序列还可以明显看到周期现象,到m=16时已经和np.random.randint(2, size=(100, 100))生成的伪随机序列看不出差异了。
伪随机二值图
附上Python小程序,多项式公式参考liquidsdr.org

import numpy as np
import matplotlib.pyplot as plt

def mseq_m4(seed=1, length=100):
    """ M-sequence with m=4
    """
    m_state = seed
    sequence = []

    for _ in range(length):
        bit = m_state & 0x1
        sequence.append(bit)
        feedback = ((m_state >> 0) ^ (m_state >> 3) ^ (m_state >> 4)) & 0x1
        m_state = (m_state >> 1) | (feedback << 3)

    return sequence

def mseq_m8(seed=1, length=100):
    """ M-sequence with m=8
    """
    m_state = seed
    sequence = []

    for _ in range(length):
        bit = m_state & 0x1
        sequence.append(bit)
        feedback = ((m_state >> 0) ^ (m_state >> 4) ^ (m_state >> 5) ^ (m_state >> 6) ^ (m_state >> 8)) & 0x1
        m_state = (m_state >> 1) | (feedback << 7)

    return sequence

def mseq_m16(seed=1, length=100):
    """ M-sequence with m=16
    """
    m_state = seed
    sequence = []

    for _ in range(length):
        bit = m_state & 0x1
        sequence.append(bit)
        feedback = ((m_state >> 0) ^ (m_state >> 4) ^ (m_state >> 13) ^ (m_state >> 15) ^ (m_state >> 16)) & 0x1
        m_state = (m_state >> 1) | (feedback << 15)

    return sequence


if __name__ == '__main__':
    col, row = 100, 100
    mseq_m4 = mseq_m4(1, col * row)
    binary_m4 = np.array(mseq_m4).reshape(col, row)

    mseq_m8 = mseq_m8(1, col * row)
    binary_m8 = np.array(mseq_m8).reshape(col, row)

    mseq_m16 = mseq_m16(1, col * row)
    binary_m16 = np.array(mseq_m16).reshape(col, row)

    np.random.seed(0)
    binary_np = np.random.randint(2, size=(col, row))

    # 创建一个包含多个子图的图像窗口
    fig, axs = plt.subplots(1, 4, figsize=(20, 6))

    # 在每个子图中绘制一个二进制数组
    axs[0].imshow(binary_m4, cmap='gray', interpolation='nearest')
    axs[0].set_title('M-sequence, m=4')

    axs[1].imshow(binary_m8, cmap='gray', interpolation='nearest')
    axs[1].set_title('M-sequence, m=8')

    axs[2].imshow(binary_m16, cmap='gray', interpolation='nearest')
    axs[2].set_title('M-sequence, m=16')

    axs[3].imshow(binary_np, cmap='gray', interpolation='nearest')
    axs[3].set_title('np.random')

    plt.show()
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值