「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



https://twitter.com/dzf00214/status/772974053539745792

ヤマト2202のポスター。カッチョイイ。CGじゃない、
手塗りの感じだよなぁ。
(新手のトゥーンレンダリングじゃないよねぇ?)


https://twitter.com/Wu_Niang/status/772744555703656448

テレサが若返ってる…。オイラの脳内では、20代後半の
しっとりした女性なんだけど、10歳くらい若返ってる
感じじゃね?うーーーーん。

しかし、

https://www.youtube.com/watch?v=iwLfcUEnQKs

ティーザー過ぎるだろこれ。1分の動画の半分が、
原作とかシナリオとかの名前。(字幕)

でも、白色彗星とかパイプオルガンが出てくるって
ことは判ったぞ。
当然ながら、ガトランティスのかっちょいい艦船は
いっぱい登場するんじゃろう。フフフ。
わーい、11番惑星出てくる。

主役は、どうやって生き返るんだろう?亜空間だから
どうのこうの、みたいな屁理屈付けがでてくるん
だろうか?
今回は、海から発進するのかなぁ?






昨日の疑問。mbedって、1ピンだけ出力するデジタル出力
機能を使うとき、オンオフだけすると、最速でどのくらい
の速度が出るのか。

Arduinoもそうだけど、内部はポート単位でのアクセスを
してるので、1ピンだけ変化させるのに、読み込んでから
ビット操作して出力みたいなことしてるのと、端子番号
から「ポート番号+ピン番号」に変換するのに、多少の
時間が必要。

(ちなみにArduinoだと、計算上はしてみると200kHz以下
 って感じだけど、実測は↓120kHzくらいらしい)
http://ehbtj.com/electronics/speedup-arduino/


で、mbed。手元のSeeeduino Arch(LPC11U24の48MHz)を
使って、いわゆるLチカのプログラムを弄って、デジタル
出力にしてみる。プログラムがこんな。
#include "mbed.h"

DigitalOut d8pin(P1_26);  // Digital 8pin

int main() {
    while(1) {
        d8pin = 1;
        d8pin = 0;
    }
}

単純に、オン/オフするだけのプログラム。waitも
入れない。

Arduino型基板なので、D8端子相当の「P1_26」にただ
出力してるだけ。

テスターで計ってみると、1.02MHzって出てくる。うん。
とりあえず、Arduinoよりも高速なのはわかった。
あと、5110の4MHz入力よりも十分遅いのは判った。
多分問題ないんだろう…



と思いつつ、デューティー比はこれだと当然わからない
ので、久々にオシロを引っ張り出してきて、計ってみた。


久々に引っ張り出したUSBオシロ。以前秋月で買った、
60MHzの1000円プローブをつないで計ってみた。
レンジは、1MHz/DIVくらいで、5Vレンジくらいで
計ればいいのかな?と思って設定してみる。

…なんだか信号が拾えない。

「ん?とうとう断線でもしちゃったか?」

と思って、付属のプローブをつないで計ってみると、
なんだかすごく小さい電圧で出てくる。
よく考えてみたら、電圧レンジが5Vなんじゃなくて、
これ、5V/DIVだな。そうか。ってことで、1V/DIVに
切り替えてみると、ちゃんと出た。
(信号部分をアップ。クリックで拡大)



カーソルで1波形分を測ってみると、画像下部のように、
1.009MHzってでてくる。オン、オフ、それぞれ約500n秒。


ディユーティー比もほぼ1:1で表示されてる。うん。


やっぱり、while文とかのオーバーヘッドはほとんど
ゼロで、大部分は、ポート選択と信号設定で終始して
いるんだろうな。

オンの時間(ポートに1を出力)より、オフの時間
(ポートに0を出力するのと、while文のループ処理)
を比べると、確かにオフの時間のほうが微妙に長い
んだけど、ほとんどは信号処理・出力の時間に費やして
いるんだろうな。


これって、LPC1768のmbed(青mbed)とか、STM搭載の
Nucleoとかでも、同じくらいなのかなぁ?

1768でも、クロックはせいぜい倍くらいだし、内部
の回路は似たようなもんだろうから、せいぜい倍速
くらいだろう。
5110の制御なら、特に速過ぎて困るってことはない
だろうってきがするんだけどな。


