コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
妄碌庵 ◆6Z.AzgCiEzTT
2018/6/2 2:29
情報交換
高度サウンドユニット情報交換トピック
Miiverse時代に「高度サウンドユニットによる画像処理研究会」を立てたのですが、終了したのでこっちに立てておきます。画像処理に限らず本来の音の目的でも蓄積するところがないので情報交換したいです。

コメント

アバター
妄碌庵 2018/6/2 3:24 ◆6Z.AzgCiEzTT
とりあえず初手として、Gsaveで16bitセーブした配列のRGBA分離
RGB32階調Aは透明BIT、考え方としては
上位ビットから色要素を抽出後、抽出要素を引くことで要素を削る
これをRGBで繰り返して行うことにより各要素を抽出
一応これで合ってる・・・かな・・・?


GSAVE 1,x,y,w,h,hoge,1

DIM wh=w*h
DIM MAXgrpAlp=31
DIM a#
DIM TmpAry[wh] ワーク用配列(上位ビットから要素を削ってゆく)
DIM ColAry[wh] 抽出色配列ワーク
DIM Rary[wh]
DIM Gary[wh]
DIM Bary[wh]

赤分離
ARYOP #AOPMUL,ColAry,hoge,1/(1<<11)
ARYOP #AOPMAD,TmpAry,ColAry,-(1<<11),TmpAry

copy Rary,colary '赤要素配列

緑分離
ARYOP #AOPMUL,ColAry,TmpAry,1/(1<<6)
ARYOP #AOPMAD,TmpAry,ColAry,-(1<<6),TmpAry

copy Gary,colary '緑要素配列

青分離
ARYOP #AOPMUL,ColAry,TmpAry,1/(1<<1)
ARYOP #AOPMAD,TmpAry,ColAry,-(1<<1),TmpAry

copy Bary,colary '青要素配列
copy Aary,Tmpary '透明BIT
アバター
妄碌庵 2018/6/2 5:53 ◆6Z.AzgCiEzTT
32bit色で出力した場合最上位ビットが負数bitになるのだがARYOPは論理演算をサポートしていないためやや面倒な抽出が必要になる
現状9ステップが最短、(内5ステップがA領域bitの分離)
アバター
妄碌庵 2018/6/2 6:01 ◆6Z.AzgCiEzTT
失敬、各変数の解説してなかった
cPUが画像配列として入力される、ここから色チャネルを抽出→分離を繰り返す
コメント「R/G/B/分離」の直下にあるAOPMULの行の出力配列が単色チャネルの配列(0-255)、cPU配列は上位bitから削ってゆくので順番を変えたり端折ったりはできない、配列メモリ確保量がバカにならないので各チャネル抽出直後に合成処理を行うのも一考。
アバター
はる 2018/6/2 20:02 ◆75Vh4SY8TdKS
DIM A%[0]
GSAVE A%,1
ARYOP 1,A%,65536,A%
GLOAD A%,1,1
これで色反転できます。
アバター
あまさとしおん 2018/6/2 20:19 ◆mzDKTVUAtwqE
65536(&H1000)引くと負数じゃん
けど
>>>16bitより上の桁は無視するのでOK<<<
って理屈かしら
アバター
はる 2018/6/2 20:25 ◆75Vh4SY8TdKS
そうです。
アバター
おちゃめ 2018/6/2 23:40 ◆jH1opV6FnGyx
ツララさんへ

プチコン3号では実行前にコンパイルが行われています。
その際に命令のチェックとラベルや変数名のリストアップなどが行われるのですが、それと同時に定数演算は定数として扱われます。
つまり、コンパイル時に1<<24というのは16777216という値に変換されるわけです。
したがって、速度面の問題ならば全く気にする必要はありません。

さらに16777216というのを1<<24と記述することで文字数を減らせる上にビットシフトを行っているというのを明示できるため視認性の向上とミスタイプによるバグの確率を減らしてくれます。

要するにデメリットはゼロでメリットは盛りだくさんなのです。

あと、「高度サウンドユニット」という名称こそ付いていますが、ARYOP命令は端的に言えばSIMD演算を行う命令です。
非常に汎用性が高いので配列変数を使って大量のデータ処理を行う場合に様々な面で活用できます。
プチコン3号の配列変数は非常に遅いのですが、ARYOP命令を使って配列の処理を行うことで普通に配列変数の演算処理を行うのと比べて最大で50〜100倍程度の速度向上が見込めます。

しかし、ARYOP命令で扱える演算子の種類は少なくて簡単な演算でも複数のARYOP命令を組み合わせて使う必要があり、ARYOP命令がうまく使えなかったり、使えても思ったような速度向上ができないという場合もあります。
そういう場合に自分一人の力では難しくても多くの人で情報交換を行えばみんながARYOPを使いこなせるようになると思います。

せっかくの汎用性の高い命令群なのに「音関係だけ」に高度サウンドユニットを使うのは勿体ないです。
アバター
しんいち 2018/6/3 1:29 ◆lHy.hAWXbthn
音関係で高度サウンドユニットの関数を使ったことがないなぁ(画像関係ばかり)^^;
小ネタ挙げておきます(既知だと思うけど)。

ARY_SUM(左上):配列の合計を返す
SEQ_ARY(右上):0〜N-1の数列を返す
DIF_ARYD(左下):配列を比較し、不一致部分に1を格納した配列を返す
#ARY_SUM、DIF_ARYDはUndo/Redoとかで良く使ってます。

