2017年6月16日金曜日

DSP_Libを使う

 Cubeでは ./Drivers/CMSIS/DSP_Lib/Source/hoge フォルダの中に各種演算命令が入っている。FIRを使いたかったので、試してみた。

 とりあえず、makefileに必用な関数のソースを追加し、arm_math.hを変更すれば使用できた。

 今回使ったのは arm_fir_f32.c にある arm_fir_f32 という単精度浮動小数点を使った有限インパルス応答のフィルタ。この arm_fir_f32.c をmakefileに追加し、処理を行いたいコードで arm_math.h をインクルードしておく。そうすれば演算関数を使うことができる。
 ただし、僕の環境ではエラーが出てコンパイルすることができなかった。必用な定義が足りないためなので、その定義が含まれているヘッダを arm_math.h に追加する必要がある。
 arm_math.h 先頭の _ARM_MATH_H 直下に、以下のインクルード文を追加した。

#ifdef STM32F405xx
#include "stm32f405xx.h"
#endif

 今回はSTM32F405RGT6で動いているので、stm32f405xx.h をインクルードしている。
 定義自体は数個なので、自分でdefineを書いても良いのだが、とりあえず今回はヘッダをインクルードした。


 FIRに擬似乱数とLPFのフィルタを与えて、結果をPC側でFFTに通すと、LPFっぽい感じになってるし、ちゃんと動いてるんじゃないかなぁ。
 タップ数31、データ数8192でだいたい9msecだった。ただしコアが120MHzで動いてるので、通常の速度なら6.5msecくらいかな?

 DPS_Libには各種の関数があるが、単精度浮動小数点・32bit固定小数点・16bit固定小数点のバリエーションが有る。32bit・15bitのfixedはそれぞれq31・q15と書いてあるので、符号1bit・整数0bit・小数31bit みたいなフォーマットなんじゃなかろうか(未確認)。

 いろいろとクセがありそうなのと、いまいち何をやってる関数なのかわかりにくいので、使うのはちょっと大変かも。とはいえ、中身はただのC言語ソースなので、ARM以外のプラットフォームでも動きそう。とりあえずPC上で動きを確認してみるのもアリかも。

0 件のコメント:

コメントを投稿