そういえば、1000円プローブ。レンジ間違ってたから
信号拾えなかったのかな?と思って、改めてつないで
見たところ、やっぱりなんかすごい小さい信号しか
拾えてない。
もしかして、断線はしちゃってるけど、微妙にノイズ
として拾ったのが表示されてるのかな?とか思ったん
だけど、よく考えたら、プローブのレンジ設定が1/10
になってるんじゃね?とようやく気づく。

レンジを1/1に変えてみると…普通に拾えた。

なんだ。プローブが断線してるんじゃなくて、オイラ
の頭の回路が切れてただけだった。

あと、この簡単な信号計ろうとしただけなので、
細かい設定全然あわせてないので、このハードコピーは
ちょっといろいろアレなところがあるけど、まぁ。


結論:
  11U24コアのmbedだと1MHzくらい。
  5110用の信号としては問題なし。
  秋月の1000円プローブは壊れてなかった。



そうそう。aitendoの5110モジュールって、ピン配置が
SparkFunとまったく同じ順番なんだけど、Aliexで
5110で検索すると、これらとまったく異なるパターン
のヤツしか見当たらない。

Aliexのは2ドルくらいで手に入るのはいいんだけど、
なんでピン配置がこういう風になってるんだろう?
中国標準ピン配置?
SparkFunと同じ配置なら、10個くらい買いだめして
おきたい気持ちあるんだけどな。






http://nlab.itmedia.co.jp/nl/articles/1609/06/news071.html

へぇ。
ヤンキー系の自動車雑誌っていうと、とりあえず
ホリデーオートなのかと思ってた。チャンプロード
って、見たことないかもしれん。

そういえば、ホリデーオートで思い出した。
PCエンジンのゼロヨンチャンプって、メニューから
   「ざっしをみる」
を選ぶと、ホリデーオートがそのままの名前で出て
くるんだよな。調べてみたら、あれって、提携してた
らしい。へぇ。

ちょっと検索してみて、思い出したよ。

http://minkara.carview.co.jp/userid/1875209/blog/34643301/

そうだった。「ぽくだいじありとめ」。
あと、「いかあし」とか出てきたな。





https://www.switch-science.com/catalog/2864/

スイッチサイエンスで、「NYA Manufacturing」の
「簡易型電流プローブ」、バージョン2。

これ、以前のバージョンのときに欲しいなぁと思って
いたんだよな。

006P以外にも、DC電源コネクタ増えているみたい。
この端子、ターミナルボックスとかつけておくと
グーなのかな。

なんにしても、電流計測が簡単に、特にDC電流だけなら
(脈流じゃないなら)、テスター1個あれば計れるって
いいよなぁ。
オシロ使えば、電流波形も見れるし。

DC/DCコンバータ回路用に、アンペア級の電流はかれる
やつが欲しいよなぁ…。でも、小電流も測れるといい
よなぁ。
どっちかっていうと、オイラ的にはアンペア級が
計れることが優先なのかな。






https://twitter.com/kuriuzu/status/772643450361552898

なにもしてないのに壊れた。





https://twitter.com/Nabe_RMC/status/772771038518087680

ホンダ、ファステストラップ取れたの、24年ぶりに
なるのか…四半世紀ぶりだな。





https://www.youtube.com/watch?v=-51W5-iaq_s

この、CNC制御のベンディングマシン。動きがすごい
見事で、つい見とれちゃう。長いので、飛ばし飛ばし
見たけど、なんか惹きこまれる。






http://www.cnn.co.jp/world/35088498.html

タイ、プミポン国王、深刻な感染症。
大変だな。これは。ご高齢だしなぁ。はやくご回復
することを祈ろう。



コメント ( 0 )




mbedで、FFTライブラリがそこそこの速度で動いたし、
アナログ入力は20kspsでもそれなりに動きそうな
こともわかったので、次はやっぱLCDだろうと思って、
以前Arduino用に作った、5110のLCDライブラリを
移植してみることに。


どっちもC言語系だし、方言のある命令だけを変更
すれば、さくっと動くとばかり思ってたんだけど、
いろいろ手間取った。かなり手間取った。

