QN9080
フュージョン・シグナル・プロセッサを試す

QN9080 Fusion Signal Processor

QN9080には、フュージョン・シグナル・プロセッサ(FSP)と言うコプロが集積されいて、特にセンサーのアルゴリズム処理に使用すると最適なコアになっているとの事です。

同時にCortex-M4Fが集積されているので、DSP命令が使用できますが、FSPを使用する事で、Bluetoothスタックや通信の処理で中断されたりすることなく、並行してセンサーから吸い上げたデータのアルゴリズム処理ができるんです。

しかも、Cortex-M4FのDSP命令より高速に処理することができるらしいのです。

では、どのくらい高速化が測れるでしょうか?

今回は、NXP社のBLEデバイスQN90080のフュージョン・シグナル・プロセッサに迫ります。

センサーアルゴリズムの処理に多用する処理

そもそも、センサーを扱うアプリケーションでは、どのような処理が必要なのでしょうか?

センサーからのデータは、アナログからデジタルに変換され、センサーから取得したデジタルデータは、雑音を含むいわゆる生のデータなので、このままでは使えません。

このデータをフィルタリングする処理が必要になります。

センサーデータの突発的なノイズをフィルタリングしたり、また加速度センサーなどでは、得られた加速度を積分して速度データ演算したりと、積分や微分なども多用されます。

フィルタリング処理や微分積分以外にも、周波数分析なども利用されるシーンは非常に多く、FFT(フーリエ解析)などが多用されます。

これら演算処理は、数学関数と言われるsin, cosなどの三角関数や累乗の演算、行列演算、浮動小数点と言った演算が多く使われます。

CMSIS-DSPもある!

CMSIS_logo
出典:ARM CMSIS driver page

URL: http://www.keil.com/pack/doc/CMSIS/DSP/html/index.html

数学関数と言えば、C標準ライブラリにあるmath.hを使用して、数学関数が使えます。

一方、Cortex-MコアのMCUであれば、CMSIS-DSPっていうものも使えます。

合わせて読みたい
前回の記事(CMSISで簡単!サイクル数を計測する方法。 )では、CMSIS-COREを使用して、SysTickタイマーで、しかも簡単なAPIで処理時間やサイクルを測定しました。

CMSIS-DSPは最適化済み

このCMSIS-DSPとは、Cortex-Mコア用に最適化されたDSP演算信号処理ライブラリーの事で、math.hのライブラリを使用するよりも高速に演算させることが可能なんです。

CMSIS-DSPは、Cortex-M4F以外にも、Cortex-M0/M0+/M3でも使用することが可能です。DSP命令やFPUを持っていないM0/M0+でも使用することができます。 もちろん、DSPやFPUが集積されていないのでCortex-M3やM4Fと比べると、コードサイズも大きく、処理速度も遅くなります。

FSPとCMSIS-DSP(Cortex-M4F DSP)どっちが早いか?

先ずは、CMSIS-DSPとFusion Signal Procesorの使い方から説明します。その後、Coretex-MコアとFSPのベンチマークを行いたいと思います。

CMSIS-DSPの使い方

1. arm-math.hをインクルード

arm_math_include
arm_math.hのインクルード

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

2.CMSIS-DSPのライブラリを組み込む

CMSIS_DSP_library
Linker設定にするライブラリー

ライブラリーは、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)を有効にする

FPUのイネーブル
FPUの設定

Cortex-M4Fの場合には、ハードウェア浮動小数点演算ユニット(FPU)を有効にして、はじめてFPUが使えるようになります。

ArchitectureのFloating pointをFPv4-SP(Hard ABI)を指定してイネーブルします。

AssemblerやLinker欄にも同様に設定します。

NXPから提供されるSDKには、既にCMSISが取り込まれていて、CMSISを使用するための設定されています。CMSIS-DSPを使用するには、上記3点を設定することでCMSIS-DSPを使うことができるようになります。

Fusion Signal Processorの使い方

FPUヘッダーインクルード
FSPのヘッダーをインクルード

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);
}

 

計測結果

実行サイクル数計測結果
FSPとCortexM4F(CMSIS-DSP)との実行サイクル数の計測結果

計測の結果、どの項目もFusion Signal Processorの方が高速であることが分かりました。

特に、FFT(フーリエ解析)演算では、約7倍高速、累乗の演算では約6倍高速と言う結果となりました。

FSPはCortexM4Fのコプロであるため、Cortex-M4FはBLEのプロトコルの処理、FSPでセンサーデータのアルゴリズム処理を同時並列に処理できます。

まとめ

実際に、QN9080のFusion Signal Processorを動作させてその処理速度を測定してみました。結果、Cortex-M4Fコアと比較して約6〜7何倍も高速であることが確認できました。

小型ウェアラブルなどに要求される、省電力性、BLE機能、そしてセンサーアルゴリズム処理を全てワンチップで行ってくれるQN9080は、正にスマートウェアラブル向けのBLEデバイスだと思いました。