Ura

Dependencies:   CMSIS_DSP_401 mbed

Committer:
Sergeev
Date:
Tue Sep 30 16:13:41 2014 +0000
Revision:
0:b712470aea1d
Child:
1:9b1df0b2507d
Ura

Who changed what in which revision?

UserRevisionLine numberNew 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 }