M-系列のタップ位置の表とプログラム
M-系列のタップ位置の表を掲載します。 また同時に、シフトレジスタの段数とタップ数を指定すると、すべての有効なタップ位置を出力するプログラムも提供します。
M-系列(Maximal Length Sequence)とは何かを説明しておきます。
シフトレジスタがあって、途中のいくつかの段からタップを出し、それぞれの次段へは最終段の状態と XOR を取ってから接続したとします。 (Linear-feedback といいます) 初段には最終段の出力を与えてループ状にしておきます。 初期は全部がゼロではない状態とします。
この状態からクロックがいくつか進むと必ず元の状態に戻ってしまいます。 その元に戻るまでのクロック数は、タップの数と位置によって異なります。 このときに、最長のクロック数になるようなタップ数と位置の組み合わせを持つシフトレジスタを 「そのシフトレジスタ段数における Maximal Length Sequence Linear-feedback Shift Register」と呼び、 出力されるビットの列をその段数での「Maximal Length Sequence(最長符号、M-系列)」と呼びます。
n 段のシフトレジスタでは、この最長のクロック数は 2^n-1 になります。 タップ数と位置は試行錯誤的に見つけ出します。 ですからその表は一つの知財です。
(接続のやり方には別にもう一つの方法があります。 ==>これ を参照)
時々疑似乱数を作る上で必要になるので作りました。シフトレジスタがあって、途中のいくつかの段からタップを出し、それぞれの次段へは最終段の状態と XOR を取ってから接続したとします。 (Linear-feedback といいます) 初段には最終段の出力を与えてループ状にしておきます。 初期は全部がゼロではない状態とします。
この状態からクロックがいくつか進むと必ず元の状態に戻ってしまいます。 その元に戻るまでのクロック数は、タップの数と位置によって異なります。 このときに、最長のクロック数になるようなタップ数と位置の組み合わせを持つシフトレジスタを 「そのシフトレジスタ段数における Maximal Length Sequence Linear-feedback Shift Register」と呼び、 出力されるビットの列をその段数での「Maximal Length Sequence(最長符号、M-系列)」と呼びます。
n 段のシフトレジスタでは、この最長のクロック数は 2^n-1 になります。 タップ数と位置は試行錯誤的に見つけ出します。 ですからその表は一つの知財です。
(接続のやり方には別にもう一つの方法があります。 ==>これ を参照)
ここ ==> Galois Tap Positions (ver. 1.2) に置いておきますのでご利用ください。
(IE: 右クリックして「対象をファイルに保存」を選ぶ)
(FireFox: 左クリックし、保存する)
ダウンロードして展開するとエクセルのファイルと M_SEQ.COM というプログラムが出てきます。
M_SEQ.COM は非常に高速に最長符号となるタップ位置を検出するDOSのソフトです。 32 段までのシフトレジスタに対応しています。 Intel チップで動かすもののうち、これより速いプログラムは多分無いと思います。
Maximal Length Sequence の実装にはフィボナッチ(Fibonacci)法とガロア(Galois)法とがありますが、フィボナッチでは多くのXORのゲートを通るループになるため高速の動作ができません。 ですのでタップが 3 以上になるときは一般的にガロアのほうが使われます。 (タップが2つの時はガロアもフィボナッチも結局同じ接続です。)
用意した表はガロア法によるもので、3段から32段までの M-Sequence の乱数を作ることができます。
フィボナッチに変更するには ==>このページ を参照してください。エクセルの表には、13段以上は組み合わせが非常に多くなるので、200個に限定して掲載しています。
HDD の消去プログラム DESTROY (DOS Tools のページの中程)に使う乱数は [32, 31, 30, 10]g の方法で作っています。
伝送路のビット誤り率 (BER) を計測する際に PRBS (Pseudo-Random Binary Sequence) を使うことが一般的に行われていますが、この表の31段を使い 2^31-1 の PRBS を発生させている例を見ることがあります。 2^31-1 というのはメルセンヌ素数にあたります。
Fibonacci のことを SSRG (Simple Shift Register Generator) ともいいます。 またその時は、Galois のことを MSRG (Modular Shift Register Generator) といいます。
簡単にホワイトノイズがほしいときもこれが使えますが、帯域には気を付けてください。
次のリストは Intel の 32bit MPU で 2^32-1 のM系列乱数を発生させるサブルーチンです。 (リストの途中に出てくる 80200003h という値は上のプログラム M_SEQ.COM で出力される値のひとつですが、この値までたどり着くのは非常に長時間かかります。)
;-------------------------------------------------------------------
;IA32 Random Number Genarator using M-Sequence [32, 31, 30, 10]g
; by T. Fujiwara 3/10/05
;Initialize: M_RND double word with any hex number except zero
;Input: None
;Output: Carry Bit = 1 bit random
; al = 1 byte random
; ax = 1 word random
; eax= 1 double word random
;Entry: M_RND32
;Exit: ret
;-----------------------------------
.386
M_RND DD 1 ;Random number seed
M_RND32:
mov eax,M_RND
shr eax,1
pushf
jnc @F
xor eax,80200003h
@@: mov M_RND,eax
popf
ret
;-------------------------------------------------------------------


-----------------
[M-系列、関連記事]
- NRZ 信号と PRBS とカップリング
- M系列で White Noise の生成
- M系列のレジスタを0で始める、ガロアとフィボナッチを入れ替える
[余談]
maximum と maximal は似た単語ですが意味は若干異なります。 違いは:
maximum は「最大の」という意味で、特定の組の中で最大のものを言います。
maximal は数学で言う「極大の」という意味で、特定の組の中で数値が順に並んでいないときに、その近辺の値を比較して一番大きいものを言います。 例えば、山並みがあって峰がたくさんあるような場合に、それぞれの峰は maximal です。
その山並みの中で一番高い峰が maximum です。
上の M-seq では5段の12も14も、6段の21も maximal です。