変更点がいろいろ有っただけでなく、どうやら、
バグが潜んでいるらしい。しかも、なんでそんな
結果になるの?っていう、おかしなバグが。(後述)




とりあえず、動くようにはなったので、結果の写真。

まずは、文字列の表示(上側の「Hello World!」)
と、下側の、1文字1文字ばらばらに表示したとき
の、カーソル移動の機能確認(下側の「HELLO =」)
の表示結果。



フォントも、Arduino版と同じ8×5ドットのフォントを
そのまま。横は1ドット単位、縦は8ドット単位で位置を
設定できる仕組み。


全文字表示の確認。半角スペース、「!」、「"」…と、
ASCII文字全部を一律表示してみた結果。



画面右下まで書いても収まらないので、数文字は
左上に戻ってから続きを表示。…「x」「y」「z」
「{」「|」|}」まで。




グラフィック機能。いわゆるLINE表示機能を使って、
ランダム座標を結ぶ直線を、「PSET」と「PRESET」の
それぞれの条件で表示してみた。



最初、SPI通信の速度が速すぎておかしいのかな?
とか思って、パルス1個ごとのオンオフするときに
1usずつwaitを入れてみたんだけど、ちょっと時間
かかりすぎる。
5110は4MHzまで入力できるんだけど、1usだと最大でも
オンとオフで2us食うので、0.5MHz以下。
入力できるスピードの1/8くらいに制限してしまって
いる計算。


ひとまずはその速度で我慢しつつ、あれこれ動作が
おかしかったところを手直ししていくことに。

なんか原因がわかんないんだけど、カーソル位置
(x、y座標)を設定しなおす処理が、なぜか上手く
動かないところが出てくる。何でだろう?って
思って、ライブラリの処理内容とか、ヘッダファイル
とかもきっちりと見直しして、どうしても原因が
見当たらない。

そもそも、冒頭でx、y座標を設定しているところでは、
ちゃんと上手く動いているとこもある。その差が
まるで判らない。なんだろうなぁ?と思って、
いろいろソースやライブラリを弄りまくって、
ようやく、ひとつの傾向が見えてきた。



テストパターンとテストパターンの間に、時間稼ぎ
のために「wait_ms(2000);」って入れて、2000ミリ秒
(2秒)の間隔を空けてるんだけど、どうやら、この
wait_ms命令の「次の命令(関数呼び出し)」が無効
になっているらしい。

なんで無効になるのかはよく判らないんだけど、
そう仮定して、その前提で、無効にされちゃってる
命令を、同じもの2行続けて書いてみると…ちゃんと
動くようになった。

うん、やっぱりそうみたい。さらに、カーソル移動
の関数呼び出しだけじゃなく、画面消去の命令も、
このパターンに填まっていると、やっぱり命令が
無視されている。2個続けて書くと、ちゃんと動く。


wait_ms()メソッドにバグがあるのかな?と思って、
ここをすべて「wait(2);」という風に書き換えてみる。

…全部まともに動くようになった。なんだよぅ…
コンパイラのバグっぽい気がするけどな。



ちなみに、「wait_ms(100);」と、短めの時間稼ぎ
だと、そういうことは起こってないみたい。1秒を
こえる待ちを「wait_ms」つかって行うとだめとか
そういうことなのかな?

原因は良くわかんないけど、とりあえず「wait_ms」
を避けると上手く動くことが判った。


さて、じゃぁ、SPI通信のパルスは原因じゃない
ってことなのかな?と思って、1usのwaitを取り
除いて動かしてみる。

…動いた。しかもそれなりに速い。

本当にスペック的に大丈夫なのかがいまいち判って
ないんだけど、ひとまず動く。48MHzの11U24って、
ポーリングでパルスをオンオフすると、どのくらい
の速度で出てるんだろう?Arduinoみたいに、
端子番号からポート+端子番号に変換(1ピンだけ
オン/オフする処理)するのに、多少の時間がか
かっていると考えると、4MHzは下回っている可能性
高いと思うんだけど…

あとで計ってみないといかんかな。




さて、大丈夫と仮定して、描画速度。

文字表示とかはあまり速度を気にする必要もないと
おもうんだけど、グラフィック処理、特にドット
単位で描画する、LINE描画処理とかは、速度が
肝なので、速度を計測しておく。

