uses armmath has two swithcable filters
Dependencies: FastAnalogIn mbed-dsp mbed
main.cpp@0:888888c9f065, 2014-04-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |