Example FIR filter using the CMSIS DSP API

Dependencies:   mbed mbed-dsp

Committer:
emilmont
Date:
Mon Mar 12 12:00:25 2012 +0000
Revision:
1:9442dff3bfdc
Parent:
0:840b7af4eace
Child:
2:9ccaf6885ced

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:9442dff3bfdc 1 #include <stdio.h>
emilmont 1:9442dff3bfdc 2 #include "arm_math.h"
emilmont 1:9442dff3bfdc 3 #include "math_helper.h"
emilmont 1:9442dff3bfdc 4
emilmont 1:9442dff3bfdc 5 #define BLOCK_SIZE 32
emilmont 1:9442dff3bfdc 6 #define NUM_BLOCKS 10
emilmont 1:9442dff3bfdc 7 #define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS)
emilmont 1:9442dff3bfdc 8
emilmont 1:9442dff3bfdc 9 #define NUM_TAPS 29
emilmont 1:9442dff3bfdc 10 #define SNR_THRESHOLD_F32 140.0f
emilmont 1:9442dff3bfdc 11
emilmont 1:9442dff3bfdc 12 // The input signal and reference output
emilmont 1:9442dff3bfdc 13 extern float32_t signal[TEST_LENGTH_SAMPLES];
emilmont 1:9442dff3bfdc 14 extern float32_t filtered_signal[TEST_LENGTH_SAMPLES];
emilmont 1:9442dff3bfdc 15
emilmont 1:9442dff3bfdc 16 // Declare FIR State buffer of size (numTaps + blockSize - 1)
emilmont 1:9442dff3bfdc 17 float32_t fir_state[BLOCK_SIZE + NUM_TAPS - 1];
emilmont 1:9442dff3bfdc 18
emilmont 1:9442dff3bfdc 19 // FIR Coefficients
emilmont 1:9442dff3bfdc 20 const float32_t fir_coeff[NUM_TAPS] = {
emilmont 1:9442dff3bfdc 21 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f,
emilmont 1:9442dff3bfdc 22 +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f,
emilmont 1:9442dff3bfdc 23 +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f,
emilmont 1:9442dff3bfdc 24 +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f,
emilmont 1:9442dff3bfdc 25 -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f,
emilmont 1:9442dff3bfdc 26 +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
emilmont 1:9442dff3bfdc 27 };
emilmont 1:9442dff3bfdc 28
emilmont 1:9442dff3bfdc 29 int32_t main(void) {
emilmont 1:9442dff3bfdc 30 // Call FIR init function to initialize the instance structure.
emilmont 1:9442dff3bfdc 31 arm_fir_instance_f32 fir;
emilmont 1:9442dff3bfdc 32 arm_fir_init_f32(&fir, NUM_TAPS, (float32_t *)fir_coeff, fir_state, BLOCK_SIZE);
emilmont 1:9442dff3bfdc 33
emilmont 1:9442dff3bfdc 34 // Call the FIR process function for every BLOCK_SIZE samples
emilmont 1:9442dff3bfdc 35 for (uint32_t i=0; i < NUM_BLOCKS; i++) {
emilmont 1:9442dff3bfdc 36 float32_t* signal_buffer = signal + (i * BLOCK_SIZE);
emilmont 1:9442dff3bfdc 37 arm_fir_f32(&fir, signal_buffer, signal_buffer, BLOCK_SIZE);
emilmont 1:9442dff3bfdc 38 }
emilmont 1:9442dff3bfdc 39
emilmont 1:9442dff3bfdc 40 // Compare the generated output against the reference
emilmont 1:9442dff3bfdc 41 float32_t snr = arm_snr_f32(filtered_signal, signal, TEST_LENGTH_SAMPLES);
emilmont 1:9442dff3bfdc 42 printf("snr: %f\n\r", snr);
emilmont 1:9442dff3bfdc 43 if (snr < SNR_THRESHOLD_F32) {
emilmont 1:9442dff3bfdc 44 printf("Failed\n\r");
emilmont 1:9442dff3bfdc 45 } else {
emilmont 1:9442dff3bfdc 46 printf("Success\n\r");
emilmont 1:9442dff3bfdc 47 }
emilmont 1:9442dff3bfdc 48 }