ランダムの2座標を結ぶLINE描画の処理を10000回
表示してみて、17秒だった。(実測値)

ってことは、平均して、線1本描画するのに、
およそ1.7ミリ秒。500本描いても1秒以下って
かんじ。



本当は、ソフトウェアでポーリングじゃなく、
SPIライブラリ通して、ハード処理しちゃえば、
通信速度を設定できて安心なんだけど、ピンが
固定になっちゃうの、やなんだよな。

wait_usよりも細かい待ち時間設定できる機能が
あるとうれしいんだけどな。


とりあえず、「wait_ms」を2000ミリ秒に設定して
動かすと、次の命令(関数呼び出し)が機能しない
バグがありそう、ってことが判ったので、これを
どうするか…コミュニティーに報告してみるか…

…正直、まだ、発生する条件とか、その境目とかが
判ってないんだよな。Seeeduino Arch以外でも発生
するのかなぁ?

やっぱ、デバッガでステップ実行したいよな。






https://twitter.com/jironosuke99/status/772237592536330240

おぉ。エイリアンと検非違使。






http://www.cnn.co.jp/fringe/35088544.html

カカオの代替になる植物なんてあるのか…。へぇ。
味はどうなんだろう?

やっぱり、カカオ豆みたいに、収穫して、発酵させて、
焙煎して作るのかな。







http://www.aitendo.com/product/14331

ん、なんか缶入りのかっちょいいトランジスタ。200円。






http://sorae.jp/10/2016_09_02_an225.html

あのでかい輸送機(An-225)、中国で生産?






http://www.yomiuri.co.jp/world/20160905-OYT1T50043.html

香港が中国から独立?






http://sorae.jp/030201/2016_09_01_mrj.html

MRJ、異常があったのは、センサ?




コメント ( 0 )




https://www.kohgakusha.co.jp/books/detail/978-4-7775-1967-5

123D Design本の改訂版がでました。

Ver2.1(現時点最新版)を元に再構成しています。
新たに付け加わった機能の解説と、日本語メニューの
対応を盛り込んでます。(大筋は変わりません)






mbedで、アナログ入力(ADC)からデータ入力して、FFT
を掛けるところまで出来たので、その続き。

ひとまず、1000spsで動かすことは出来たので、さらに
高速なアナログ入力を行った場合に、どこまで追従
出来るのかを、ちょっと調べてみることに。


https://developer.mbed.org/users/EndoTsunenobu/notebook/adc%E3%81%AE%E6%89%B1%E3%81%84/

どうやら、「.read_u16()」メソッドを使うと、整数型
で読み出せるみたい。float型への変換が不要な分、
こっちのほうが速いはずなので、「.read_u16()」を
使ってみることに。



mbedは、対応機種がいっぱい増えてしまったせいで、
具体的にいくつまで、っていう情報が無いので、
境目を見つけつつ、多少の余裕値を見込んで、
設定可能なレートを探るためのプログラムを書いて
みた。seeeduino archで実験。
#include "mbed.h"

#define sample_rate 35000.0


AnalogIn ain(P0_11);
DigitalOut led(LED1);
Serial pc(P0_19, P0_18); // tx, rx

Ticker tmr;
volatile int cnt1 = 0;


void adc_trg() {
    cnt1++;
}


int main() {
    int cnt2 = 0;
    int old_cnt1 = 0;
    int a;
    
    /* start timer */
    led = 1;
    tmr.attach(&adc_trg, (1.0 / sample_rate));
    
    for (int i = 0; i while (old_cnt1 == cnt1) {
        }
        old_cnt1 = cnt1;
        cnt2++;
        a = ain.read_u16();
    }
    
    /* stop timer */
    tmr.detach();
    led = 0;
    
    pc.printf("----  sample rate = %d  ----\r\n", (int)sample_rate);
    pc.printf(" number of sampled data : %d\r\n", cnt2);
    pc.printf(" number of interrupt    : %d\r\n", old_cnt1);
}

ある程度のアタリをつけてみてから、割り込みレート
を、毎秒10000、20000、30000、40000、50000、35000
と試してみた。


