Sample program for CMSIS-DSP of supporting NEON

Dependencies:   mbed-dsp-neon mbed

Fork of cmsis_dsp_fir by Emilio Monti

Information

Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.

Sample Program for CMSIS-DSP of Supporting NEON

What is this ?

This is a sample program of FIR filter for using CMSIS-DSP of supporting NEON.
This program is the sample program of the FIR filter based on SciPy FIR Filter, and it has replaced the mbed-dsp library to mbed-dsp-neon library.
Input signal and reference output are described in data.cpp.

The default setting of serial communication (baud rate etc.) in mbed is shown the following link.
Please refer to the link and change the settings of your PC terminal software.
The default value of baud rate in mbed is 9600, and this application uses baud rate 9600.
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

Supporting compiler is only ARMCC.


NEON対応CMSIS-DSPサンプルプログラム

概要

このプログラムは、SciPy FIR Filterに基づいたFIRフィルタのサンプルプログラムであり、mbed-dspライブラリをmbed-dsp-neonライブラリに置き換えています。
data.cppには、入力信号データと基準出力データが記載されています。

mbedのシリアル通信(ボーレート等)のデフォルト設定は以下のリンクに示しています。
リンクを参考に、お使いのPCターミナルソフトの設定を変更して下さい。
mbedでのボーレートのデフォルト値は9600で、このサンプルではボーレート9600を使います。
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

対応するコンパイラはARMCCのみです。


Committer:
1050186
Date:
Tue Jun 23 06:24:51 2015 +0000
Revision:
3:b96b26d4fbce
Parent:
2:9ccaf6885ced
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:9442dff3bfdc 1 #include "arm_math.h"
emilmont 1:9442dff3bfdc 2 #include "math_helper.h"
emilmont 2:9ccaf6885ced 3 #include <stdio.h>
emilmont 1:9442dff3bfdc 4
emilmont 1:9442dff3bfdc 5 #define BLOCK_SIZE 32
emilmont 1:9442dff3bfdc 6 #define NUM_BLOCKS 10
emilmont 2:9ccaf6885ced 7
emilmont 1:9442dff3bfdc 8 #define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS)
emilmont 1:9442dff3bfdc 9
emilmont 2:9ccaf6885ced 10 #define SNR_THRESHOLD_F32 140.0f
emilmont 1:9442dff3bfdc 11 #define NUM_TAPS 29
emilmont 2:9ccaf6885ced 12
emilmont 2:9ccaf6885ced 13 /* -------------------------------------------------------------------
emilmont 2:9ccaf6885ced 14 * The input signal and reference output (computed with MATLAB)
emilmont 2:9ccaf6885ced 15 * are defined externally in arm_fir_lpf_data.c.
emilmont 2:9ccaf6885ced 16 * ------------------------------------------------------------------- */
emilmont 2:9ccaf6885ced 17 extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES];
emilmont 2:9ccaf6885ced 18 extern float32_t refOutput[TEST_LENGTH_SAMPLES];
emilmont 1:9442dff3bfdc 19
emilmont 2:9ccaf6885ced 20 /* -------------------------------------------------------------------
emilmont 2:9ccaf6885ced 21 * Declare State buffer of size (numTaps + blockSize - 1)
emilmont 2:9ccaf6885ced 22 * ------------------------------------------------------------------- */
emilmont 2:9ccaf6885ced 23 static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];
emilmont 1:9442dff3bfdc 24
emilmont 2:9ccaf6885ced 25 /* ----------------------------------------------------------------------
emilmont 2:9ccaf6885ced 26 * FIR Coefficients buffer generated using fir1() MATLAB function.
emilmont 2:9ccaf6885ced 27 * fir1(28, 6/24)
emilmont 2:9ccaf6885ced 28 * ------------------------------------------------------------------- */
emilmont 2:9ccaf6885ced 29 const float32_t firCoeffs32[NUM_TAPS] = {
emilmont 1:9442dff3bfdc 30 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f,
emilmont 1:9442dff3bfdc 31 +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f,
emilmont 1:9442dff3bfdc 32 +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f,
emilmont 1:9442dff3bfdc 33 +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f,
emilmont 1:9442dff3bfdc 34 -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f,
emilmont 1:9442dff3bfdc 35 +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
emilmont 1:9442dff3bfdc 36 };
emilmont 1:9442dff3bfdc 37
emilmont 2:9ccaf6885ced 38 /* ----------------------------------------------------------------------
emilmont 2:9ccaf6885ced 39 * FIR LPF Example
emilmont 2:9ccaf6885ced 40 * ------------------------------------------------------------------- */
emilmont 1:9442dff3bfdc 41 int32_t main(void) {
emilmont 2:9ccaf6885ced 42 /* Call FIR init function to initialize the instance structure. */
emilmont 2:9ccaf6885ced 43 arm_fir_instance_f32 S;
emilmont 2:9ccaf6885ced 44 arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], BLOCK_SIZE);
emilmont 1:9442dff3bfdc 45
emilmont 2:9ccaf6885ced 46 /* ----------------------------------------------------------------------
emilmont 2:9ccaf6885ced 47 * Call the FIR process function for every blockSize samples
emilmont 2:9ccaf6885ced 48 * ------------------------------------------------------------------- */
emilmont 1:9442dff3bfdc 49 for (uint32_t i=0; i < NUM_BLOCKS; i++) {
emilmont 2:9ccaf6885ced 50 float32_t* signal = testInput_f32_1kHz_15kHz + (i * BLOCK_SIZE);
emilmont 2:9ccaf6885ced 51 arm_fir_f32(&S, signal, signal, BLOCK_SIZE);
emilmont 1:9442dff3bfdc 52 }
emilmont 1:9442dff3bfdc 53
emilmont 2:9ccaf6885ced 54 /* ----------------------------------------------------------------------
emilmont 2:9ccaf6885ced 55 * Compare the generated output against the reference output computed
emilmont 2:9ccaf6885ced 56 * in MATLAB.
emilmont 2:9ccaf6885ced 57 * ------------------------------------------------------------------- */
emilmont 2:9ccaf6885ced 58 float32_t snr = arm_snr_f32(refOutput, testInput_f32_1kHz_15kHz, TEST_LENGTH_SAMPLES);
emilmont 1:9442dff3bfdc 59 printf("snr: %f\n\r", snr);
emilmont 1:9442dff3bfdc 60 if (snr < SNR_THRESHOLD_F32) {
emilmont 1:9442dff3bfdc 61 printf("Failed\n\r");
emilmont 1:9442dff3bfdc 62 } else {
emilmont 1:9442dff3bfdc 63 printf("Success\n\r");
emilmont 1:9442dff3bfdc 64 }
emilmont 2:9ccaf6885ced 65 }