gpt4 book ai didi

c - 如何在 C 中反转 LFSR 和移位寄存器?

转载 作者:行者123 更新时间:2023-12-01 14:44:40 24 4
gpt4 key购买 nike

我正在为一个 OFDM 系统编程,包括发射器和接收器端。比特进入的第一个函数是扰码器,它基本上是一个 LFSR,我的多项式是 x^7 + x^4 + 1,简单地说,我对寄存器中的第 7 位和第 4 位进行异或, 并将其作为移位寄存器新的第一位,并将该值与输入值异或,得到输出值。如下图所示。

enter image description here

我正在使用 short 类型的数组来保存位。由于程序中的一些后期功能,我需要这种数组类型。这对我来说更方便。我创建了一个将寄存器右移的函数,以及另一个用于扰频器的函数。代码如下:

void leftshift(short *in, short *out, unsigned long len, unsigned short shift) {

unsigned long i;

for (i = 0; i < len - shift; i++) {
out[i] = in[i + shift];
}

for (i = len - shift; i < len; i++) {
out[i] = 0;
}
}

void rightshift(short *in, short *out, unsigned long len, unsigned short shift) {

unsigned long i;

for (i = len - 1; i >= shift; i--) {
out[i] = in[i - 1];
}

for (i = 0; i < shift; i++) {
out[i] = 0;
}
}

void scrambler(short *in, short *out, unsigned long len, short *initial_state) {

unsigned long i;
short carry;
short *shift_register = initial_state;

for (i = 0; i < len; i++) {
carry = (shift_register[3] + shift_register[6]) % 2;
rightshift(shift_register, shift_register, 7, 1);
shift_register[0] = carry;
out[i] = (in[i] + carry) % 2;
}
}

现在,重点是作为解扰器过程的一部分,我需要对扰码器的逆过程进行编码。在我的加扰器中,我正在右移。它的逆运算是否只涉及左移,并保持抽头序列和寄存器的初始配置相同?虽然,如果我左移并检查结果,它与初始输入的结果不同。有什么想法吗?

编辑:

int main(void) {

const unsigned SIZE = 24;

short in[SIZE] = { 0, 0, 0, 0, 1, 0, 0, 0,
0, 1, 1, 1, 0, 0, 1, 0,
1, 0, 0, 1, 1, 1, 0, 0 };
short init[7] = { 1, 1, 1, 1, 1, 1, 1 };

short *out_scrambler = (short *)malloc(sizeof(short)*SIZE);
short *out_descrambler = (short *)malloc(sizeof(short)*SIZE);

scrambler(in, out_scrambler, SIZE, init);
scrambler(out_scrambler, out_descrambler, SIZE, init);

return 0;
}

最佳答案

加扰过程是它自己的逆过程;你只需要再次与相同的序列进行异或。

(a ^ b) ^ b == a

关于c - 如何在 C 中反转 LFSR 和移位寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39164306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com