Tickerの割り込みが発生時に変数cnt1を1アップしつつ、
カウンタが変更になっていたら、アナログ入力して変数
cnt2を1アップする、という流れで処理。10000回の
サンプリングを行う。

レートを上げて、アナログ入力の処理が追いつかなく
なると、1回のアナログ入力の間に、割り込みが
2回以上発生するようになって、アナログ入力の回数
が10000回に対して、割り込みでカウントしたcnt1の
値が10000より大きくなる。
で、間に合わなくなったことがわかる仕組み。

(ちなみに、コンパイルすると、変数「a」が参照
されてないっていうウォーニングが出るんだけど、
ちょっと実験してみたところ、最適化でアナログ入力
の代入処理が省略されちゃうことは無い模様)


やってみた結果がこれ。(画像クリックで拡大)



このプログラムだと、境目は毎秒35000sps~40000spsの
間に境目があるみたいなんだけど、これをちょっと弄って、
if文や代入文を2個ほど入れただけで、35000spsでも
間に合わなくなるようなので、seeeduino archでは
30000sps以下で使うのがよさそう。

実際は、もう少し余裕を見て、20000spsくらいなら安全
かな。10kHzまでの音声信号には対応できそう。
もうちょっといけると良かったんだけどな。

多分、LPC1114をmbedで使った場合も、これと同じくらい
になるかと。

http://brown.ap.teacup.com/nekosan0/2277.html

前から遅々として進んでないArduinoオシロの実験では、
16Mhz(5V、mega328)のArduinoを、アナログ入力の
精度を少し落として実験してみたときが、20000spsまで
対応できたので、(精度はともかく)大体同じくらいの
スペック。



ほかの機種だと、どのくらいまで追従するんだろう?
ADCの回路次第であって、CPUのクロック自体はあまり
関係ないから(ADCの1サンプル完了する時間にあわせて
ウェイト入っているはず)、機種ごとの違いって、
あまりないんじゃないかな?って気がするけど。

いずれにしても、これより速くサンプリングする
ためには、外付けの高速ADCが要りそう。





FFTライブラリ、アナログ入力あたりについては、
それなりに使えるようになった。
あとは、LCDライブラリの移植かな。そうすれば、
Arduinoとか、Arduino基板型のmbed互換機を、
簡単にオシロに変えちゃうシールドできそう。
UI周りを、自分の好みに合わせて勝手に直せる
オシロっていう風にしたいんだよな。



そうすると、電源回路、ノイズ対策あたりが
またあたまをもたげるんだけど、まぁ可能な範囲
でいいや。

それと、対応するLCDをどうするかだな。とりあえず、
5110はどこのご家庭にも10個はあると思うので、
当然対応するとして、それ以外のSPI接続LCDって、
端子の並びがまちまちだから、適当にジャンパーで
配線を好きなように設定できるっていうのがいいかな。





http://netgeek.biz/archives/82282

すごいな、PCデポ。現場の人たちはちゃんとしてる
けど、上が完全に真っ黒で、改善の見込みは全然
みえないな。



コメント ( 0 )




http://mantan-web.jp/2016/09/03/20160903dog00m200014000c.html

なんと!!!
こち亀が、連載終了になってしまうのか。残念だな。
ずっと、ずっと続くものとばかり思っていたけど、
始まりがあればいつか終わりがくるのか…。


https://twitter.com/anzainobuyuki/status/771984706384433152?ref_src=twsrc%5Etfw

日暮刑事、今回のオリンピックが最後になってしまった
のかな?それとも、次回はスポットで出てきたりする
のかな?






mbedで、FFTライブラリ使って、実際にアナログ信号を
FFT掛けてみることに。

といっても、ファンクションジェネレータを出すのが
面倒だったりしたので、3.3V版Arduinoで、適当に
100Hzの矩形波を作って、入力してみた。

アナログ入力ピンから信号を入力するタイミングは、
Tikerでタイマ割り込みすることにした。

どのくらいの間隔までアナログ入力が動くのか分んない
ので、とりあえず1000spsとしてみた。



入力データがこんな。



矩形波。(こっちのグラフに表示されてる単位は無視
してください。時間じゃなく、下のグラフと同じく
周波数が表示されちゃってるので)


