
遅延線方式と帯域フィルタ方式。
遅延線方式の場合は上下で参照しているので、上下方向に輝度変化が大きいとつらい。
バンドパスフィルタの場合は左右で参照しているので、左右方向に輝度変化が大きいとつらい。
上下の輝度変化は、左上位のタイルの上辺や、下段と中段のタイルの隙間あたりがわかりやすい。
左右の輝度変化は、左下のタイルのアイコンの付近がわかりやすい。
矩形波を周波数空間で表現すると非常に高い周波数成分まで含まれ、これを捨てるとリンギングが発生する。BPF方式は高周波成分を捨てているので、やはりリンギングが発生する。
遅延線の場合、CGMSやCCAPのような1ラインの中で表現されるデジタル信号に大きな影響が発生してしまう。
BPFの場合、水平方向の立ち上がり・立ち下がりが鈍るので、水平同期信号の検出にも支障をきたす。遅延線では立ち上がり・立ち下がりに対しての影響が少ないので、クロック誤差でずれたところは綺麗にずれる。BPFでは特性が悪いので、1サンプル未満の誤差で暴れる。
***
1フレームのキャプチャが無事成功したので、次は連続したフレームのキャプチャだ、と思っているんだけど、なかなかうまく動かない。1フレーム分のキャプチャ内でTIMやADCやDMAの設定をかなり書き換えるので、それが正常に復元できていないんだと思う。
下手にデバッグメッセージを大量に入れると1フレーム目のキャプチャ自体に影響が出たり、色々と問題がある。
タイミングクリティカルなデバッグの常として、「printfでデバッグメッセージを入れると何故か動く」(あるいはその逆)がありえる。printfで使われる僅かな時間すらも影響してくる。
他の方法だと、例えばUARTペリフェラルを初期化しておけば、mov命令1個で8bitのメッセージを出せるので、かなり便利そうな気がする。UARTの初期化がめんどくせーのでやってないけど。
しかしまぁ、めんどくせーとか言っててもしょうがないので、もうちょっと動かしてみて、やっぱりだめなようならUARTの初期化コードを追加してみよう。
***
追記
ハフマン圧縮での内部処理、4ブロック→2ブロックにしたらだいぶ早くなった。8ブロックとか16ブロックだと遅くなる。1ブロックでも遅くなる。2ブロックが一番早い。謎い。
ブロック数を増やしたほうがループ処理でのオーバーヘッドが減るけど、それ以上にどこかに処理時間が食われてる。どこに食われてるんだろう? 同じ処理をコピペしてるだけだし、変数も使いまわしてるので、メモリアクセスとかは増えてないはずなんだけど。

DMA割り込みで立ち上げて、圧縮処理後に下げている。
時間がLow > Highなら処理が間に合ってる。Low < Highでも、その後で処理が早くなって間に合うこともある。ズルズルと遅れていって間に合わなくなるときもある。処理が間に合わなくても、そのデータが上書きされる前に逃げ切れればいいので、少し遅いくらいなら問題ない。蓄積されていくと問題になる。
圧縮処理は差からテーブルの要素を選んでビットシフトしてOR、が基本だけど、ワード境界ではいくつかの処理が増えるので、ワード境界処理が多くなるようなデータの場合は余計に処理時間が必要になる。境界処理が多い=圧縮率が悪い、というデータ。ツリーによっても変わってくるが、AC成分が少ないほうが圧縮率が高い傾向。
今はバッファに99KiBを確保しているけど、画面が一様な(DC成分が多い)画面では下部に次のフレームが結構広く表示される。
今のサンプル画像はさほどAC成分が多くないから、カメラの信号を入れたりすると圧縮効率が悪くなりそう。
今は99KiBを確保しているけど、100KiBを確保するとメモリが足りなくてリンクエラーになる(静的確保だとこういうエラーが出るので便利)。
printfで浮動小数点数を文字列化しようとすると内部でmallocが走るが、99KiBを確保しているとmallocに失敗する。90KiBならfloatも表示される。
結構カツカツだ。
RTOS周りで4KiBは削れそうな気がする。USBを使わないなら1-2KiBくらいは削れるはず。
浮動小数点の文字列化が不要ならmallocで確保する分は気にしなくていいから、RTOSが起動する前とか割り込みで使われるスタックだけ確保しておけばいい。今はスタックはRAMに置いてるけど、CCMRAMに移動できればスタックに気を使う必要もない。
と、色々考えても、結構ギリギリだよなぁ。
はやいところJPEGカメラを発掘してNTSC信号が出せるカメラを確保したい。
そういえば、複数フレームを連続してキャプチャするのは動くようになった。あとはデータをSDカードに書き出せば、低fpsながらも動画データとしての記録ができるし、キャプチャ前にADCチャンネルを変更する処理を追加すれば、複数のカメラヘッドから時分割で読み出せるようになる。
複数の映像ソースを確保しないと動作テストできないけど。
0 件のコメント:
コメントを投稿