Example FIR filter using the draft mbed DSP API

Dependencies:   mbed mbed-dsp

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");
    }
}