2024年3月20日水曜日

小ネタ


 ニコラス・ケイジ、「ナショナル・トレジャー」第3作が実現する可能性を否定

 ナショナル・トレジャーシリーズは知識が武器になるストーリが好きだったし、2作目であれだけあからさまな終わり方をしていたから期待していただけに、少し残念。まあ、ここまでズルズル引き伸ばしてすんなり制作されるとも思ってなかったけど。


 JAXAの「だいち4号」(ALOS-4)の機体が公開、従来より4倍の観測幅を実現! | TECH+(テックプラス)

「この1つ1つが、アンテナの素子。それぞれの波長を調整することで、電波を出す方向を変えられるフェーズドアレイ方式を採用しており、アンテナを物理的に動かして向きを変える必要は無い」

 PALSAR-3ってFRESCAN使ってんの? そんなわけ…… 位相変えれば波長も変わるだろってことだろうか。

「アンテナ素子は、全体で232個も搭載しているという」

 いや、パネル1枚だけ見ても250素子以上積んでるでしょうよ…… PALSAR-3は送受信機を232台積んでいるから、送受信機と送受信素子を混同してるんだろうな。(送受信機の台数はALOSで80台、ALOS-2で180台)

「緊急観測を行うときには、機体の向きを180°変え、左側を観測することも可能」

 ALOS-4ってヨーイング(180度反転)ではなくローリング(180度未満)で左側を観測するはずなんだが(何年か前の資料を参照しているので、その後で変わった可能性が全く無いとは言えないけども)。

 ALOS-4がRWを5台積んでるのは、PALSAR-3からの要求(観測姿勢変更)ではなさそうな気がしないでもない。ALOS-4はALOS-3と共通バスなので、RW5台はALOS-3の方向変更観測のためのアジリティに必要な機能であって、ALOS-4は「わざわざ減らすためにコストかけるのもアホらしいしそのまま載せておこうぜ。冗長系で使えるし」くらいのもののような気がする。ALOS-3はRWを7台載せているので、ALOS-3とALOS-4は異なる。


 ALOS-4/PALSAR-3の素子数のカウント(JDAのCG(P100012867)を数えているが、たぶんライセンスされてないので画像は無し)

 PALSAR-3は1279素子前後。単純にパネルで5分割とすればパネル1枚あたり平均256素子乗っている。


 ローソンに行ったらやきそば弁当風のおにぎり(北海道限定)が売っていたので、試しに購入。これだけ大量に売れ残ってた。味は、言われてみればやきそば弁当みたいな感じがしないでもないけど……くらいのところ。どちらかといえばソース味のおにぎりというか、炊き込みご飯のおにぎりという感じ。そう考えれば違和感もなく普通に食べられる。ちょっとガーリック風味があるのかな? そこがやきそば弁当と結構違う気がする。謎肉やキャベツも入っているっぽいけど、遭遇率結構低め。もうちょっとキャベツの主張ほしかった。

 普通のおにぎりはほとんど在庫がないのにやきそば弁当風だけ大量に在庫があって、試しに買ってみたけど、結構美味しい買ったので、濃い味が苦手でなければオススメ。

 普通のおにぎりって具が中心に固まっていて、例えば筋子ならほとんど一口の中に濃い味の塊が入ってくるから、味が不均一で個人的にあまり得意じゃないんだよな。炊き込みご飯のおにぎり(含やきそば弁当風)は味が均一なのでどこを食べても同じ味がする安心感がある。ただ、普通のおにぎりは米の粘性や海苔で形状を維持している一方、炊き込みご飯系のおにぎりは粘性が低く海苔もないから崩れやすいのが欠点。


 LEDを10個とか100個とかの少バッチで蛍光体を選んで試作するサービスみたいなものってないものかな。蛍光体の一覧表から配合を選んだり、あるいはスペクトルの図をアップロードしたらそれに近い配合を自動的に生成したり。それで作成した蛍光体で5mmとか3mmとか1608とかを製造して送ってくれるような感じで。


 試しにC#でCICを実装してデシメーションとインターポレーションの試作

 遅延は補正してある。めっちゃゲインエラー出てるから実装ミスってる風。

 テスト用の波形の周波数に合わせてゲインを調整するとこんな感じ

 きれいに重なる。


 Cortex-M4Fでfloatを2個持つ構造体(複素数)を返す処理

 計算結果が保存されている浮動小数点レジスタをスタックに積んで、スタックから整数レジスタに読み出して、整数レジスタからスタックに書き出して、スタックから浮動小数点レジスタに読み込んで、リターン。端的に言って馬鹿みたいなコードが生成される。浮動小数点レジスタで計算してるんだからそのまま返せばいいのに、スタックに2往復もさせてる。

 おそらく、インラインアセンブラが結果をスタックに書き出して、コンストラクタを呼ぶときにレジスタで渡して、構造体をスタックに保存して、関数から戻すときにレジスタで返す、みたいな処理になっているんだと思う。コンストラクタの中で何をやっているかわからないから呼ぶ必要があるんだろうけど、とはいえ、コンストラクタがヘッダで定義されていれば処理内容は確定できるから、その時にデータのコピーしかやっていないならコンストラクタの呼び出しを飛ばす、みたいな最適化をしても良さそうな気もする。

 インラインアセンブラでadd sp, #24; bx lr;すればだいぶ早くなる。コンパイラが確保するスタックの量が変わると死ぬけど。っていうかここまで決め打ちで計算するならインラインアセンブリでなくアセンブリファイルで記述したほうがマシまである。

 Cコンパイラは(特に小さいコードでは)かなり非効率的なコードを吐くことがあるから、小さいコード(アセンブリで書いても対して苦労しないくらいの大きさ)であればアセンブリファイルに書くほうが良さそう。アセンブリだとヘッダファイルに書くのと違ってインライン展開が行われないけど、分岐して呼んだとしてもARTでキャッシュしたりしてるだろうし、分岐でハザードしたとしてもスタックを2往復させる(+スタックポインタの加減処理)よりは早く終ることを期待できる。FIRみたいにゴリゴリに複素数の計算を呼ぶ場合は分岐のコストも無視できなくなりそうだけど、とはいえ普通に書いたらコンストラクタとかで相当な負荷になるからな。やっぱりアセンブリで書いたほうが早そう。


 例えば複素数の積をアセンブリで書くと

 みたいな感じになる。2個の複素数構造体はr0とr1にポインタが入るから、vldmで2本ずつロードして、mlu、mla、mlsで積差や積和を求めて、bxで返す。めっちゃシンプル。

 ただし、構造体のoperatorで計算しようとすると、呼ぶ前にメモリに書き込んで呼び出し後にレジスタに呼び戻したり、スクラッチレジスタをスタックに保存する処理が必要になるから、あまり高速な計算はできない。FIRとかIIRとか、まとまった計算を連続してやる場合はローカルの変数で計算させれば、コンパイラがいい感じにレジスタに乗せて最適化してくれる。ロード・ストアが減るし、r0にポインタを置いたり、スクラッチレジスタを退避させたり、みたいな処理がゴッソリ消えるので、だいぶ早くなる。

 このあたりの処理(構造体はメモリ経由で操作とか)はシステムに関わらず共通だと思うんだけど、スパコンとかのチューニングってどうやってるんだろう? キャッシュで頑張ってる感じなんだろうか。Fortranみたいにコンパイラレベルで複素数に対応してる言語だとそのあたりをより強く(ABIにとらわれず)最適化したりできたりするんだろうか。


 最初はコヒーレント復調を目指していたんだけど、面倒くさくなって現状は複素数のmagnitudeを出力するような実装になっている。アンテナからのRFを単純に分岐させてIC-R6とSTM32で復調させてみると、夜はIC-R6では1Hz程度のフェージングが聞こえるのに対して、STM32ではフェージングは全く聞こえない(AF出力をオシロで見ると振動しているのが見える)。STM32で復調したAFは結構ノイズっぽいけど、とはいえIC-R6でも同じようなノイズレベルのような気もするし、復調性能としては同等か項目によっては優秀といったところか。

 現状、RFをダイレクトサンプリング(実部のみ)、複素数のLOをかけてCICでデシメーション、再び複素数のLOをかけてCICでデシメーション、続いてFIRでCICを補正し、複素数のmagnitudeを取り出して、IIR(HPF) / IIR(LPF)で搬送波の除去とAGCを行い、CICでインターポレーションしてDACから出力、という流れ。ADCは約3.8Msps、DACは約60ksps。FIRはいくつかの係数を用意しておいて、例えばDSB, VBS(LSB), VBS(USB)、みたいに切り替えができる。suppressed carrierは現状非対応。周波数の設定がシビアになるので、UIとの兼ね合いになる。CWに関しても非対応。AMラジオに近い帯域でCWを出すよな信号源は無いからな。近くに475kHzあたりがあるけど、ラジオに比べて桁違いに(2-5桁)弱いから、受信するのは厳しそう。

 AGCを使うと夜間にフェージングが結構気になる。AGCを切ればフェージングはほとんど気にならなくなる。周波数の設定以外に、変調モード(DSB, VBS-LSB, VBS-USB)とAGCのON/OFFみたいなスイッチが欲しい。


 方向性を見失い中。どうしたものかなー。

 現状は周波数の指定とかはPCから指示しているけど、スタンドアロンで設定できるようにしたい。とはいえ、押しボタンとかを作るのは面倒だし、ロータリーエンコーダとかを使うにしてもLEDなりLCDなりが必要になるし、サムロータリースイッチを使うにしてもAM放送は9kHz間隔だから設定が面倒だし。10回転の可変抵抗(バーニヤダイヤル)を使えばADC1本だけで1000くらいの範囲を設定できるけど、AMラジオの周波数範囲(500-1500kHzあたり)を設定するのには微妙に不便(周波数の数字が500ずれる)。普通の可変抵抗だと1MHz/300dくらいだから、3.3kHz/degくらい。magnで復調してるから0.3kHzくらいのズレは許容できるけど、とはいえ3.3kHz/degで0.1度の調整は厳しそう。10回転のバーニヤダイヤルでも1度で設定しないとだめだから、だいぶ厳しそうだな。

 あと、せっかく(ほぼ)ワンチップ、(ほぼ)フルデジタルでAMラジオを復調しているのに、Nucleoフォームファクタだからあまり面白みが無い。ST-Link用のチップだったり、ボード自体の大きさだったり。大きさとか言い出したら専用のデコードチップには敵わないけど、とはいえもう少し小型化したいよねーという感じはある。基板作ればQFP64チップ1個分(レギュやCR類は裏面に実装)まで小さくなるんだろうけど、とはいえさすがに基板を作るのは面倒だし。

0 件のコメント:

コメントを投稿