【问题标题】:Looking for a *general* algorithm for generating standard PRBS sequences [closed]寻找用于生成标准 PRBS 序列的*通用*算法 [关闭]
【发布时间】:2016-03-13 17:40:17
【问题描述】:

在电子领域有标准的伪二进制序列。在文献中,他们谈到了这些序列的生成多项式:

PRBS-7  : x^7 + x^6 + 1
PRBS-10 : x^11 + x^10 + 1
PRBS-15 : x^15 + x^14 + 1
PRBS-23 : x^23 + x^18 + 1
PRBS-31 : x^31 + x^28 + 1

我能够在Wikipedia - Pseudo-random binary sequence 上找到用于生成 PRBS-7 的 C 代码的 sn-p,但没有指示如何将其转换为创建其他序列。

这就是我所拥有的,但除了 PRBS-7 之外,它只生成零。此代码是 C#,但我可以使用 C 或 C++ 示例。

private static void Generate(int v1, int v2, StringBuilder roots, StringBuilder bits)
{
    // This works fine for PRBS7 with v1=7, v2=6 but fails for 15,10; 23,18; 31,28
    const byte start = 2;
    byte a = start;
    for (int i = 1; i < 2000; i++)  // I added the 2000 limit, otherwise was infinite loop
    {
        roots.AppendFormat("{0:X2} ", a);
        int newbit = (((a >> v1 - 1) ^ (a >> v2 - 1)) & 1); // my naive attempt to generalize the algorithm
        a = (byte)((byte)((a << 1) | newbit) & 0x7f);
        bits.Append(newbit);
        if (i % 32 == 0)
        {
            roots.AppendLine();
            bits.AppendLine();
        }
        if (a == start)
        {
            roots.AppendFormat("\r\nRepetition Period = {0}", i);
            break;
        }
    }
}

【问题讨论】:

  • 这既不是 C 也不是 C++ 代码,所以也请不要标记。如果您要求为您翻译上述代码,这与 Stack Overflow 无关,
  • 旁注:“没有说明如何转换”有些错误 - 维基百科文章链接的en.wikipedia.org/wiki/Linear_feedback_shift_register 显示了大量背景信息/示例(这是您没有添加维基百科链接的原因吗?自己)?
  • 到目前为止问题看起来太宽泛/不清楚 - 代码转换是题外话,维基百科已经提供了大量信息/示例。当一个字节移动超过 8 位并转换为字节时会发生什么,得到了多次回答。
  • 不确定您所说的题外话是什么意思。我找到了一个代码 sn-p 但不知道如何使它适用于除 PRBS-7 案例之外的任何东西。我对 C、C++ 或 C# 的答案很满意,所以这就是我标记所有 3 个的原因。我不是在寻找翻译,只是帮助让代码在一般情况下工作。我觉得我的帖子的标题表达了这一点。对不起,如果我不清楚。
  • Alexei - 维基百科上可能有大量的移位寄存器样本,这可能是真的,除非这不是我感兴趣的。我正在寻找的是一个通用算法生成行业中称为 PRBS7、PRBS15、PRBS23 和 PRBS31 的特定伪随机二进制序列。我能够找到的唯一示例代码仅针对 PRBS7,并且没有关于如何将其用于其他情况的 cmets。

标签: c# c++ c algorithm random


【解决方案1】:

Ammar 给出了一个几乎正确的答案,所以我将投票赞成他的答案。但这是我修改他的答案以在生成多项式中使用这两个因素的方式。我仍然不能肯定这是完全正确的,但它似乎确实提供了可用的结果。

static void GeneratePrbSsequences(int v1, int v2)
{
    int a = 0x02;
    int period = (int)(Math.Pow(2, v1) - 1);
    v1--;
    v2--;
    for (int i=1;;i++)
    {
        var newbit = (((a >> v1) ^ (a >> v2)) & 1);
        System.Diagnostics.Debug.Write(newbit);
        if (i%8 == 0) 
        {
            System.Diagnostics.Debug.Write(" ");
            if (i%128 == 0) System.Diagnostics.Debug.WriteLine("");
        }
        a = ((a << 1) | newbit) & period;
        if (a == 0x02)
        {
            System.Diagnostics.Debug.WriteLine("");
            System.Diagnostics.Debug.WriteLine("Computed period = {0}, Actual period = {1}", period, i);
            break;
        }
    }
}

【讨论】:

    【解决方案2】:

    我不确定这是不是你想要的:

    private static void Main(string[] args)
            {
                var sequence = GeneratePrbSsequences(15);
                Console.WriteLine(string.Join("\n",sequence));
                Console.WriteLine("Repetition Period = {0}", sequence.Count);
                Console.ReadLine();
            }
    
        static List<string> GeneratePrbSsequences(int number)
        {
            var a = 0x02;
            var period = (int)(Math.Pow(2, number) - 1);
            var sequenceList = new List<string>();
            do
            {
                var v1 = number - 1;
                var v2 = number - 2;
                var newbit = (((a >> v1) ^ (a >> v2)) & 1);
                a = ((a << 1) | newbit) & period;
                sequenceList.Add(string.Format("{0:X2}", a));
                Console.WriteLine();
            } while (a != 0x02);
            return sequenceList;
        }
    }
    

    【讨论】:

    • Ammar - 在生成多项式中使用这两个因子进行了一些小的修改,这看起来非常好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多