寻找用于生成标准PRBS序列的*通用*算法
Looking for a *general* algorithm for generating standard PRBS sequences
在电子学中有标准的伪二进制序列。在文献中,他们讨论了这些序列的生成多项式:
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
我在维基百科上找到了一段用于生成PRBS-7的C代码,但没有说明如何将其转换为创建其他序列。
这是我所拥有的,但除了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("rnRepetition Period = {0}", i);
break;
}
}
}
我不确定这是否是您想要的:
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给出了一个几乎正确的答案,所以我将投票支持他的答案。但以下是我如何修改他的答案,在生成多项式中使用这两个因子。我仍然不确定这是否完全正确,但它似乎确实提供了可用的结果。
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;
}
}
}
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 试图改善算法以更通用
- 特殊排序算法和通用签名
- 读取n位并用零填充的通用算法
- 在C++中实现通用图的Hierholzer算法
- 用于选择随机子集的通用算法实现
- 通用机器学习算法,训练集 -> "Predictor"
- 寻找用于生成标准PRBS序列的*通用*算法
- 在当前给定的通用场景中,我如何正确地为Hopcroft-Carp最大匹配算法构建图
- c++和通用图距离算法
- 对集合中的每个元素调用print的通用算法