2016-08-26 14 views
3

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

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; 
    } 
} 

次に、ポイントはデスクランブラ工程の一部として、私がスクランブラの逆をコーディングする必要があることです。私のスクランブラーでは、私は正しいシフトをしています。それの逆は、左シフトを行い、タップシーケンスとレジスタの初期設定を同じままにしますか?一方、私が左シフトを行い、結果をチェックすると、それは最初の入力と同じ結果ではありません。何か案は?

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; 
} 
+0

これは非常に非効率的に見えます。ルックアップテーブルを使用していない理由は何ですか? – Lundin

答えて

1

スクランブル処理が独自の逆です。もう一度同じシーケンスでXORする必要があります。あなたはA xor X = Bを持って

(a^b)^b == a 
+0

はい、私はそれについて。しかし、同じスクランブラー関数を2回呼び出すと、2番目の呼び出しで最初の呼び出しの出力を2番目の呼び出しの入力とすると、最終結果は同じになりません。私は 'out_descrambler!= in'を編集したコードセグメントで意味します。 – typos

+0

@typos - 標準のデバッグ方法で解決できるバグがあるようです。 –

+0

@typosスクランブラーがデスクランブラーと同じ状態を変更しているため、編集した部分では機能しません。 – Art

0

、あなたの質問は右、BからAを取得する方法、その後のですか?または私はここに何かを逃していますか?

A xor X = B =>B xor X = A

また、あなたの全体のLFSRのようなもののように単純化することができます。

uint8_t state; 
outbit = ((state >> 7)^(state >> 4)) & 1; 
state = (state >> 1) | outbit; 

のLFSRの全体のポイントは、彼らがめちゃくちゃ安いということです。これは、128倍以上のメモリと、必要以上の大きさまたは3倍の命令を使用して実装するのはかなり生産的です。

関連する問題