manahiyoの気まぐれ

備忘録を兼ねたブログです。

VR環境(QUEST2)でスペクトルのウォーターフォール表示を作成してみる

 はじめに

SDRでのスペクトルの表示は以前からできておりましたが、やはりSDRのソフトを見るとどれもウォーターフォール表示があります。こういうやつです。

f:id:manahiyo831:20210819174153p:plain
 

通常はPCのディスプレイが2Dで表示するために色で表現をしていますが、VRで表示する場合に同じで意味があるのか?そもそもVRならではの表示があるのではと考えていました。

 

下調べ

点を表示するのに調べていたら下記がとてもきれいでした。

note.com

ですが、今回の目的とはちょっと違うかも。

 

いろいろググっていたらこのようなのでイメージに合う気がしました。

www.world-music-producer.com

f:id:manahiyo831:20210819174359p:plain

 

ここから思い出したのは先日作成したアンテナ特性のシェーダーのようにsurfaceシェーダーでスペクトルデータを描けばそれでいいのでは・・・これなら意外に簡単に書けるかも

 

Surfaceシェーダーで作成してみる

以前と同じように、サイズは16*32で小さい値でまずは進めます。

面をつけて、レベルごとに色を変えるとこんな感じ

f:id:manahiyo831:20210819195442p:plain

こうなると線は邪魔なので、消します。そして256*512のサイズにしてみたものが下記になります。なかなかよさそうです。

f:id:manahiyo831:20210819195659p:plain

こうなると実際にRTL-SDRから取得したデータで表示したくなります。

そこで問題になるのが、今回はデータを作ってから表示していますが、スペアナのデータは1回ごとにデータが追加される形になります。これに合った状態にしないと移植できません。

 

またサイズを大きくすると表示がされないことに気が付きました。どうもデフォルトだとメッシュの数が16bitで65536で制限があるようです。

デバッグのログで表示させると確かに65536になってしまっています。

f:id:manahiyo831:20210819203311p:plain

下記1文を追加しました。

mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;

ちゃんと65536よりも増えて表示できるようになりました。

f:id:manahiyo831:20210819203734p:plain

 

下記記事によると、メッシュの結合を使えば処理の負荷が得るようです。今回のスペクトル表示のように1回ずつメッシュが増えるような場合は有用かもしれません。

ekulabo.com

 

FFTの数が1024にして実行すると、異常に動作が重く、処理時間がかかっていることがが判明しました。

結果Surfaceシェーダーでは処理が重い」ので見直し

 

点だけのシェーダーで再トライ

下記を参考に変更してみました。

qiita.com

点で表示にした結果ですが、点が小さすぎて表示がよろしくないです。乱数なので色や位置はノイズのような感じになっています。

f:id:manahiyo831:20210821000837p:plain

 

いろいろしらべたのですがなぜかサイズの変更ができない。その後調べ続けて下記を見つけました。

qiita.com

う~ん、こんな罠があったのか。

PC上で実行してずっと悩んでおりましたが、QUESTで動作させたらちゃんとサイズが変わっていました。

 

点の大きさを変えてQUESTでスクリーンを撮ってみました。ランダムデータなのでスペクトルっぽくはないですが、思い通りの動作になっていそうです。

f:id:manahiyo831:20210821001255p:plain

 

スペクトルを実際に表示させてみました。だいぶ初めのイメージとは違ったものになりましたが、これはこれでいい感じです。

f:id:manahiyo831:20210821001537p:plain

 これをもとにVRでのスペクトル表示環境を引き続き作っていきたいです。