Example FIR filter using the CMSIS DSP API

Dependencies:   mbed mbed-dsp

Committer:
emilmont
Date:
Tue Jan 08 17:00:49 2013 +0000
Revision:
2:9ccaf6885ced
Parent:
1:9442dff3bfdc
Update example to latest mbed-dsp library

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 }