Emilio Monti
/
dsp_fir
Example FIR filter using the draft mbed DSP API
main.cpp
- Committer:
- emilmont
- Date:
- 2012-03-12
- Revision:
- 0:9ab177799489
- Child:
- 1:0814c87942ca
File content as of revision 0:9ab177799489:
#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"); } }