Example FIR filter using the draft mbed DSP API

Dependencies:   mbed mbed-dsp

Committer:
emilmont
Date:
Mon Mar 12 12:04:27 2012 +0000
Revision:
2:697afbb006f5
Parent:
1:0814c87942ca
Child:
3:15d0df9ab05b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 2:697afbb006f5 1 #include "mbed.h"
emilmont 2:697afbb006f5 2 #include "dsp.h"
emilmont 2:697afbb006f5 3
emilmont 2:697afbb006f5 4 #define BLOCK_SIZE (32)
emilmont 2:697afbb006f5 5 #define NUM_BLOCKS (10)
emilmont 2:697afbb006f5 6 #define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS)
emilmont 2:697afbb006f5 7
emilmont 2:697afbb006f5 8 #define SAMPLE_RATE (48000)
emilmont 2:697afbb006f5 9
emilmont 2:697afbb006f5 10 #define SNR_THRESHOLD_F32 (50.0f)
emilmont 2:697afbb006f5 11
emilmont 2:697afbb006f5 12 float32_t expected_output[TEST_LENGTH_SAMPLES];
emilmont 2:697afbb006f5 13 float32_t signal[TEST_LENGTH_SAMPLES];
emilmont 2:697afbb006f5 14
emilmont 2:697afbb006f5 15 /* FIR Coefficients buffer generated using fir1() MATLAB function: fir1(28, 6/24) */
emilmont 2:697afbb006f5 16 #define NUM_TAPS 29
emilmont 2:697afbb006f5 17 const float32_t fir_coeff[NUM_TAPS] = {
emilmont 2:697afbb006f5 18 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f,
emilmont 2:697afbb006f5 19 +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f,
emilmont 2:697afbb006f5 20 +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f,
emilmont 2:697afbb006f5 21 +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f,
emilmont 2:697afbb006f5 22 -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f,
emilmont 2:697afbb006f5 23 +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
emilmont 2:697afbb006f5 24 };
emilmont 2:697afbb006f5 25 #define WARMUP (NUM_TAPS-1)
emilmont 2:697afbb006f5 26 #define DELAY (WARMUP/2)
emilmont 2:697afbb006f5 27
emilmont 2:697afbb006f5 28 int main() {
emilmont 2:697afbb006f5 29 Sine_f32 sine_1K( 1000, SAMPLE_RATE, 1.0);
emilmont 2:697afbb006f5 30 Sine_f32 sine_15K(15000, SAMPLE_RATE, 0.5);
emilmont 2:697afbb006f5 31 FIR_f32<NUM_TAPS> fir(fir_coeff);
emilmont 2:697afbb006f5 32
emilmont 2:697afbb006f5 33 for (int i=0; i<NUM_BLOCKS; i++) {
emilmont 2:697afbb006f5 34 float32_t *signal_buffer = signal + i*BLOCK_SIZE;
emilmont 2:697afbb006f5 35 sine_1K.process(signal_buffer);
emilmont 2:697afbb006f5 36 sine_15K.process(signal_buffer);
emilmont 2:697afbb006f5 37 fir.process(signal_buffer);
emilmont 2:697afbb006f5 38 }
emilmont 2:697afbb006f5 39
emilmont 2:697afbb006f5 40 sine_1K.reset();
emilmont 2:697afbb006f5 41 for (int i=0; i<NUM_BLOCKS; i++) {
emilmont 2:697afbb006f5 42 float32_t *signal_buffer = expected_output + i*BLOCK_SIZE;
emilmont 2:697afbb006f5 43 sine_1K.process(signal_buffer);
emilmont 2:697afbb006f5 44 }
emilmont 2:697afbb006f5 45
emilmont 2:697afbb006f5 46 float snr = arm_snr_f32(&expected_output[DELAY-1], &signal[WARMUP-1], TEST_LENGTH_SAMPLES-WARMUP);
emilmont 2:697afbb006f5 47 printf("snr: %f\n\r", snr);
emilmont 2:697afbb006f5 48 if (snr < SNR_THRESHOLD_F32) {
emilmont 2:697afbb006f5 49 printf("Failed\n\r");
emilmont 2:697afbb006f5 50 } else {
emilmont 2:697afbb006f5 51 printf("Success\n\r");
emilmont 2:697afbb006f5 52 }
emilmont 2:697afbb006f5 53 }