1000spsで、64点FFTなので、左から右までが64m秒ほど。
大体こんな波形になるはずだろう。多分合ってそう。

結果がこんな。



窓関数を掛けてないので、DC付近にでっかいノイズが
乗ってるけど、とりあえずこれは無視するとして、
100Hz付近にちゃんとピークがある。
(グラフの一番左のピークがDCで、その右隣が100Hz付近)

で、矩形波なので、奇数倍音でピークが出るので、300Hz
付近でもデータが出てる。

まんなかより右側は、いわゆる負の周波数なので、ここでは
ひとまず無視。



というわけで、矩形波を入れると、ちゃんとその周波数と、
奇数倍音のところに、ピコンとピークが出てくる。
とってもよいかんじ。

どのくらいの周波数までアナログ入力が反応できるのか
が問題だな。まずは10Kspsは行って欲しいところ。できれば
20Kspsを超えてくれるとナイスなんだけどな。

ひとまず、現時点のプログラム。
#include "mbed.h"
#include "fft4g.h"
#define NN 64
#define NSQ 8 /* sqrt(NN) = 16 */
#define interval 1000.0  /* 1000 sps */
#define freq_unit (interval / NN)
#define max_freq (freq_unit * (NN / 2))


Serial pc(P0_19, P0_18); // tx, rx
AnalogIn ain(P0_11); // input via P0_11

Ticker tmr;
volatile int cnt;

float sample[NN];  // stock adc data



DigitalOut myled(LED1);

void dataout(float *d, char *s) {
    pc.printf("FFT test (%s)\r\n", s);
    for (int i = 0; i float f = (freq_unit * i);
        if (f > max_freq) {
            f = f - (2 * max_freq);
        }
        pc.printf("%f , %f , %f\r\n", f, d[i*2], d[i*2+1]);
    }
    pc.printf("");
}



void datain() {
    sample[cnt] = ain.read();
    cnt ++;
}


void sampling() {
    cnt = 0;
    
    tmr.attach(&datain, (1.0 / interval));
    while (cnt detach();
}


int main() {
    float data[NN * 2];  // real + imaginal
    int ip[NSQ + 2];  // bit reversal table ( + 2 pointers for sin/cos)
    float w[NN * 2 / 2];  // twiddle factor (real + imaginal)
    
    sampling();  // input data from adc
    for (int i = 0; i // convert to float
        data[i*2] = sample[i]; // real
        data[i*2 + 1] = 0.0;          // imaginal
    }
    
    ip[0] = 0; // first time only ( for initialize )
    
    dataout(data, "input data"); 
    pc.printf("-- start fft --\r\n");

    cdft(NN * 2, 1, data, ip, w);  // exec FFT

    pc.printf("-- end fft --\r\n");
    dataout(data, "output data"); 
    
    pc.printf("freqency unit = %f Hz\r\n", freq_unit);
    pc.printf("max freqency  = %f Hz\r\n", max_freq);

    while(1) {
    }
}


アナログ入力が、Arduinoのようなint値じゃなく、
0.0~1.0の間のfloat型なのを知らずに、さいしょ、
int型の配列に入れちゃって、波形が拾えずに四苦八苦。
(コメント文とかながめると、まだその名残がある)

とりあえず、動くところまで分ったので、今日はここまで。





https://twitter.com/RetroComPeople/status/771682874705580033

すごい。33年越しのバグ解明。
それにしても、FDD4ドライブって、なんとブルジョアな!






https://twitter.com/otoyanblog/status/770664977413713920

なぜこれをプラモに…






https://twitter.com/Nabe_RMC/status/770954202277216257

日産は、安く買い叩いたつもりで、けっこう高すぎる
買い物しちゃったんじゃないかな。





https://twitter.com/izayoi_0512/status/416523648153821184

かぐや姫。





http://jbpress.ismedia.jp/articles/-/47762

あぁ。こういうタイプ、いるんだよな。処理能力は
確かにあるのかも知れないけど、その人の周囲から、
どんどん人材が流出しちゃうパターン。






https://twitter.com/kmoriyama/status/771379143892054016

ロボットがまだ要介護レベル。わかる気がする。





https://twitter.com/longjie0723/status/771888062158647296

三権分立を習わなかったか、理解できてない人たち
の集まりだからな。トップの例の発言もあったしな。

そのうち、詭弁使って、
  「立法、行政、司法を集約・融合して、
   より効率的な政治に!!」
なんていいだすんじゃね?



コメント ( 0 )




こないだ最初に試したほうのmbedのFFTライブラリ。
コンパイルで100個以上のエラーが出ちゃって、
そのままそっと閉じた方のライブラリ。

ふと、公開されているプログラム一式を眺めて、
もしかして、やっぱり動くんじゃね?って思って、
新しいプログラム使ってやり直してみた。

https://developer.mbed.org/users/TareObjects/code/FRDM_MAG3110/

このページのプログラムでは、「fftsg」じゃなく、
「fft4g」をincludeしてるので、それを使ってみる
ことに。
#include "mbed.h"
#include "fft4g.h"
#define NN 64
#define NSQ 8 /* sqrt(NN) = 8 */


//Serial pc(USBTX, USBRX); // tx, rx
Serial pc(P0_19, P0_18); // tx, rx


DigitalOut myled(LED1);

void dataout(double *d, char *s) {
    pc.printf("FFT test (%s)\r\n", s);
    for (int i = 0; i "%f , %f\r\n", d[i*2], d[i*2+1]);
    }
    pc.printf("");
}


