基于24阶多项式的32位Fibonacci LFSR实现故障排查求助
24位LFSR实现问题及修正方案
我需要基于多项式 x^24 + x^23 + x^22 + x^20 + x^19 + x^18 + x^17 + x^16 + x^15 + x^13 + x^12 + x^8 + x^7 + x^6 + 1 实现线性反馈移位寄存器(LFSR),参考了Fibonacci型LFSR的C代码实现方式。
我使用uint32_t作为所有数据类型,函数调用时将LFSR初始化为start_state,核心实现代码如下:
bit = ((lfsr >> 7) ^ (lfsr >> 8) ^ (lfsr >> 9) ^ (lfsr >> 11) ^ (lfsr >> 12) ^ (lfsr >> 13) ^ (lfsr >> 14) ^ (lfsr >> 15) ^ (lfsr >> 16) ^ (lfsr >> 18) ^ (lfsr >> 19) ^ (lfsr >> 23) ^ (lfsr >> 24) ^ (lfsr >> 25))& 1u; lfsr = (lfsr >> 1) | (bit << 31);
但程序运行后陷入无限循环,无法正常终止。我设置了do{...} while (lfsr != start_state );的循环逻辑,理论上经过约1700万次迭代后应该回到初始状态并结束循环,这说明我在多项式到32位序列的映射上存在错误。以下是最简示例代码:
void lfsr_fib(uint32_t lfsr) { uint32_t bit; uint32_t period = 0; do { /* polynomial: x^24 + x^23 + x^22 + x^20 + x^19 + x^18 + x^17 + x^16 + x^15 + x^13 + x^12 + x^8 + x^7 + x^6 + 1 */ bit = ((lfsr >> 7) ^ (lfsr >> 8) ^ (lfsr >> 9) ^ (lfsr >> 11) ^ (lfsr >> 12) ^ (lfsr >> 13) ^ (lfsr >> 14) ^ (lfsr >> 15) ^ (lfsr >> 16) ^ (lfsr >> 18) ^ (lfsr >> 19) ^ (lfsr >> 23) ^ (lfsr >> 24) ^ (lfsr >> 25))& 1u; lfsr = (lfsr >> 1) | (bit << 31); ++period; printf("%d\n", period); } while (lfsr != start_state ); }
更新:修正方案
老师指出之前的错误——原本应该使用24位的初始值,却误设置成了32位。同时给出修正提示:保留32位初始值,将移位更新代码:
lfsr = (lfsr >> 1) | (bit << 31);
替换为:
lfsr = (lfsr >> 1) | (bit << 24);
内容的提问来源于stack exchange,提问作者Rico1990
相关产品推荐
相关产品推荐

