Я программирую систему OFDM, как стороны передатчика, так и приемника. Первая функция, в которой идут биты, - это скремблер, который в основном представляет собой LFSR, где мой многочлен равен x^7 + x^4 + 1
, просто I XOR 7-й и 4-й бит в регистре и делает его новым первым битом сдвигового регистра, а также XOR, значение с входным значением, чтобы получить выходное значение. Изобразимо, это видно ниже.Как инвертировать LFSR и регистр сдвига в C?
Я работаю с массивом типа 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;
}
}
Теперь дело в том, что в рамках процесса дешифратора, мне нужно кодировать обратный скремблер. В моем скремблере я делаю правую смену. Имеет ли обратная связь с ним просто выполнение сдвига влево, и оставляя последовательность кранов и начальную конфигурацию регистра одинаковой? Хотя, если я делаю сдвиг влево и проверяю результат, это не тот же результат, что и исходный вход. Есть идеи?
EDIT:
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;
}
В целом, это выглядит очень неэффективно. Любая причина, по которой вы не используете справочные таблицы? – Lundin