我正在编写一个OFDM系统,包括发送端和接收端。位去的第一个函数是加扰器,它基本上是一个 LFSR,我的多项式是x^7 + x^4 + 1
,简单地说,我对寄存器中的第 7 位和第 4 位进行异或,并使其成为移位寄存器的新第一位,以及异或该值与输入值,得到输出值。从图片上看,它可以在下面看到。
我正在使用一个类型的数组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;
}