int main() {
    double data[NN * 2];  // real + imaginal
    int ip[NSQ + 2];  // bit reversal table ( + 2 pointers for sin/cos)
    double w[NN * 2 / 2];  // twiddle factor (real + imaginal)
    
    double mlt1 = 2.0;  // mutiple value for frequency for sin
    double mlt2 = 8.0;  // mutiple value for frequency for cos
    for (int i = 0; i sin(2*3.141593 * i / NN * mlt1)
                  + cos(2*3.141593 * i / NN * mlt2);
        data[i*2+1] = 0;
    }
    ip[0] = 0; // first time only ( for initialize )
    
    dataout(data, "input-data");  // dump input-data
    
    myled = 1;
    cdft(NN * 2, 1, data, ip, w);  // exec FFT
    myled = 0;

    dataout(data, "output-data");  // dump output-data
    
    while(1) {
    }
}


動いた。

当然ながら、入力に与えたデータに対して、結果のデータ
もちゃんと想定どおりに出てきた。なんだろうな?
fft4gだと動くのかな?



sinとcos、別々の周波数で足し合わせたのを入力。



これをFFT掛けると、



ちゃんとこう出る。出てる周波数のばしょも大丈夫。



さて、このライブラリデータ形式がdouble型。今使いたい
用途から考えると、ちょっとオーバースペック。FPUが
入ってないseeeduino archだと、処理速度にも問題。

まず、これで1000回ループしたときの時間を計測してみる。

64点FFTだと13秒、256点FFTだと、79秒。(実測値)

やっぱ遅い。時間かかりすぎ感ある。


プログラム、ヘッダファイル、ライブラリファイルの
3ファイルの、「double」を「float」に置換してみる。
コンパイルさくっと通った。実行してみる。


64点FFTだと2.5秒、256点だと18秒。(実測値)




float型で64点なら、1回当たり2.5m秒。これなら、
たいていの用途で遅延無く使えそうな感じ。悪くない。

FPU無しで実数演算でFFT掛けて、このくらいの時間で
済むなら、わざわざ整数型にする必要もないかもしれない
けど、でも、整数型なら、1回あたりの計算がもっと速い
はずだからなぁ。そっちも試せるなら試してみたいよなぁ。






https://www.youtube.com/watch?v=WybKefW5eL4

いったい、なにがあったんだろう?なんでこんな風に?
すごい事故。フロントがぴょん吉になってる。多分、

https://clubmini.jp/usedcar/CU4986655207.html

これだよなぁ。ミニが、ミニミニになっている。






https://www.pc-koubou.jp/products/detail.php?product_id=277071

なかなかいいな。ちっちゃくて。普段使いならこれで
全然オッケーなんだよな。






https://www.reddit.com/r/funny/comments/4kuyop/faceplant/

ゴールデンラッキー。



コメント ( 0 )



« 前ページ 次ページ »