uses armmath has two swithcable filters
Dependencies: FastAnalogIn mbed-dsp mbed
main.cpp
- Committer:
- Clocktop
- Date:
- 2014-04-26
- Revision:
- 1:d1b05f475265
- Parent:
- 0:888888c9f065
File content as of revision 1:d1b05f475265:
#include "mbed.h" #include <ctype.h> #include "FastAnalogIn.h" #include "arm_math.h" #define NUM_TAPS 29 #define block_size 32 FastAnalogIn audioin(PTC2); //Analog in AnalogOut audioout(PTE30); //Analog out Ticker sampleing; //ticker is a class that automatically interrupts the processor on an interval DigitalOut l(PTA1); DigitalOut set1(LED1); DigitalOut set2(LED2); DigitalIn state(PTA2); int fill_index = 0; int dump_index = 1; int ready_index =2; int numblocks; int buffer_ready = 0; int samplecounter = 0; int i,k; const int num_samples = 512; //512 max! kmc const int num_buffers = 3; float32_t buffer[num_buffers][num_samples]; arm_fir_instance_f32 H,L; static float32_t firStateF32_L[block_size + NUM_TAPS - 1]; static float32_t firStateF32_H[block_size + NUM_TAPS - 1]; float32_t *inputF32, *outputF32, *processingF32; const float32_t firCoeffs32_H[NUM_TAPS] = { .0000574316875202937f, 0.000259433064931947f, 0.000437449344311845f, -0.000166641902553674f, -0.00238511586135069f, -0.00525856044788883f, -0.00452383563647740f, 0.00502173506378964f, 0.0222334773814194f, 0.0330963994141118f, 0.0145265901181610f, -0.0486381603203359f, -0.144905311828843f, -0.234315167629590f, 0.729118629590472f,-0.234315167629590f,-0.144905311828843f, -0.0486381603203359f, 0.0145265901181610f, 0.0330963994141118f, 0.0222334773814194f, 0.00502173506378964f, -0.00452383563647740f, -0.00525856044788883f, -0.00238511586135069f, -0.000166641902553674f, 0.000437449344311845f, 0.000259433064931947f, .0000574316875202937 }; const float32_t firCoeffs32_L[NUM_TAPS] = { 0.000794455095852286f, -0.00145678301449100f, -0.00401267242044256f, -0.00774677450389924f, -0.0115271352127628f, -0.0134875234349854f, -0.0112906732230415f, -0.00273103203148382f, 0.0134991003647579f, 0.0371289350679086f, 0.0659791021599723f, 0.0961528037475044f, 0.122766312185753f, 0.141063665542080f, 0.147583022099822f, 0.141063665542080f, 0.122766312185753f, 0.0961528037475044f, 0.0659791021599723f, 0.0371289350679086f, 0.0134991003647579f, -0.00273103203148382f, -0.0112906732230415f, -0.0134875234349854f, -0.0115271352127628f, -0.00774677450389924f, -0.00401267242044256f, -0.00145678301449100f, 0.000794455095852286 }; void samplingCallback(){ buffer[fill_index][samplecounter] = audioin; audioout = buffer[dump_index][samplecounter]; if(++samplecounter>=num_samples){ samplecounter = 0; ready_index = fill_index; if(++fill_index >= num_buffers){ fill_index = 0; } if(++dump_index >= num_buffers){ dump_index = 0; } buffer_ready = 1; } } void getfilter() { if(state == 1) { for(i=0; i<numblocks; i++) { arm_fir_f32(&H, inputF32+(i*block_size) , outputF32+(i*block_size), block_size); } set1 = 1; set2 = 0; } else { for(i=0; i<numblocks; i++) { arm_fir_f32(&L, inputF32+(i*block_size) , outputF32+(i*block_size), block_size); } set1 = 0; set2 = 1; } buffer_ready = 0; } void samplingBegin(){ numblocks = num_samples/block_size; samplecounter = 0; sampleing.attach_us(&samplingCallback, 125); //sample rate 40k 25, 45k 22, 50k,20 } int samplingisdone(){ return buffer_ready; } void zerobuffers(){ for(i=0; i<=num_buffers; i++) { for(k=0; k<num_samples; k++) { buffer[i][k] = 0.0; } } } int main(){ arm_fir_init_f32(&H, NUM_TAPS, (float32_t *)&firCoeffs32_H[0], &firStateF32_H[0], block_size); arm_fir_init_f32(&L, NUM_TAPS, (float32_t *)&firCoeffs32_L[0], &firStateF32_L[0], block_size); ///zerobuffers(); samplingBegin(); while(1){ if(samplingisdone()==1){ l = 1; inputF32 = &buffer[ready_index][0]; outputF32 = &buffer[dump_index][0]; getfilter(); l = 0; } } }