Example FIR filter using the draft mbed DSP API

Dependencies:   mbed mbed-dsp

Files at this revision

API Documentation at this revision

Comitter:
emilmont
Date:
Mon Mar 12 11:37:31 2012 +0000
Child:
1:0814c87942ca
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
mbed_dsp.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Mar 12 11:37:31 2012 +0000
@@ -0,0 +1,53 @@
+#include "mbed.h"
+#include "dsp.h"
+
+#define BLOCK_SIZE              (32)
+#define NUM_BLOCKS              (10)
+#define TEST_LENGTH_SAMPLES     (BLOCK_SIZE * NUM_BLOCKS)
+
+#define SAMPLE_RATE             (48000)
+
+#define SNR_THRESHOLD_F32       (50.0f)
+
+float32_t expected_output[TEST_LENGTH_SAMPLES];
+float32_t          output[TEST_LENGTH_SAMPLES]; 
+
+/* FIR Coefficients buffer generated using fir1() MATLAB function: fir1(28, 6/24) */
+#define NUM_TAPS            29
+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
+};
+#define WARMUP    (NUM_TAPS-1)
+#define DELAY     (WARMUP/2)
+
+int main() {
+    Sine_f32 sine_1K(  1000, SAMPLE_RATE, 1.0);
+    Sine_f32 sine_15K(15000, SAMPLE_RATE, 0.5);
+    FIR_f32<NUM_TAPS> fir(firCoeffs32);
+    
+    for (int i=0; i<NUM_BLOCKS; i++) {
+        float32_t *signal = output + i*BLOCK_SIZE;
+        sine_1K.process(signal);
+        sine_15K.process(signal);
+        fir.process(signal);
+    }
+    
+    sine_1K.reset();
+    for (int i=0; i<NUM_BLOCKS; i++) {
+        float32_t *signal = expected_output + i*BLOCK_SIZE;
+        sine_1K.process(signal);
+    }
+    
+    float snr = arm_snr_f32(&expected_output[DELAY-1], &output[WARMUP-1], TEST_LENGTH_SAMPLES-WARMUP);
+    printf("snr: %f\n\r", snr);
+    if (snr < SNR_THRESHOLD_F32) {
+        printf("Failed\n\r");
+    } else {
+        printf("Success\n\r");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Mar 12 11:37:31 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/737756e0b479
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_dsp.lib	Mon Mar 12 11:37:31 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/emilmont/code/mbed_dsp/#7e3eedc2a9fa