STM32のDSPを使う

お久しぶりです。もりゅーです。

今日はSTM32のDSP libraryで三角関数演算をしてみたいと思います。

環境

Windows10+STM32CubeIDE+NucleoG474RE

参考

以下のサイトが参考になります。
ioloa.com

簡単な使い方

1. CubeMXでの設定

プロジェクトの作り方などは他サイトさんを参照ください。特に特別なことはないです。

まずCubeMX画面で「Additional Software」を選択
f:id:Moryu_io:20200211153329p:plain

開いた画面の左側で「CMSIS」を選択すると、こんな感じの画面になる。
始めてDSPなどを使用する場合はインストールが必要なので、右の方のinstallを選択
f:id:Moryu_io:20200211153457p:plain

インストールが終わったらDSPでLibraryを選択しOK
f:id:Moryu_io:20200211153620p:plain

CubeMXの左の方にAdditional Softwareが追加されるので、CMSIS DSPにチェックを入れる。
その後、コードを生成する。
f:id:Moryu_io:20200211153741p:plain

こんな感じ(なんかエラーが出てるのは気にしないでください)
f:id:Moryu_io:20200211154004p:plain

2. ライブラリファイルの設定

(なぜかここは手動。もしかしたら自動で持ってきてくれるオプションとかあるのだろうか・・・)

まず、CubeMXのrepositoryの以下のフォルダにある
・libarm_cortexM4lf_math.lib
・libarm_cortexM4lf_math.a
をプロジェクトの適当なところにインポートする。
なお、G4以外のシリーズを使う場合はフォルダが異なるので注意(特にCortexシリーズが異なるもの)
f:id:Moryu_io:20200211154116p:plain
f:id:Moryu_io:20200211154124p:plain

Paths and SymbolsでLibの設定を行う。
↑で置いたフォルダのパスを設定する。
f:id:Moryu_io:20200211154443p:plain
f:id:Moryu_io:20200211154454p:plain

3. 実際に使う

こんな感じのフォルダ構成になっているはず。
使用方法は簡単でCortex-M4の場合は以下のように書けば、中の関数を使用できる。

#define ARM_MATH_CM4
#include "arm_math.h"

f:id:Moryu_io:20200211154635p:plain

4. 比較

比較したのは以下の三つ
DSPの arm_sin_f32
・math.hのsinf
・学生時代にずっと使わせていただいていた軽量な三角関数
コンパクト三角関数 - ロボット工作研究室Wiki

なお、比較方法としては各演算を1000回繰り返し、
その間のタイマー(1usにつき1カウントインクリメントする設定)の進み量を演算時間とした

DSPの arm_sin_f32 : 433 us
f:id:Moryu_io:20200211155131p:plain

★math.hのsinf : 20789 us
f:id:Moryu_io:20200211155156p:plain

★コンパクト三角関数 : 821 us
f:id:Moryu_io:20200211155208p:plain


ちなみに最後の_hogeは sin(999)なのですが、真の値は
sin(999) = -0.0264607527....
なので、精度的には
math.h > DSP > コンパクト三角関数
ですね。

まとめ

DSPでの演算の簡単な使用方法と簡単な比較を行いました。
DSPは速度も速く、そこそこの精度がありますね。

が、これまで使用していた三角関数も結構いい線いっているので、
DSP演算ができないようなマイコンなどではまだまだ出番はありそうです。