私はトランスミッタとレシーバの両方のOFDMシステムをプログラミングしています。ビットが行く最初の関数は、基本的にLFSRであるスクランブラです。私の多項式はx^7 + x^4 + 1
です。簡単には、レジスタの7番目と4番目のビットをXORし、シフトレジスタの新しい最初のビットにしますその値を入力値とXORして出力値を取得します。絵画的には、それは下に見ることができます。CでLFSRとシフトレジスタを逆にするには?
私はビットを保持するタイプ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