QN9080には、フュージョン・シグナル・プロセッサ(FSP)と言うコプロが集積されいて、特にセンサーのアルゴリズム処理に使用すると最適なコアになっているとの事です。
同時にCortex-M4Fが集積されているので、DSP命令が使用できますが、FSPを使用する事で、Bluetoothスタックや通信の処理で中断されたりすることなく、並行してセンサーから吸い上げたデータのアルゴリズム処理ができるんです。
しかも、Cortex-M4FのDSP命令より高速に処理することができるらしいのです。
では、どのくらい高速化が測れるでしょうか?
今回は、NXP社のBLEデバイスQN90080のフュージョン・シグナル・プロセッサに迫ります。
コンテンツ
センサーアルゴリズムの処理に多用する処理
そもそも、センサーを扱うアプリケーションでは、どのような処理が必要なのでしょうか?
センサーからのデータは、アナログからデジタルに変換され、センサーから取得したデジタルデータは、雑音を含むいわゆる生のデータなので、このままでは使えません。
このデータをフィルタリングする処理が必要になります。
センサーデータの突発的なノイズをフィルタリングしたり、また加速度センサーなどでは、得られた加速度を積分して速度データ演算したりと、積分や微分なども多用されます。
フィルタリング処理や微分積分以外にも、周波数分析なども利用されるシーンは非常に多く、FFT(フーリエ解析)などが多用されます。
これら演算処理は、数学関数と言われるsin, cosなどの三角関数や累乗の演算、行列演算、浮動小数点と言った演算が多く使われます。
CMSIS-DSPもある!

URL: http://www.keil.com/pack/doc/CMSIS/DSP/html/index.html
数学関数と言えば、C標準ライブラリにあるmath.hを使用して、数学関数が使えます。
一方、Cortex-MコアのMCUであれば、CMSIS-DSPっていうものも使えます。
CMSIS-DSPは最適化済み
このCMSIS-DSPとは、Cortex-Mコア用に最適化されたDSP演算信号処理ライブラリーの事で、math.hのライブラリを使用するよりも高速に演算させることが可能なんです。
FSPとCMSIS-DSP(Cortex-M4F DSP)どっちが早いか?
先ずは、CMSIS-DSPとFusion Signal Procesorの使い方から説明します。その後、Coretex-MコアとFSPのベンチマークを行いたいと思います。
CMSIS-DSPの使い方
1. arm-math.hをインクルード

一般的には、数学関数を使用する場合には、math.hと言うCの標準ライブラリをインクルードしますが、CMSIS-DSPを使用する場合には、このmath.hの代わりにarm-math.hをインクルードする事で使用可能になります。
2.CMSIS-DSPのライブラリを組み込む

ライブラリーは、MCUXPresso SDKパッケージをダウンロードする際に、希望のボードを選択したあと、”Add Software components”でCMSIS-DSPを選び追加しておく必要があります。これで、CMSIS-DSPライブラリSDKに組み込むことができます。
CMSIS-DSPは、以下フォルダに保存されています。
MCUXpresso SDKパッケージ/libs/arm_cortexm4lf_math.a
オプションPropoerty->C/C++BuildのLinker Librariesには、.aをとったライブラリー名(arm_cortexm4lf_math)だけを指定します。
サーチパスは、上記パスのパスを指定しますが、上図のように指定しても問題ないです。
3. ハードウェア浮動小数点数演算ユニット(FPU)を有効にする

Cortex-M4Fの場合には、ハードウェア浮動小数点演算ユニット(FPU)を有効にして、はじめてFPUが使えるようになります。
ArchitectureのFloating pointをFPv4-SP(Hard ABI)を指定してイネーブルします。
AssemblerやLinker欄にも同様に設定します。
Fusion Signal Processorの使い方

fsl_fsp.hをインクルードするだけで、FSPを使用することができます。特に、ライブラリを組み込む必要はありません。
後は、FSP_xxxと言う関数をコールするだけで、FSPを使用することができ、CMSIS-DSPの関数と比べると、先頭プレフィックスがFSP_に変わっているような関数なので、CMSIS-DSPからFSPに移植する作業は非常に簡単です。
FSPの関数群は、ドキュメントに記載されているので、参照して使ってください。
実際に動作させてみる
QN9080のSDKには、FSPのサンプルコードが付属していますので、このコードで確認してみます。
サンプルコードは、FFT、行列演算、累乗をそれぞれ、FSPとCortexM4Fで実行して、そのサイクル数を計測しています。
参考:計測にもCMSISを使用しています。
ここでは、累乗計算のコードのみを掲載します。
void power_example(void)
{
uint32_t fsp_cycles, mcu_cycles;
for (uint32_t i = 0; i < 256; i++)
power_acc_input[i] = 0.1 * i;
s_se_done = 0;
// FSP
START_COUNTING();
FSP_PowerIntF32(DEMO_FSP_BASE, power_acc_input, 1024);
while (!s_se_done)
{
}
FSP_GetPowerIntResultF32(DEMO_FSP_BASE, &power_acc_fsp_output);
fsp_cycles = GET_CYCLES();
// MCU
START_COUNTING();
arm_power_f32(power_acc_input, 1024, &power_acc_mcu_output);
mcu_cycles = GET_CYCLES();
PRINTF("-- Sum of the squares of the 1024 elements\r\n");
PRINTF("FSP %d cycles, MCU %d cycles\r\n", fsp_cycles, mcu_cycles);
}
計測結果

計測の結果、どの項目もFusion Signal Processorの方が高速であることが分かりました。
特に、FFT(フーリエ解析)演算では、約7倍高速、累乗の演算では約6倍高速と言う結果となりました。
FSPはCortexM4Fのコプロであるため、Cortex-M4FはBLEのプロトコルの処理、FSPでセンサーデータのアルゴリズム処理を同時並列に処理できます。
まとめ
実際に、QN9080のFusion Signal Processorを動作させてその処理速度を測定してみました。結果、Cortex-M4Fコアと比較して約6〜7何倍も高速であることが確認できました。
小型ウェアラブルなどに要求される、省電力性、BLE機能、そしてセンサーアルゴリズム処理を全てワンチップで行ってくれるQN9080は、正にスマートウェアラブル向けのBLEデバイスだと思いました。