summaryrefslogtreecommitdiff
path: root/tool/mbed/mbed-sdk/libraries/tests/dsp/cmsis/fir_f32/main.cpp
blob: f6bdb4b7ce19f9e0220c93e2d774bf65e922b15b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "arm_math.h"
#include "math_helper.h"
#include <stdio.h>

#define BLOCK_SIZE          32
#define NUM_BLOCKS          10

#define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS)

#define SNR_THRESHOLD_F32   140.0f
#define NUM_TAPS            29

/* -------------------------------------------------------------------
 * The input signal and reference output (computed with MATLAB)
 * are defined externally in arm_fir_lpf_data.c.
 * ------------------------------------------------------------------- */
extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES];
extern float32_t refOutput[TEST_LENGTH_SAMPLES];

/* -------------------------------------------------------------------
 * Declare State buffer of size (numTaps + blockSize - 1)
 * ------------------------------------------------------------------- */
static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];

/* ----------------------------------------------------------------------
 * FIR Coefficients buffer generated using fir1() MATLAB function.
 * fir1(28, 6/24)
 * ------------------------------------------------------------------- */
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
};

/* ----------------------------------------------------------------------
 * FIR LPF Example
 * ------------------------------------------------------------------- */
int main(void) {
    /* Call FIR init function to initialize the instance structure. */
    arm_fir_instance_f32 S;
    arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], BLOCK_SIZE);

    /* ----------------------------------------------------------------------
     * Call the FIR process function for every blockSize samples
     * ------------------------------------------------------------------- */
    for (uint32_t i=0; i < NUM_BLOCKS; i++) {
        float32_t* signal =  testInput_f32_1kHz_15kHz + (i * BLOCK_SIZE);
        arm_fir_f32(&S, signal, signal, BLOCK_SIZE);
    }

    /* ----------------------------------------------------------------------
     * Compare the generated output against the reference output computed
     * in MATLAB.
     * ------------------------------------------------------------------- */
    float32_t snr = arm_snr_f32(refOutput, testInput_f32_1kHz_15kHz, TEST_LENGTH_SAMPLES);
    printf("snr: %f\n\r", snr);
    if (snr < SNR_THRESHOLD_F32) {
        printf("Failed\n\r");
    } else {
        printf("Success\n\r");
    }
}