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のみです。


main.cpp

Committer:
1050186
Date:
2015-06-23
Revision:
3:b96b26d4fbce
Parent:
2:9ccaf6885ced

File content as of revision 3:b96b26d4fbce:

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