ARYOPとかは、小さい配列では逆に関数呼び出しの時間の方が大きくなって遅くなることがある点に注意ですかね。
アバター
妄碌庵 2018/6/3 22:45 ◆6Z.AzgCiEzTT
しんいちさんの投稿使えるのでありがたいです。
引数2に入れる定数値がわからなかったので調査
ARYOP定数値
0 #AOPADD (加算p1+p2)
1 #AOPSUB (減算p1-p2)
2 #AOPMUL (乗算p1*p2)
3 #AOPDIV (除算p1/p2)
4 #AOPMAD (乗算p1*p2+加算p3)
5 #AOPLIP (線形補間/色通常合成等 (p1*p3)+(p2*(1-p3)) (p3は0から1の小数点対応配列を使用のこと)
6 #AOPCLP (指定範囲丸め込み)

・・・・HELPに書いてあったorz
みんな定数使わないんだろうか・・・
アバター
しんいち 2018/6/10 2:28 ◆lHy.hAWXbthn
ARGB分離を速くするネタないかと色々試していたら、GSAVEに実数型配列を指定するとunsigned intのような値が返ってくる事実に気付いたので、32bit色でも16bit色のように、面倒なA分離をシンプルにできて、かなり速くなることが分かりました(^o^)

やはり16bit色で分離するのが一番速いと思いますが、それと大差ない感じでした。
ツール内で常に実数型配列でいろんな処理行うとか考えると重くなりそうですが、色分離したい時だけ使うとかすれば、有効かも知れません。
#ARYOPでのA分離に色々悩んでた日々は何だったんだろう・・・^^;
アバター
妄碌庵 2018/6/11 16:20 ◆6Z.AzgCiEzTT
現在開発中のjuhsy2xx系列でGRPのピクセルを2倍確保してAR/GB領域に分離してますが
Gloadで保存される値は16bitに丸め込まれてしまいますか?
保存できればいいのですが・・・・
アバター
妄碌庵 2018/6/11 17:08 ◆6Z.AzgCiEzTT
とはいえ、精度を求めずにGRPから32bit情報を抽出するのに有効そうですね、
ありがとうございます。
アバター
しんいち 2018/6/11 20:43 ◆lHy.hAWXbthn
R/G/B256階調の色数値だとしても、GRPに描いた時点で32階調(不透明度は2階調)に丸められてしまいますね(RGB(255,255,255,255)を描いてもRGB(255,248,248,248)に。RGB(254,128,128,128)を描いてもRGB(0,128,128,128)に)。

GRPにはどう頑張っても65536色までしか描けない(1ピクセル16bit分の情報しかない)ので、それを整数型配列でGSAVEしても、実数型配列でGSAVEしても、精度は同じだと思います。
アバター
妄碌庵 2018/6/12 11:42 ◆6Z.AzgCiEzTT
あ・・・実数型でGLOADも可能でしょうか?ちょっと調べたい。
アバター
たんじぇ 2018/6/12 12:48 ◆WDmFkVwZ4yMl
GRPって「書き込むと画面にも表示できるようになる16bitメモリ」なので、GRP←→配列のGLOAD/GSAVEも16bitのほうが良くて、BASIC上で色データを操作するのに32bitのほうが便利なので配列アクセスに16bit←→32bit変換があるって感じです。

GLOAD/GSAVEの32bit←→16bit変換も内部では最初の書き込みの分離と同じようなことをしているので、画像を扱うならBASIC上は16bitのまま操作するほうが理論的には処理速度としては早いはずです。

GLOAD/GSAVEの配列側が32bitで色変換フラグが16bit物理コードのままの場合にどのような挙動するかは実験してみだとは思いますが、仕様としてあんまり期待した動作じゃないからそれを期待して実装すると今後のプチコンアップデートで仕様が変わる可能性も。
(多分ARGB=8888の上位か下位16bit→ARGB=1555でARかGBが無理矢理ARGB値になりそう)
アバター
しんいち 2018/6/12 21:57 ◆lHy.hAWXbthn
ちょっと試してみたところ、実数型でも2進数でbit長32を超えなければ、普通に(整数型と同じように)GLOADできるみたいですね。まぁこれができなければ実数型でGSAVE→GLOADできないことになって「バグだぁ〜!」と騒ぎたくなってしまいます(RGB()やGSPOITが返しようのない値をGSAVEが(実数型配列に)返す時点でかなりバグっぽいと思ってますけど)。

それで、bit長32超えた場合はというと、POW(2,32)は#WHITEで、-POW(2,32)は0でGLOADされました。POW(2,32)は0になる(下位32bitだけ有効)かと思ってたんだけど違いました。

32bitでGSAVEした配列を16bitでGLOADしたら・・・どうなるんだったかな?^^;
たしか下位16bitになってたような気が。。。忘れました。

今回GSAVEに実数型配列を指定すると符号無し32bit整数で格納される、ということからいろいろ考えてみましたけど、そもそもこの動作がバグだったら、将来変更されるかも知れませんね。実際のところどうなんだろう?昔からこの動作だったんだろうか?昔からの動作ならずっとこのままかも知れないし。う〜ん、気になる。
アバター
ツララ 2018/6/17 18:43 ◆ArUdBYOYME1V
塗りつぶしや経路探索のアルゴリズムに高度サウンドユニットの命令って活用できないかな?

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -