线性反馈移位寄存器

时间:2015-11-28 18:52:31

标签: python-3.x

我已从stackoverflow成员提出的问题中获取此代码:

def lfsr(seed, taps):
    sr, xor = seed, 0
    while 1:
        for t in taps:
            xor += int(sr[t-1])
        if xor%2 == 0.0:
            xor = 0
        else:
            xor = 1
        print xor
        sr, xor = str(xor) + sr[:-1], 0
        print sr
        if sr == seed:
            break

lfsr('11001001', (8,7,6,1))

我理解代码,但我想只打印此LFSR的前10个结果而忽略其他结果。我怎么能在python 3中做到这一点?

3 个答案:

答案 0 :(得分:1)

一种简单的方法可以让您更好地控制函数计算的值的使用方法,即将函数转换为生成器。只需将print sr行替换为yield sr代替(并先删除print xor):

def lfsr(seed, taps):
    sr, xor = seed, 0
    while 1:
        for t in taps:
            xor += int(sr[t-1])
        if xor%2 == 0.0:
            xor = 0
        else:
            xor = 1
        sr, xor = str(xor) + sr[:-1], 0
        yield sr
        if sr == seed:
            break

调用该函数的方式需要更改,因为它不再进行任何打印。要复制旧行为,请使用for循环,如下所示:

for state in lfsr('11001001', (8,7,6,1)):
    print state[0] # the xor value
    print state # the sr value

要将输出限制为10个值,您可以使用enumerate修改该循环,并在看到索引10(第11个结果)时执行break

for i, state in enumerate(lfsr('11001001', (8,7,6,1))):
    if i == 10:
        break
    # printing or whatever here

可能还有其他方法可以限制结果的数量(例如使用itertools.islice)。

答案 1 :(得分:0)

再次更改了代码,但不确定它是否正是您所需要的:

def lfsr(seed, taps):
    sr, xor = seed, 0
    for _ in range(10):
        for t in taps:
            xor += int(sr[t - 1])
        if xor % 2 == 0.0:
            xor = 0
        else:
            xor = 1
        # print(xor)
        sr, xor = str(xor) + sr[:-1], 0
        # print(sr)
        if sr == seed:
            break
    print("Return %s" % sr)
    return sr


truth_table = {
    '00000': '0',
    '00001': '1',
    '00010': '1',
    ...
    '11111': '0',

}

lfsr_r = []
lfsr_r.append(lfsr('11001001', (8, 7, 6, 1)))
lfsr_r.append(lfsr('11001001', (3, 4)))
lfsr_r.append(lfsr('11001001', (7, 8)))
lfsr_r.append(lfsr('11001001', (2, 3, 5)))
lfsr_r.append(lfsr('11001001', (1, 4, 7)))

for pos in range(10):
    seq = ''
    # get [pos] bit from each sequence
    for r in lfsr_r:
        seq += lfsr_r[r][pos]
    result = truth_table[seq]
    print("Result for %s column: %s" % (pos, result))

答案 2 :(得分:0)

使用 pylfsr,您可以获得预期的结果。对于 8 位 LFSR 和反馈多项式 [8,7,6,1] (lfsr('11001001', (8,7,6,1)) 的示例,这里是获取前 10 位输出的代码< /p>

import numpy as np
from pylfsr import LFSR

s = '11001001'
s = [int(b) for  b in s]
L = LFSR(initstate=s, fpoly=[8,7,6,1])
seq = L.runKCycle(10)
print(seq)

输出

[1 0 0 1 0 0 1 1 0 1]