огшор
Dependencies: CMSIS_DSP_401 mbed
Fork of fir_f32 by
main.cpp@0:b712470aea1d, 2014-09-30 (annotated)
- Committer:
- Sergeev
- Date:
- Tue Sep 30 16:13:41 2014 +0000
- Revision:
- 0:b712470aea1d
- Child:
- 1:9b1df0b2507d
Ura
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sergeev | 0:b712470aea1d | 1 | #include "mbed.h" |
Sergeev | 0:b712470aea1d | 2 | #include "arm_math.h" |
Sergeev | 0:b712470aea1d | 3 | #include "math_helper.h" |
Sergeev | 0:b712470aea1d | 4 | #include <stdio.h> |
Sergeev | 0:b712470aea1d | 5 | |
Sergeev | 0:b712470aea1d | 6 | |
Sergeev | 0:b712470aea1d | 7 | #define BLOCK_SIZE 32 |
Sergeev | 0:b712470aea1d | 8 | #define NUM_BLOCKS 10 |
Sergeev | 0:b712470aea1d | 9 | #define TEST_LENGTH_SAMPLES (BLOCK_SIZE * NUM_BLOCKS) |
Sergeev | 0:b712470aea1d | 10 | #define TEST_LENGTH_SAMPLES 312 |
Sergeev | 0:b712470aea1d | 11 | #define SNR_THRESHOLD_F32 140.0f |
Sergeev | 0:b712470aea1d | 12 | #define NUM_TAPS 29 |
Sergeev | 0:b712470aea1d | 13 | |
Sergeev | 0:b712470aea1d | 14 | Serial pc(SERIAL_TX, SERIAL_RX); |
Sergeev | 0:b712470aea1d | 15 | |
Sergeev | 0:b712470aea1d | 16 | /* ------------------------------------------------------------------- |
Sergeev | 0:b712470aea1d | 17 | * The input signal and reference output (computed with MATLAB) |
Sergeev | 0:b712470aea1d | 18 | * are defined externally in arm_fir_lpf_data.c. |
Sergeev | 0:b712470aea1d | 19 | * ------------------------------------------------------------------- */ |
Sergeev | 0:b712470aea1d | 20 | |
Sergeev | 0:b712470aea1d | 21 | extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES]; |
Sergeev | 0:b712470aea1d | 22 | extern float32_t refOutput[TEST_LENGTH_SAMPLES]; |
Sergeev | 0:b712470aea1d | 23 | |
Sergeev | 0:b712470aea1d | 24 | /* ------------------------------------------------------------------- |
Sergeev | 0:b712470aea1d | 25 | * Declare State buffer of size (numTaps + blockSize - 1) |
Sergeev | 0:b712470aea1d | 26 | * ------------------------------------------------------------------- */ |
Sergeev | 0:b712470aea1d | 27 | |
Sergeev | 0:b712470aea1d | 28 | static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; |
Sergeev | 0:b712470aea1d | 29 | |
Sergeev | 0:b712470aea1d | 30 | /* ---------------------------------------------------------------------- |
Sergeev | 0:b712470aea1d | 31 | * FIR Coefficients buffer generated using fir1() MATLAB function. |
Sergeev | 0:b712470aea1d | 32 | * fir1(28, 6/24) |
Sergeev | 0:b712470aea1d | 33 | * ------------------------------------------------------------------- */ |
Sergeev | 0:b712470aea1d | 34 | |
Sergeev | 0:b712470aea1d | 35 | const float32_t firCoeffs32[NUM_TAPS] = { |
Sergeev | 0:b712470aea1d | 36 | -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, |
Sergeev | 0:b712470aea1d | 37 | +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f, |
Sergeev | 0:b712470aea1d | 38 | +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, |
Sergeev | 0:b712470aea1d | 39 | +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, |
Sergeev | 0:b712470aea1d | 40 | -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f, |
Sergeev | 0:b712470aea1d | 41 | +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f |
Sergeev | 0:b712470aea1d | 42 | }; |
Sergeev | 0:b712470aea1d | 43 | /* ---------------------------------------------------------------------- |
Sergeev | 0:b712470aea1d | 44 | * FIR LPF Example |
Sergeev | 0:b712470aea1d | 45 | * ------------------------------------------------------------------- */ |
Sergeev | 0:b712470aea1d | 46 | int main(void) { |
Sergeev | 0:b712470aea1d | 47 | /* Call FIR init function to initialize the instance structure. */ |
Sergeev | 0:b712470aea1d | 48 | arm_fir_instance_f32 S; |
Sergeev | 0:b712470aea1d | 49 | arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], BLOCK_SIZE); |
Sergeev | 0:b712470aea1d | 50 | /* ---------------------------------------------------------------------- |
Sergeev | 0:b712470aea1d | 51 | * Call the FIR process function for every blockSize samples |
Sergeev | 0:b712470aea1d | 52 | * ------------------------------------------------------------------- */ |
Sergeev | 0:b712470aea1d | 53 | for (uint32_t i=0; i < NUM_BLOCKS; i++) { |
Sergeev | 0:b712470aea1d | 54 | float32_t* signal = testInput_f32_1kHz_15kHz + (i * BLOCK_SIZE); |
Sergeev | 0:b712470aea1d | 55 | arm_fir_f32(&S, signal, signal, BLOCK_SIZE); |
Sergeev | 0:b712470aea1d | 56 | } |
Sergeev | 0:b712470aea1d | 57 | /* ---------------------------------------------------------------------- |
Sergeev | 0:b712470aea1d | 58 | * Compare the generated output against the reference output computed |
Sergeev | 0:b712470aea1d | 59 | * in MATLAB. |
Sergeev | 0:b712470aea1d | 60 | * ------------------------------------------------------------------- */ |
Sergeev | 0:b712470aea1d | 61 | //float32_t snr = arm_snr_f32((float*)refOutput, (float*)testInput_f32_1kHz_15kHz, (unsigned)TEST_LENGTH_SAMPLES); |
Sergeev | 0:b712470aea1d | 62 | |
Sergeev | 0:b712470aea1d | 63 | float32_t snr; |
Sergeev | 0:b712470aea1d | 64 | unsigned int b; |
Sergeev | 0:b712470aea1d | 65 | arm_max_f32( testInput_f32_1kHz_15kHz,TEST_LENGTH_SAMPLES, &snr, &b); |
Sergeev | 0:b712470aea1d | 66 | |
Sergeev | 0:b712470aea1d | 67 | |
Sergeev | 0:b712470aea1d | 68 | pc.printf("snr: %f\n\r", snr); |
Sergeev | 0:b712470aea1d | 69 | while(1) |
Sergeev | 0:b712470aea1d | 70 | { |
Sergeev | 0:b712470aea1d | 71 | if (snr < SNR_THRESHOLD_F32) { |
Sergeev | 0:b712470aea1d | 72 | pc.printf("Failed\n\r"); |
Sergeev | 0:b712470aea1d | 73 | pc.printf("snr: %f\n\r", snr); |
Sergeev | 0:b712470aea1d | 74 | } else { |
Sergeev | 0:b712470aea1d | 75 | pc.printf("Success\n\r"); |
Sergeev | 0:b712470aea1d | 76 | pc.printf("snr: %f\n\r", snr); |
Sergeev | 0:b712470aea1d | 77 | } |
Sergeev | 0:b712470aea1d | 78 | } |
Sergeev | 0:b712470aea1d | 79 | |
Sergeev | 0:b712470aea1d | 80 | |
Sergeev | 0:b712470aea1d | 81 | } |