uses armmath has two swithcable filters

Dependencies:   FastAnalogIn mbed-dsp mbed

Committer:
Clocktop
Date:
Wed Apr 23 18:23:58 2014 +0000
Revision:
0:888888c9f065
Child:
1:d1b05f475265
arm_math dual filters

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clocktop 0:888888c9f065 1 #include "mbed.h"
Clocktop 0:888888c9f065 2 #include <ctype.h>
Clocktop 0:888888c9f065 3 #include "FastAnalogIn.h"
Clocktop 0:888888c9f065 4 #include "arm_math.h"
Clocktop 0:888888c9f065 5 #define NUM_TAPS 51
Clocktop 0:888888c9f065 6 FastAnalogIn audioin(PTC2); //Analog in
Clocktop 0:888888c9f065 7 AnalogOut audioout(PTE30); //Analog out
Clocktop 0:888888c9f065 8 Ticker sampleing; //ticker is a class that automatically interrupts the processor on an interval
Clocktop 0:888888c9f065 9 DigitalOut l(PTA1);
Clocktop 0:888888c9f065 10 DigitalOut set1(LED1);
Clocktop 0:888888c9f065 11 DigitalOut set2(LED2);
Clocktop 0:888888c9f065 12 DigitalIn state(PTA2);
Clocktop 0:888888c9f065 13 const int num_samples = 512; //512 max! kmc
Clocktop 0:888888c9f065 14 const int num_buffers = 3;
Clocktop 0:888888c9f065 15 int samplecounter = 0;
Clocktop 0:888888c9f065 16 int fill_index = 0;
Clocktop 0:888888c9f065 17 int dump_index = 1;
Clocktop 0:888888c9f065 18 int ready_index =2;
Clocktop 0:888888c9f065 19 float32_t buffer[num_buffers][num_samples];
Clocktop 0:888888c9f065 20 arm_fir_instance_f32 H,L;
Clocktop 0:888888c9f065 21
Clocktop 0:888888c9f065 22 static float32_t firStateF32[1 + NUM_TAPS - 1];
Clocktop 0:888888c9f065 23 float32_t *inputF32, *outputF32;
Clocktop 0:888888c9f065 24 /* ----------------------------------------------------------------------
Clocktop 0:888888c9f065 25 ** FIR Coefficients buffer generated using fir1() MATLAB function.
Clocktop 0:888888c9f065 26 ** fir1(28, 6/24)
Clocktop 0:888888c9f065 27 ** ------------------------------------------------------------------- */
Clocktop 0:888888c9f065 28
Clocktop 0:888888c9f065 29 const float32_t firCoeffs32_H[NUM_TAPS] = {
Clocktop 0:888888c9f065 30 -0.0000080878311f, 0.00003923656432f, -0.000061039638221f, -0.00003695668356985f, 0.000275668560418687f, -0.000327280297262495f,
Clocktop 0:888888c9f065 31 -0.000260129744371785f, 0.00116157181055702f, -0.000923953609936865f, -0.00133518222306195f, 0.00349543690781629f,
Clocktop 0:888888c9f065 32 -0.00150896657945131f, -0.00479968490025620f, 0.00809627752995577f, -0.000496933275084586f, -0.0132944668070009f, 0.0150641815132129f,
Clocktop 0:888888c9f065 33 0.00598396310662075f, -0.0310875990306542f, 0.0231130218762105f, 0.0273325707514090f, -0.0702585024688767f, 0.0297114875214292f,
Clocktop 0:888888c9f065 34 0.115565099312860f, -0.288244540649423f, 0.365609759681161f, -0.288244540649423f, 0.115565099312860f, 0.0297114875214292f,
Clocktop 0:888888c9f065 35 -0.0702585024688767f, 0.0273325707514090f, 0.0231130218762105f, -0.0310875990306542f, 0.00598396310662075f, 0.0150641815132129f,
Clocktop 0:888888c9f065 36 -0.0132944668070009f, -0.000496933275084586f, 0.00809627752995577f, -0.00479968490025620f, -0.00150896657945131f, 0.00349543690781629f,
Clocktop 0:888888c9f065 37 -0.00133518222306195f, -0.000923953609936865f, 0.00116157181055702f, -0.000260129744371785f, -0.000327280297262495f,
Clocktop 0:888888c9f065 38 0.000275668560418687f, -0.0000369566835698504f, -0.00006103963822183f, 0.0000392365643258656f, -0.00000808783111344f
Clocktop 0:888888c9f065 39 };
Clocktop 0:888888c9f065 40
Clocktop 0:888888c9f065 41 const float32_t firCoeffs32_L[NUM_TAPS] = {
Clocktop 0:888888c9f065 42 -0.000471676005294967f, -0.000869941110733902f, -0.00136615751059969f, -0.00192713332921617f, -0.00249683488334566f,
Clocktop 0:888888c9f065 43 -0.00299588766189560f, -0.00332345379822847f, -0.00336168772922327f, -0.00298271993668161f, -0.00205784383868562f,
Clocktop 0:888888c9f065 44 -0.000468311685565155f, 0.00188308797184820f, 0.00506066745872936f, 0.00908576885361775f, 0.0139290391946988f, 0.0195059759543063f,
Clocktop 0:888888c9f065 45 0.0256764342311968f, 0.0322484706002718f, 0.0389865257052826f, 0.0456235534497802f, 0.0518763277757713f, 0.0574628369693583f,
Clocktop 0:888888c9f065 46 0.0621204442047146f, 0.0656233774164507f, 0.0677981261749183f, 0.0685354696461944f, 0.0677981261749183f, 0.0656233774164507f,
Clocktop 0:888888c9f065 47 0.0621204442047146f, 0.0574628369693583f, 0.0518763277757713f, 0.0456235534497802f, 0.0389865257052826f, 0.0322484706002718f,
Clocktop 0:888888c9f065 48 0.0256764342311968f, 0.0195059759543063f, 0.0139290391946988f, 0.00908576885361775f, 0.00506066745872936f, 0.00188308797184820f,
Clocktop 0:888888c9f065 49 -0.000468311685565155f, -0.00205784383868562f, -0.00298271993668161f, -0.00336168772922327f, -0.00332345379822847f,
Clocktop 0:888888c9f065 50 -0.00299588766189560f, -0.00249683488334566f, -0.00192713332921617f, -0.00136615751059969f, -0.00086994111073390f,
Clocktop 0:888888c9f065 51 -0.000471676005294967f
Clocktop 0:888888c9f065 52
Clocktop 0:888888c9f065 53 };
Clocktop 0:888888c9f065 54
Clocktop 0:888888c9f065 55
Clocktop 0:888888c9f065 56
Clocktop 0:888888c9f065 57 int i,k;
Clocktop 0:888888c9f065 58
Clocktop 0:888888c9f065 59 void samplingCallback()
Clocktop 0:888888c9f065 60 {
Clocktop 0:888888c9f065 61 //e = not(e);
Clocktop 0:888888c9f065 62 buffer[fill_index][samplecounter] = audioin;
Clocktop 0:888888c9f065 63 audioout = buffer[dump_index][samplecounter];
Clocktop 0:888888c9f065 64 samplecounter++;
Clocktop 0:888888c9f065 65 if(samplecounter >= 511) {
Clocktop 0:888888c9f065 66 samplecounter = 0;
Clocktop 0:888888c9f065 67 //l= not(l);
Clocktop 0:888888c9f065 68 ready_index = fill_index;
Clocktop 0:888888c9f065 69 if(++fill_index >= num_buffers) {
Clocktop 0:888888c9f065 70 fill_index = 0;
Clocktop 0:888888c9f065 71 }
Clocktop 0:888888c9f065 72 if(++dump_index >= num_buffers) {
Clocktop 0:888888c9f065 73 dump_index = 0;
Clocktop 0:888888c9f065 74 }
Clocktop 0:888888c9f065 75 }
Clocktop 0:888888c9f065 76
Clocktop 0:888888c9f065 77 }
Clocktop 0:888888c9f065 78 void getfilter(){
Clocktop 0:888888c9f065 79 if(state == 1){
Clocktop 0:888888c9f065 80 arm_fir_f32(&H, inputF32 , outputF32, 1);
Clocktop 0:888888c9f065 81 set1 = 1;
Clocktop 0:888888c9f065 82 set2 = 0;
Clocktop 0:888888c9f065 83 }
Clocktop 0:888888c9f065 84 else{
Clocktop 0:888888c9f065 85 arm_fir_f32(&L, inputF32 , outputF32, 1);
Clocktop 0:888888c9f065 86 set1 = 0;
Clocktop 0:888888c9f065 87 set2 = 1;
Clocktop 0:888888c9f065 88 }
Clocktop 0:888888c9f065 89 }
Clocktop 0:888888c9f065 90
Clocktop 0:888888c9f065 91
Clocktop 0:888888c9f065 92 void samplingBegin()
Clocktop 0:888888c9f065 93 {
Clocktop 0:888888c9f065 94 //ticker_timing = 100000/sample_rate;
Clocktop 0:888888c9f065 95 samplecounter = 0;
Clocktop 0:888888c9f065 96 sampleing.attach_us(&samplingCallback, 125); //sample rate 40k 25, 45k 22, 50k,20
Clocktop 0:888888c9f065 97 }
Clocktop 0:888888c9f065 98
Clocktop 0:888888c9f065 99 bool samplingisdone()
Clocktop 0:888888c9f065 100 {
Clocktop 0:888888c9f065 101 //c = not(c);
Clocktop 0:888888c9f065 102 return samplecounter >= 510;
Clocktop 0:888888c9f065 103 }
Clocktop 0:888888c9f065 104
Clocktop 0:888888c9f065 105 ////////////////////////////////////////////////////////////////////
Clocktop 0:888888c9f065 106 // Buffer Zeroing
Clocktop 0:888888c9f065 107 ////////////////////////////////////////////////////////////////////
Clocktop 0:888888c9f065 108 void zerobuffers()
Clocktop 0:888888c9f065 109 {
Clocktop 0:888888c9f065 110 for(i=0; i<=num_buffers; i++) {
Clocktop 0:888888c9f065 111 for(k=0; k<num_samples; k++) {
Clocktop 0:888888c9f065 112 buffer[i][k] = 0.0;
Clocktop 0:888888c9f065 113 }
Clocktop 0:888888c9f065 114 }
Clocktop 0:888888c9f065 115 }
Clocktop 0:888888c9f065 116
Clocktop 0:888888c9f065 117
Clocktop 0:888888c9f065 118 int main()
Clocktop 0:888888c9f065 119 {
Clocktop 0:888888c9f065 120
Clocktop 0:888888c9f065 121
Clocktop 0:888888c9f065 122
Clocktop 0:888888c9f065 123 //getfilter();
Clocktop 0:888888c9f065 124 samplingBegin();
Clocktop 0:888888c9f065 125 //button.rise(&getfilter);
Clocktop 0:888888c9f065 126 //getfilter();
Clocktop 0:888888c9f065 127 arm_fir_init_f32(&H, NUM_TAPS, (float32_t *)&firCoeffs32_H[0], &firStateF32[0], 1);
Clocktop 0:888888c9f065 128 arm_fir_init_f32(&L, NUM_TAPS, (float32_t *)&firCoeffs32_L[0], &firStateF32[0], 1);
Clocktop 0:888888c9f065 129 while(1) {
Clocktop 0:888888c9f065 130 if(samplingisdone()) {
Clocktop 0:888888c9f065 131 l = 1;
Clocktop 0:888888c9f065 132 inputF32 = &buffer[ready_index][0];
Clocktop 0:888888c9f065 133 outputF32 = &buffer[dump_index][0];
Clocktop 0:888888c9f065 134 getfilter();
Clocktop 0:888888c9f065 135
Clocktop 0:888888c9f065 136 l=0 ;
Clocktop 0:888888c9f065 137 }
Clocktop 0:888888c9f065 138 }
Clocktop 0:888888c9f065 139 }