Example FIR filter using the draft mbed DSP API

Dependencies:   mbed mbed-dsp

Committer:
emilmont
Date:
Tue Jan 08 16:54:33 2013 +0000
Revision:
4:82ad711603c2
Parent:
3:15d0df9ab05b
Update example to latest mbed-dsp library

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 4:82ad711603c2 13 float32_t output[TEST_LENGTH_SAMPLES];
emilmont 2:697afbb006f5 14
emilmont 4:82ad711603c2 15 /* FIR Coefficients buffer generated using fir1() MATLAB function: fir1(28, 6/24) */
emilmont 2:697afbb006f5 16 #define NUM_TAPS 29
emilmont 4:82ad711603c2 17 const float32_t firCoeffs32[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 4:82ad711603c2 29 Sine_f32 sine_1KHz( 1000, SAMPLE_RATE, 1.0);
emilmont 4:82ad711603c2 30 Sine_f32 sine_15KHz(15000, SAMPLE_RATE, 0.5);
emilmont 4:82ad711603c2 31 FIR_f32<NUM_TAPS> fir(firCoeffs32);
emilmont 2:697afbb006f5 32
emilmont 4:82ad711603c2 33 float32_t buffer_a[BLOCK_SIZE];
emilmont 4:82ad711603c2 34 float32_t buffer_b[BLOCK_SIZE];
emilmont 4:82ad711603c2 35 for (float32_t *sgn=output; sgn<(output+TEST_LENGTH_SAMPLES); sgn += BLOCK_SIZE) {
emilmont 4:82ad711603c2 36 sine_1KHz.generate(buffer_a); // Generate a 1KHz sine wave
emilmont 4:82ad711603c2 37 sine_15KHz.process(buffer_a, buffer_b); // Add a 15KHz sine wave
emilmont 4:82ad711603c2 38 fir.process(buffer_b, sgn); // FIR low pass filter: 6KHz cutoff
emilmont 2:697afbb006f5 39 }
emilmont 2:697afbb006f5 40
emilmont 4:82ad711603c2 41 sine_1KHz.reset();
emilmont 4:82ad711603c2 42 for (float32_t *sgn=expected_output; sgn<(expected_output+TEST_LENGTH_SAMPLES); sgn += BLOCK_SIZE) {
emilmont 4:82ad711603c2 43 sine_1KHz.generate(sgn); // Generate a 1KHz sine wave
emilmont 2:697afbb006f5 44 }
emilmont 2:697afbb006f5 45
emilmont 4:82ad711603c2 46 float snr = arm_snr_f32(&expected_output[DELAY-1], &output[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 }