uses armmath has two swithcable filters
Dependencies: FastAnalogIn mbed-dsp mbed
main.cpp@1:d1b05f475265, 2014-04-26 (annotated)
- Committer:
- Clocktop
- Date:
- Sat Apr 26 21:48:04 2014 +0000
- Revision:
- 1:d1b05f475265
- Parent:
- 0:888888c9f065
Final working version
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 | 1:d1b05f475265 | 5 | #define NUM_TAPS 29 |
Clocktop | 1:d1b05f475265 | 6 | #define block_size 32 |
Clocktop | 1:d1b05f475265 | 7 | |
Clocktop | 0:888888c9f065 | 8 | FastAnalogIn audioin(PTC2); //Analog in |
Clocktop | 0:888888c9f065 | 9 | AnalogOut audioout(PTE30); //Analog out |
Clocktop | 0:888888c9f065 | 10 | Ticker sampleing; //ticker is a class that automatically interrupts the processor on an interval |
Clocktop | 0:888888c9f065 | 11 | DigitalOut l(PTA1); |
Clocktop | 0:888888c9f065 | 12 | DigitalOut set1(LED1); |
Clocktop | 0:888888c9f065 | 13 | DigitalOut set2(LED2); |
Clocktop | 0:888888c9f065 | 14 | DigitalIn state(PTA2); |
Clocktop | 1:d1b05f475265 | 15 | |
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 | 1:d1b05f475265 | 19 | int numblocks; |
Clocktop | 1:d1b05f475265 | 20 | int buffer_ready = 0; |
Clocktop | 1:d1b05f475265 | 21 | int samplecounter = 0; |
Clocktop | 1:d1b05f475265 | 22 | int i,k; |
Clocktop | 1:d1b05f475265 | 23 | |
Clocktop | 1:d1b05f475265 | 24 | const int num_samples = 512; //512 max! kmc |
Clocktop | 1:d1b05f475265 | 25 | const int num_buffers = 3; |
Clocktop | 1:d1b05f475265 | 26 | |
Clocktop | 0:888888c9f065 | 27 | float32_t buffer[num_buffers][num_samples]; |
Clocktop | 0:888888c9f065 | 28 | arm_fir_instance_f32 H,L; |
Clocktop | 0:888888c9f065 | 29 | |
Clocktop | 1:d1b05f475265 | 30 | static float32_t firStateF32_L[block_size + NUM_TAPS - 1]; |
Clocktop | 1:d1b05f475265 | 31 | static float32_t firStateF32_H[block_size + NUM_TAPS - 1]; |
Clocktop | 1:d1b05f475265 | 32 | float32_t *inputF32, *outputF32, *processingF32; |
Clocktop | 0:888888c9f065 | 33 | |
Clocktop | 1:d1b05f475265 | 34 | const float32_t firCoeffs32_H[NUM_TAPS] = { |
Clocktop | 1:d1b05f475265 | 35 | .0000574316875202937f, 0.000259433064931947f, 0.000437449344311845f, -0.000166641902553674f, |
Clocktop | 1:d1b05f475265 | 36 | -0.00238511586135069f, -0.00525856044788883f, -0.00452383563647740f, 0.00502173506378964f, |
Clocktop | 1:d1b05f475265 | 37 | 0.0222334773814194f, 0.0330963994141118f, 0.0145265901181610f, -0.0486381603203359f, |
Clocktop | 1:d1b05f475265 | 38 | -0.144905311828843f, -0.234315167629590f, 0.729118629590472f,-0.234315167629590f,-0.144905311828843f, |
Clocktop | 1:d1b05f475265 | 39 | -0.0486381603203359f, 0.0145265901181610f, 0.0330963994141118f, 0.0222334773814194f, |
Clocktop | 1:d1b05f475265 | 40 | 0.00502173506378964f, -0.00452383563647740f, -0.00525856044788883f, -0.00238511586135069f, |
Clocktop | 1:d1b05f475265 | 41 | -0.000166641902553674f, 0.000437449344311845f, 0.000259433064931947f, .0000574316875202937 |
Clocktop | 0:888888c9f065 | 42 | }; |
Clocktop | 0:888888c9f065 | 43 | |
Clocktop | 0:888888c9f065 | 44 | const float32_t firCoeffs32_L[NUM_TAPS] = { |
Clocktop | 1:d1b05f475265 | 45 | 0.000794455095852286f, -0.00145678301449100f, -0.00401267242044256f, -0.00774677450389924f, |
Clocktop | 1:d1b05f475265 | 46 | -0.0115271352127628f, -0.0134875234349854f, -0.0112906732230415f, -0.00273103203148382f, |
Clocktop | 1:d1b05f475265 | 47 | 0.0134991003647579f, 0.0371289350679086f, 0.0659791021599723f, 0.0961528037475044f, |
Clocktop | 1:d1b05f475265 | 48 | 0.122766312185753f, 0.141063665542080f, 0.147583022099822f, 0.141063665542080f, 0.122766312185753f, |
Clocktop | 1:d1b05f475265 | 49 | 0.0961528037475044f, 0.0659791021599723f, 0.0371289350679086f, 0.0134991003647579f, |
Clocktop | 1:d1b05f475265 | 50 | -0.00273103203148382f, -0.0112906732230415f, -0.0134875234349854f, -0.0115271352127628f, |
Clocktop | 1:d1b05f475265 | 51 | -0.00774677450389924f, -0.00401267242044256f, -0.00145678301449100f, 0.000794455095852286 |
Clocktop | 0:888888c9f065 | 52 | }; |
Clocktop | 0:888888c9f065 | 53 | |
Clocktop | 1:d1b05f475265 | 54 | void samplingCallback(){ |
Clocktop | 0:888888c9f065 | 55 | buffer[fill_index][samplecounter] = audioin; |
Clocktop | 0:888888c9f065 | 56 | audioout = buffer[dump_index][samplecounter]; |
Clocktop | 1:d1b05f475265 | 57 | if(++samplecounter>=num_samples){ |
Clocktop | 0:888888c9f065 | 58 | samplecounter = 0; |
Clocktop | 0:888888c9f065 | 59 | ready_index = fill_index; |
Clocktop | 1:d1b05f475265 | 60 | if(++fill_index >= num_buffers){ |
Clocktop | 0:888888c9f065 | 61 | fill_index = 0; |
Clocktop | 0:888888c9f065 | 62 | } |
Clocktop | 1:d1b05f475265 | 63 | if(++dump_index >= num_buffers){ |
Clocktop | 0:888888c9f065 | 64 | dump_index = 0; |
Clocktop | 0:888888c9f065 | 65 | } |
Clocktop | 1:d1b05f475265 | 66 | buffer_ready = 1; |
Clocktop | 0:888888c9f065 | 67 | } |
Clocktop | 0:888888c9f065 | 68 | } |
Clocktop | 1:d1b05f475265 | 69 | |
Clocktop | 1:d1b05f475265 | 70 | void getfilter() |
Clocktop | 1:d1b05f475265 | 71 | { |
Clocktop | 1:d1b05f475265 | 72 | if(state == 1) { |
Clocktop | 1:d1b05f475265 | 73 | for(i=0; i<numblocks; i++) { |
Clocktop | 1:d1b05f475265 | 74 | arm_fir_f32(&H, inputF32+(i*block_size) , outputF32+(i*block_size), block_size); |
Clocktop | 0:888888c9f065 | 75 | } |
Clocktop | 1:d1b05f475265 | 76 | set1 = 1; |
Clocktop | 1:d1b05f475265 | 77 | set2 = 0; |
Clocktop | 1:d1b05f475265 | 78 | } else { |
Clocktop | 1:d1b05f475265 | 79 | for(i=0; i<numblocks; i++) { |
Clocktop | 1:d1b05f475265 | 80 | arm_fir_f32(&L, inputF32+(i*block_size) , outputF32+(i*block_size), block_size); |
Clocktop | 0:888888c9f065 | 81 | } |
Clocktop | 1:d1b05f475265 | 82 | set1 = 0; |
Clocktop | 1:d1b05f475265 | 83 | set2 = 1; |
Clocktop | 1:d1b05f475265 | 84 | } |
Clocktop | 1:d1b05f475265 | 85 | buffer_ready = 0; |
Clocktop | 1:d1b05f475265 | 86 | } |
Clocktop | 0:888888c9f065 | 87 | |
Clocktop | 1:d1b05f475265 | 88 | void samplingBegin(){ |
Clocktop | 1:d1b05f475265 | 89 | numblocks = num_samples/block_size; |
Clocktop | 0:888888c9f065 | 90 | samplecounter = 0; |
Clocktop | 0:888888c9f065 | 91 | sampleing.attach_us(&samplingCallback, 125); //sample rate 40k 25, 45k 22, 50k,20 |
Clocktop | 0:888888c9f065 | 92 | } |
Clocktop | 0:888888c9f065 | 93 | |
Clocktop | 1:d1b05f475265 | 94 | int samplingisdone(){ |
Clocktop | 1:d1b05f475265 | 95 | return buffer_ready; |
Clocktop | 0:888888c9f065 | 96 | } |
Clocktop | 0:888888c9f065 | 97 | |
Clocktop | 1:d1b05f475265 | 98 | void zerobuffers(){ |
Clocktop | 0:888888c9f065 | 99 | for(i=0; i<=num_buffers; i++) { |
Clocktop | 0:888888c9f065 | 100 | for(k=0; k<num_samples; k++) { |
Clocktop | 0:888888c9f065 | 101 | buffer[i][k] = 0.0; |
Clocktop | 0:888888c9f065 | 102 | } |
Clocktop | 0:888888c9f065 | 103 | } |
Clocktop | 0:888888c9f065 | 104 | } |
Clocktop | 0:888888c9f065 | 105 | |
Clocktop | 1:d1b05f475265 | 106 | int main(){ |
Clocktop | 1:d1b05f475265 | 107 | arm_fir_init_f32(&H, NUM_TAPS, (float32_t *)&firCoeffs32_H[0], &firStateF32_H[0], block_size); |
Clocktop | 1:d1b05f475265 | 108 | arm_fir_init_f32(&L, NUM_TAPS, (float32_t *)&firCoeffs32_L[0], &firStateF32_L[0], block_size); |
Clocktop | 1:d1b05f475265 | 109 | ///zerobuffers(); |
Clocktop | 0:888888c9f065 | 110 | samplingBegin(); |
Clocktop | 1:d1b05f475265 | 111 | while(1){ |
Clocktop | 1:d1b05f475265 | 112 | if(samplingisdone()==1){ |
Clocktop | 0:888888c9f065 | 113 | l = 1; |
Clocktop | 0:888888c9f065 | 114 | inputF32 = &buffer[ready_index][0]; |
Clocktop | 0:888888c9f065 | 115 | outputF32 = &buffer[dump_index][0]; |
Clocktop | 0:888888c9f065 | 116 | getfilter(); |
Clocktop | 1:d1b05f475265 | 117 | l = 0; |
Clocktop | 0:888888c9f065 | 118 | } |
Clocktop | 0:888888c9f065 | 119 | } |
Clocktop | 1:d1b05f475265 | 120 | } |