mbed OS 5 version of sample program indicating the usage of CMSIS-DSP which supports NEON

Dependencies:   mbed-dsp-neon

Information

Japanese version of description is stated at last half of this page.
このページの後半に日本語版の説明があります。

mbed OS 5 version of sample program indicating the usage of CMSIS-DSP which supports NEON

Overview

This sample program shows the example for usage of CMSIS-DSP supporting NEON.
Concretely, in this program, mbed-dsp-neon is used instead of mbed-dsp and FIR filter based on SciPy FIR Filter is carried out.
Input signal and referenced output are implemented in data.cpp.

With respect to the default configuration of serial communication (e.g. baud rate), please refer to the link below: https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

Note that only ARM Compiler 5 is available at present for building this program.

mbed OS 5版NEON対応CMSIS-DSPサンプルプログラム

概要

本プログラムはNEON対応CMSIS-DSPの使用例を示すサンプルプログラムです。
具体的には、mbed-dspライブラリの代わりにmbed-dsp-neonを用いてSciPy FIR Filterで示すFIRフィルタ処理を行います。
data.cppには入力信号データと基準出力データが記載されています。

デフォルトのシリアル通信(ボーレート等)設定に関しては以下のリンクを参照してください。
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

なお、現時点で本プログラムをビルド可能なコンパイルはARMコンパイラ 5 のみですのでご注意ください。

main.cpp

Committer:
Osamu Nakamura
Date:
2017-02-23
Revision:
0:0397f7370803

File content as of revision 0:0397f7370803:

#include "arm_math.h" 
#include "math_helper.h" 
#include <stdio.h>

#define BLOCK_SIZE          32
#define NUM_BLOCKS          10

#define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS)

#define SNR_THRESHOLD_F32   140.0f
#define NUM_TAPS            29

/* -------------------------------------------------------------------
 * The input signal and reference output (computed with MATLAB)
 * are defined externally in arm_fir_lpf_data.c.
 * ------------------------------------------------------------------- */
extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES]; 
extern float32_t refOutput[TEST_LENGTH_SAMPLES]; 

/* ------------------------------------------------------------------- 
 * Declare State buffer of size (numTaps + blockSize - 1)
 * ------------------------------------------------------------------- */
static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; 

/* ---------------------------------------------------------------------- 
 * FIR Coefficients buffer generated using fir1() MATLAB function. 
 * fir1(28, 6/24)
 * ------------------------------------------------------------------- */ 
const float32_t firCoeffs32[NUM_TAPS] = { 
    -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f,
    +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f,
    +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f,
    +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f,
    -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f,
    +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
};

/* ---------------------------------------------------------------------- 
 * FIR LPF Example 
 * ------------------------------------------------------------------- */
int32_t main(void) { 
    /* Call FIR init function to initialize the instance structure. */
    arm_fir_instance_f32 S;
    arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], BLOCK_SIZE); 
    
    /* ---------------------------------------------------------------------- 
     * Call the FIR process function for every blockSize samples  
     * ------------------------------------------------------------------- */ 
    for (uint32_t i=0; i < NUM_BLOCKS; i++) {
        float32_t* signal =  testInput_f32_1kHz_15kHz + (i * BLOCK_SIZE);
        arm_fir_f32(&S, signal, signal, BLOCK_SIZE);
    } 
    
    /* ---------------------------------------------------------------------- 
     * Compare the generated output against the reference output computed
     * in MATLAB.
     * ------------------------------------------------------------------- */
    float32_t snr = arm_snr_f32(refOutput, testInput_f32_1kHz_15kHz, TEST_LENGTH_SAMPLES);
    printf("snr: %f\n\r", snr);
    if (snr < SNR_THRESHOLD_F32) {
        printf("Failed\n\r");
    } else {
        printf("Success\n\r");
    }
}