Emilio Monti
/
cmsis_dsp_fir
Example FIR filter using the CMSIS DSP API
main.cpp@2:9ccaf6885ced, 2013-01-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |