So-net無料ブログ作成
前の5件 | -

1/fゆらぎをHDLにしてみた [FPGA]

前回、間欠カオス法を整数化したので最低限度の18bit精度ででHDLしてみた(というか、正確にはHDL化を前提に必要ビット数を見積もっていたのだけども)。

それで結論から先に言うと、どうやら18bit精度だと特定の値で繰り返しパターンに入ってしまうようだ。
これが実際にHDL実装したもののSignalTapで観測した様子。
D8Q--eaUEAE7KDD-orig.png

綺麗に繰り返しパターンにはまってしまっててどうしたものかと考えていたところ、そもそもカオス系なんだから、フィードバックにちょっとだけノイズを混ぜてやれば安定系から崩れるのでは?と思い、2乗の値を加算する部分でLSBの1ビットだけランダムにひっくり返す処理を追加してみた。
と、こう書くとややこしい処理をいれたなと思われそうだけども、やってることはXorshit32の適当なビット(今回はMSBを使った)でフィードバックのLSBにXORをかけただけ。
結果はこう。
D8RDTVYUYAEEGt1-orig.png

綺麗にカオス挙動に戻った。
ついでなので、乗算器を使ってないタイミングでランダム値の2乗計算を行って、rand値、rand^2値、1/f値を同時に取得できるように修正。
D8RM79VVUAA7Xzm-orig.png

これで実装ロジック数は120LE+2DSPとかなりコンパクトになっている。

PWMでLEDをチカチカさせるとこんな感じ


1/fゆらぎの続き

前回書いた1/fゆらぎのコードを使ってハードウェア化しようと整数化をしていたところ、この間欠カオス法に面白い特徴があることが分かった。

まず、真っ当に単精度浮動小数で実装した間欠カオス法で、1024個の値を生成してパワースペクトルを調べたのがこちら。
fluctuator_float.png
FFTの窓関数を適用していないので、512以上の部分はイメージが出てスペクトルが強くなってたり、前回紹介した端っこの処理方法を変えているので低周波側でスペクトルが頭打ちになってたりしてるが、ざっくり1/fになっている。

これをそのまま24bit固定小数で実装しなおしたものがこちら。
fluctuator_int24.png
floatの仮数部は24bit分なので、0.0~1.0区間では24bit固定小数と同じ精度になる。当然、ここではほとんど同じパターンになる(カオス法なので細かい違いは出る)。

次に16bit固定小数にしたものがこちら。
fluctuator_int16.png
1/fのパワースペクトルにならず、1/fっぽいグランドノイズと特定の周波数で強いピークの2つに分かれている。

さらに8bit固定小数にする。
fluctuator_int8.png
ピークそのもののスペクトルは1/fっぽく並んでいるものの、特定の周波数(ここでは49の倍数になっている)のみの成分だけになり、ほぼ周期性のあるパターンになってしまっている。
こういうパターンでたとえばロウソクの炎の模擬をすると、安いキャンドルICのような周期的な点滅が目立つ挙動になってしまう。

そこで、どれぐらいの精度があれば1/fゆらぎが得られるかを調べたところ、18bit固定小数でピークが目立たないパターンになった。
fluctuator_int18.png
18bit長はハードウェア実装する場合に18bit×18bitの乗算器1個でカバーできるため都合が良い。実際これがギリギリ下限の精度だろう。MCUでソフト実装する場合は18bitに削るメリットは無いので、24bit固定小数を使う方がいいだろう。

●結論
間欠カオス法には18bit以上の演算精度が必要である。


おまけ。
MCU向けに擬似ランダムをXorshift32に置き換えた、24bit固定小数間欠カオス法のソースコード
#include <stdint.h>

uint32_t xorshift32(void)
{
  static uint32_t x = 2463534242;

  x ^= (x << 13);
  x ^= (x >> 17);
  x ^= (x << 15);
  return x;
}

uint32_t pow_u24(uint32_t a, int s)
{
  uint64_t m, ans;

  m = a & 0xffffff;
  ans = (m * m) >> s;
  return (uint32_t)ans;
}

uint32_t fluctuator(void)
{
  static uint32_t f = 0;

  if ((f & 0xf00000) == 0 || (f & 0xf00000) == 0xf00000) {
    f = (xorshift32() & 0x7fffff) + 0x400000;
  } else {
    if (f & (1UL<<23)) {
      f = (f - pow_u24((1UL<<24) - f, 23)) & 0xffffff;
    } else {
      f = (f + pow_u24(f, 23)) & 0xffffff;
    }
  }
  return f;
}

1/fゆらぎ

1/fゆらぎのパターンを生成するアルゴリズムの一つに間欠カオス法というのがある。
if (x < 0.5) {
  x = x + 2*x*x;
} else {
  x = x - 2*(1-x)*(1-x);
}

簡単なコードで1/fのパワースペクトルを得られるのだけど、そのままだと0.0や1.0に張り付きやすいという問題もある。
そこで0近傍や1近傍に近寄ったときに引き剥がす方向の処理を入れたのが修正間欠カオス法。
if (x < 0.05) {
  x = x + 0.06;
} else if (x >= 0.95) {
  x = x - 0.04;
} else if (x < 0.5) {
  x = x + 2*x*x;
} else {
  x = x - 2*(1-x)*(1-x);
}

Maker Faire Kyoto 2019開催!

5/4~5の日程で、Maker Faire Kyotoが開催されました。初の西日本地区開催です!
うちは時間的な都合もあり、ニコニコ技術部ブースに電飾スカートを出展するいつもの展示となりました。
IMG_r1k28l.jpg

ただ電飾スカートもかなりガタが来ているようで、二日目の終わりにはとうとう左側の電源系統がシャットダウンしてしまいました。作り直すにも予算ががが‥‥
IMG_-d5fazh.jpg
IMG_-r1sgth.jpg

正直、けいはんなのKICK(イノベーションセンター)という会場では人なんか来ないだろうとか思ってましたが、蓋を開けてみれば大方の予想の5倍ぐらいの人が来て大変盛況でした。
電飾スカートもたくさんの人に見て貰えたようでなによりです。来年も開催されるといいなあ。

Maker Faire Kyotoの雰囲気などは下のリンクからどうぞ。

Twitter
ハッシュタグ#MFKyoto2019

公式イベントページ
Maker Faire Kyoto 2019

Make:Blogのレポート
Maker Faire Kyoto 2019レポート #1:関西で初めてのMaker Faireがついに開幕、開場前から来場者が詰め掛ける
Maker Faire Kyoto 2019レポート#2:自作ピンボールやテスラコイルなど、子どもから大人まで夢中になる光りもの
Maker Faire Kyoto 2019 レポート#3:鶏の着物や無限に歩くダンゴムシ、笑顔を追いかけるクリスマスツリーなど、意表を突くユニークな展示たち

高速SPI信号

FPGAメインだとSPIでも100MHzとかで動かそうとしてしまうわけですが、とあるSPIデバイスの実機テストをしていて「そういや最近は信号品質の解説とかも見かけないなあ」と思ってTwitter用に画像1枚にまとめました。
DSC_2194_all.jpg
前の5件 | -