uses armmath has two swithcable filters

Dependencies:   FastAnalogIn mbed-dsp mbed

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?

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