まずch0はデータサンプリングを行うタイマ割込みルーチンの起動の様子です(Lレベルが割り込み期間)
割り込みはタイマ0により16kHzで入るのでパルス間は62.5usになります。
カーソルでは61500nsと読み取れ、だいたい合っています
1発目の間隔が短いのはタイマの初期値が不定だったからで、初期化が必要でした。修正しなくては。
割り込みはタイマ0により16kHzで入るのでパルス間は62.5usになります。
カーソルでは61500nsと読み取れ、だいたい合っています
1発目の間隔が短いのはタイマの初期値が不定だったからで、初期化が必要でした。修正しなくては。
この割込みを64回カウントして64個のデータセットができるまでアイドルループを続けます(ch1が「L」の期間)
一方、1回の割り込み処理自体は5us程度で終了しており、このループの処理はスカスカです。データへの窓関数掛けなど前処理をここでやってしまえばいいですね
一方、1回の割り込み処理自体は5us程度で終了しており、このループの処理はスカスカです。データへの窓関数掛けなど前処理をここでやってしまえばいいですね
次にスケールを広くして見たところです
データ取得開始してから62.5us×64=約4ms経過し
64個のアナログデータが揃ったところ(ch1がL→Hになったところ)からFFTの処理が始まります。ここでは窓関数の適用、FFT処理本体、ビットリバース処理、複素数の実数化を順次行いますが驚くべきことに、以下のch2が「L」になっている期間に全てが行われます
データ取得開始してから62.5us×64=約4ms経過し
64個のアナログデータが揃ったところ(ch1がL→Hになったところ)からFFTの処理が始まります。ここでは窓関数の適用、FFT処理本体、ビットリバース処理、複素数の実数化を順次行いますが驚くべきことに、以下のch2が「L」になっている期間に全てが行われます
そのあと、ch3が「L」の期間に計算結果をグラフ化してグラフィック液晶に書き込むわけですが、何のことは無い、この部分に一番時間を食ってしまっています
結局データ取得からまた次のデータ取得が始まるまでのインターバルは約35ms(カーソルでは34816us)つまり画面の更新は1/35ms=約29fpsとなります。
結局データ取得からまた次のデータ取得が始まるまでのインターバルは約35ms(カーソルでは34816us)つまり画面の更新は1/35ms=約29fpsとなります。
もっともこれは「人間の目で見る」表示器としては十分すぎる速さです。むしろ速すぎるので波形のポーズ、ピークホールドが必要なくらいです
FFT処理の部分を拡大してみました
64個のデータの取得終了後、約320usで処理完了しています。
さすがにハードウェアの積和演算回路を備えているだけのことがあります。
外部とのやり取りがないので純粋なCPUの速度が生かされますね。
一方、グラフィックLCDへの書込みはステータスをポーリングしながら行うので相手に律速されてしまい、如何ともしがたいところです。メモリがふんだんにあればデータ取り込み数を増やしデータセットも2組持ってサンプリングと表示処理をインターリーブすることも考えられますが、今のところこれで十分です