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 のみですのでご注意ください。
Diff: main.cpp
- Revision:
- 0:0397f7370803
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Feb 23 13:40:48 2017 +0900 @@ -0,0 +1,65 @@ +#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"); + } +}