So-net無料ブログ作成
検索選択

scilab で、 LFSR の実験 [プログラム三昧]このエントリーを含むはてなブックマーク#

Scilab 5.5.2

Linear Feedback Shift Register (LFSR) って、ご存知ですか? シフトレジスタにちょっとしたフィードバック論理を加えて、ビット列を出力させる仕組みの事です。 この記事では、 scilab で LFSR のシミュレーションを行います。 scilab を使うのも、久々だねぇ。

LFSR って、何だろう

シフトレジスタ

フリップフロップを何段も接続したものをシフトレジスタと呼びます。 シフトレジスタは、 D から入ってきた入力が、その段数分のクロックを与えると出力に出てきます。


フィードバック付きシフトレジスタ

ここで、個々のフリップフロップの出力にある演算をほどこした結果を D 入力に与えてやると、シフトレジスタの出力からは、自動的にビット列が出力されます。

このとき、演算式を工夫すると、疑似乱数と呼ばれる出力を得られるようになります。 ここでは、 scilab を使って、疑似乱数の生成と解析を行います。

LFSR のシミュレーション

ガロアの LFSR 実装

LFSR の実現方法には、フィボナッチとガロアの二種類の実装が知られています。 ここでは、ガロアの実装にしたがって、実装を行います。 XOR 演算を使用してフィードバックを実装します。

ガロアの実装を表記するためにタップの位置をリストしたものを使います。 例えば、このような配列で表記します。


6 段 LFSR の実装例

配列の最初がシフトレジスタの段数に相当します。 残りは、 XOR 演算を取り入れるタップ位置を表現しています。 これをそのまま scilab の配列で表現して、フィードバック論理を作成します。

Galois_tap=[6 5];
lfsr_stage=Galois_tap(1);
lfsr_period=2**lfsr_stage-1;
lfsr_mask=zeros(1,lfsr_stage-1);
for i=2:size(Galois_tap,2);
  lfsr_mask(Galois_tap(i))=1;
end

これは、6段 LFSR 実装の例です。 タップリスト Galois_tap の第一要素は、シフトレジスタの段数 lfsr_stage を表しています。 この段数の LFSR で作成可能な疑似乱数の周期を lfsr_period で表します。 次に、フィードバックの演算で使用するタップの位置を lfsr_mask 配列で表現します。 Galois_tap で指定された位置に '1' を立てています。 この例では、 lfsr_mask=[0 0 0 0 1] となります。

lfsr_sr=ones(1,lfsr_stage);
lfsr=zeros(1,lfsr_period);
for i=1:lfsr_period;
  bit0=lfsr_sr(lfsr_stage);
  lfsr_sr=[bit0,bitxor(lfsr_sr(1:lfsr_stage-1),lfsr_mask*bit0)];
  lfsr(i)=bit0;
end

lfsr_mask を使って、ビット列を生成します。 シフトレジスタは、 lfsr_sr 配列に配置されます。 ビット列は、 lfsr 配列に出てきます。

scf(1);clf;plot((0:lfsr_period-1),lfsr)
LFSR の波形

出来上がったビット列をグラフ表示すると、このようになります。 LFSR で作成される疑似乱数は、その特徴として、1の数が 2**(lfsr_stage-1) となります。 この例では、 sum(lsfr)=32 となります。

y=abs(fft(lfsr));
scf(2);clf;plot((0:lfsr_period-1),y)
LFSR の周波数特性

さらに、LFSR の周波数特性を確認するために fft で解析しました。 すると、このように、 DC 成分以外は、平坦な特性になることがわかります。

DC 成分が 31 なので、 AC 部分はその1/8 (-18dB) になっています。

PWM で実装すると

pwm=zeros(1:lfsr_period);
for i=1:lfsr_period;
  pwm(i)=int(modulo(i+1,4)/2);
end
scf(1);clf;plot((0:lfsr_period-1),pwm)
PWM による実装

同じパルス数の波形を一定周期の PWM で実現する事もできます。 ある一定の数のパルスを得たいのであれば、これでも十分です。 しかし、周波数特性は大きく違います。

y=abs(fft(pwm));
scf(2);clf;plot((0:lfsr_period-1),y)
PWM の周波数特性

このように、ある特定の周波数で大きなエネルギーが出ている事がわかります。 この信号が原因でノイズが出る場合、突出してエネルギーが出ている特定周波数でのノイズを減らさなくてはなりません。 疑似乱数を使うと、ノイズが各周波数にまんべんなく広がり、エネルギーの突出が無くなります。 このため、ノイズ対策も行いやすくなります。

オーバーサンプリングしてみたら

oversample=16;
n_sample=lfsr_period*oversample;
s=zeros(1,n_sample);
k=1;
for i=1:lfsr_period;
  for j=1:oversample;
    s(k)=lfsr(i);
    k=k+1;
  end
end
scf(1);clf;plot((0:n_sample-1)/oversample,s)
オーバーサンプルした LFSR

上で作った LFSR 波形は、インパルスを使って表現していました。 実際には、各パルスが幅を持つことになります。 そこで、16倍のオーバーサンプルを行ってみました。

y=20*log10(max(abs(fft(s)/n_sample),ones(s)*1e-5));
scf(2);clf;plot((0:n_sample-1)/lfsr_period,y)
オーバーサンプルした LFSR の周波数特性

同様に、周波数特性を計算させました。 このグラフの縦軸は、 DC 成分を 1/2 (-6dB) としたデシベル表示で表現しています。 また、 log10() 関数でエラーが起こらないように、 -100dB を下限とする制限も設けています。

見た所、これまでとは少々異なっている様子です。 各周波数に広くエネルギーが分散しているのは同じですが、低い周波数の方がエネルギーが高く見えています。 LFSR を単体で解析した時には、すべての AC 成分が -24dB にそろっていたのですが、この解析結果では、 AC 成分の最大値が -24dB になっており、他の成分はすべて -24dB を下回っています。 また、 LFSR のクロック周波数の幅で、山が出来ています。

関連文献

Scilabで学ぶシステム制御の基礎

Scilabで学ぶシステム制御の基礎

  • 作者: 橋本 洋志
  • 出版社/メーカー: オーム社
  • 発売日: 2007/04
  • メディア: 単行本

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。