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

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

EFM8UB1のファクトリーブートローダー

前回からのつづき。

EFM8UB1のRev.CシリコンからはファクトリーブートローダーとしてCDCブートローダーが入っている(8kバイト品はUART、それ以上はUSB CDC)。
マニュアルとしてAN945 (pdf)に記載があるものの、いまいち要領を得ないのでまとめておく。
以下はEFM8UB10F16G-Cでの手順。

・書き込みツール
書き込みツール一式は下記のリンクからダウンロードできる。
www.silabs.com/documents/public/example-code/AN945SW.zip
Windowsクライアントでは、この中のTools→Windowsフォルダにある efm8load.exe と hex2boot.exe を使う。

・CDCブートローダへのエントリ
C2Dピンを'L'にした状態でリセット(C2CKピンをL)または電源投入すると、ブートローダーに入る。
なので、ユーザープログラム側でC2Dピンを使っている(特に入力)と、意図しないタイミングでブートローダーにブランチする場合がある。CDCブートローダー前提ならC2Dピンはユーザープログラムでは未使用にしておく。

この状態でUSBを接続すると、WindowsからはHIDクラスのデバイスとして認識される。VCPではないのでCOMポートとしては見えない。

・ブートコードへの変換
CDCブートローダーで書き込む場合、プログラムコードを.efm8ファイルという形式に変換する必要がある。
変換には hex2boot.exe を使う。
Simplicity IDEでプロジェクトをビルドしてできる.hexファイルを次のようにして.efm8ファイルに変換する。-oオプションは省略できないので注意。

> hex2boot hoge.hex -o hoge.efm8


・EFM8への書き込み
用意した.efm8ファイルを efm8load.exe でMCUへ書き込む。

> efm8load hoge.efm8

エラーがなければプログラムが書き込まれた後、実行される。
以降は、リセット時C2Dピンが解放または'H'レベルであれはユーザープログラムが優先して実行される。

もしCDCブートローダーエントリされていなければ

> efm8load foo.efm8
ERROR: Unable to open port!

というようなエラーがでる。


前の5件 | -