Emilio Monti
/
dsp_fir
Example FIR filter using the draft mbed DSP API
main.cpp@4:82ad711603c2, 2013-01-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |