いろいろ問題がありましたが、Nucleo F746ZG用のUI基板『浮舟』が完成しました。浮舟には性能測定用のテストポイントを付けましたのでオシロスコープの接続が容易です。ということで、ようやく肝心の性能評価にかかりました。
結論から書くと、十分な性能がでています。
三角関数
stdlibのsin()関数の実行です。
sin()関数の1回の実行が1.16uSです。これは割り込み処理等のフレームワーク・オーバーヘッドを含みます。一方、ブロックサイズ=11とした11回の実行は同じくオーバーヘッド込みで8.81uSです。ですので、1回の実行時間は0.76uSです。
サンプル周期は20uSです。もくろんでいるアルゴリズムは、この間に4回程度sin/cosを実行することになると思われます。その時間が3uSなら、許容範囲です。archtan()についても調べましたが、同程度の計算時間です。
FIRフィルタ
CMSISのarm_fir_f32()を使って100タップの浮動小数点FIR関数を実行しました。ブロックサイズ=1のときは割り込みオーバーヘッド込みで4.2uS。ブロックサイズ=11の時は同じく17.9uSです。このことから1000タップの実行時間は13.7uS、1タップの平均は13.7nSとなります。
処理速度としては申し分ありません。おおよそ200MHzでこの性能と言うことは、タップあたり3サイクルを切っており、汎用CPUによる信号処理としては文句の付けようがない性能です。
まとめ
「Fs=48kHzで1サンプルの間にsinとcosを計4回、128タップのフィルタを4本回せると良いな」と、考えていましたが、充分以上の性能でした。この処理ならSTM32F746を200MHzで動作させて、だいたい50%くらいの処理負荷になりそうです。
1タップ13.7nsは十分な性能ですね。しかも浮動小数点でしょ。
普通のデジタル信号処理ではまったく問題ないですね。
あと気になるのは、サーキュラーメモリーの仕組みはないと
思いますので、そこをどう乗り切るか。
今後が楽しみです!
1/48000Sec以内にこれだけ処理できるとなるとシステム同定の理論つかっていろいろ遊べそうな予感がしますね。!
B767さん、がれすたさん、コメントありがとうございます。
B767さん、FIRフィルタはARM提供のものです。このアルゴリズムは1ブロックの入力を処理した後、taps-1分のサンプルをバッファの後ろに移動する方法です。移動のオーバーヘッドは馬鹿馬鹿しいですが、SIMD FPUへの対応は簡単そうです。
がれすたさん、手が空いたら適応フィルタも試してみたいです。