Capstone project files

Dependencies:   mbed-dsp mbed capstone_display_2

Committer:
ryanyuyu
Date:
Mon Mar 10 23:33:38 2014 +0000
Revision:
2:8ae58834937f
Parent:
1:4fe83f71b889
Child:
3:30dcfcf9412c
Current state of programming.  Not sure if digital filtering is properly implemented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryanyuyu 0:3aae5d23d0db 1 #include "mbed.h"
ryanyuyu 2:8ae58834937f 2 #include "FIR_f32.h"
ryanyuyu 0:3aae5d23d0db 3 #include "arm_math.h"
ryanyuyu 2:8ae58834937f 4 #define f_sampling 2000 //the sampling frequency
ryanyuyu 2:8ae58834937f 5 #define NumTaps 27 //the number of FIR coefficients
ryanyuyu 2:8ae58834937f 6 #define BlockSize 1024 //the size of the buffer
ryanyuyu 2:8ae58834937f 7
ryanyuyu 2:8ae58834937f 8 Serial pc(USBTX, USBRX); //USB serial for PC, to be removed later
ryanyuyu 2:8ae58834937f 9 AnalogIn input(p15); //pin 15 for analog reading
ryanyuyu 2:8ae58834937f 10 float32_t waveform[BlockSize]; //array of input data
ryanyuyu 2:8ae58834937f 11 float32_t postFilterData[BlockSize]; //array of filtered data
ryanyuyu 2:8ae58834937f 12 bool fullRead; //whether the MBED has finish
ryanyuyu 2:8ae58834937f 13 bool waitForNext;
ryanyuyu 2:8ae58834937f 14
ryanyuyu 2:8ae58834937f 15 //the filter coefficients for a band pass filter, consider changing to doubles if not precise enough
ryanyuyu 2:8ae58834937f 16 float32_t pCoeffs[NumTaps] =
ryanyuyu 2:8ae58834937f 17 { 0.012000000000000, 0.012462263166161, -0.019562318415964, -0.026175892863747,
ryanyuyu 2:8ae58834937f 18 0.031654803781611, 0.050648026372209, -0.032547136829180, -0.070997780956819,
ryanyuyu 2:8ae58834937f 19 0.032992306874347, 0.094643188024724, -0.020568171368385, -0.106071176200193,
ryanyuyu 2:8ae58834937f 20 0.009515198320277, 0.114090808482376, 0.009515198320275, -0.106071176200193,
ryanyuyu 2:8ae58834937f 21 -0.020568171368382, 0.094643188024728, 0.032992306874351, -0.070997780956815,
ryanyuyu 2:8ae58834937f 22 -0.032547136829177, 0.050648026372211, 0.031654803781612, -0.026175892863746,
ryanyuyu 2:8ae58834937f 23 -0.019562318415964, 0.012462263166161, 0.012000000000000 };
ryanyuyu 2:8ae58834937f 24 float32_t pState[NumTaps + BlockSize - 1];
ryanyuyu 2:8ae58834937f 25
ryanyuyu 2:8ae58834937f 26
ryanyuyu 2:8ae58834937f 27 int index_g; //tracks the index for the waveform array
ryanyuyu 0:3aae5d23d0db 28
ryanyuyu 2:8ae58834937f 29
ryanyuyu 2:8ae58834937f 30 void readPoint()
ryanyuyu 2:8ae58834937f 31 {
ryanyuyu 2:8ae58834937f 32 waitForNext = false;
ryanyuyu 2:8ae58834937f 33 }
ryanyuyu 2:8ae58834937f 34
ryanyuyu 2:8ae58834937f 35
ryanyuyu 2:8ae58834937f 36 /**
ryanyuyu 2:8ae58834937f 37 * This function reads one full set of analog data into the uC
ryanyuyu 2:8ae58834937f 38 */
ryanyuyu 2:8ae58834937f 39 void readSamples()
ryanyuyu 2:8ae58834937f 40 {
ryanyuyu 2:8ae58834937f 41 Ticker sampler; //allows for precision data reading
ryanyuyu 2:8ae58834937f 42 waitForNext = true;
ryanyuyu 2:8ae58834937f 43 sampler.attach_us(&readPoint, (int) (1000000/f_sampling) ); //read in data according the sampling freq
ryanyuyu 2:8ae58834937f 44 for (int i = 0; i < BlockSize; i++)
ryanyuyu 2:8ae58834937f 45 {
ryanyuyu 2:8ae58834937f 46 while (waitForNext); //wait until the ticker calls for the next sample
ryanyuyu 2:8ae58834937f 47 waveform[i] = input.read();
ryanyuyu 2:8ae58834937f 48 waitForNext = true;
ryanyuyu 2:8ae58834937f 49 }
ryanyuyu 2:8ae58834937f 50 sampler.detach();
ryanyuyu 2:8ae58834937f 51 }
ryanyuyu 2:8ae58834937f 52
ryanyuyu 0:3aae5d23d0db 53
ryanyuyu 0:3aae5d23d0db 54 int main() {
ryanyuyu 2:8ae58834937f 55 //to initialize the filter stuff use init functions (see line 89 in the arm_fir_f32.c file for documentation)
ryanyuyu 2:8ae58834937f 56 //the initialization function is in a seperate file called arm_fir_init_f32.c
ryanyuyu 2:8ae58834937f 57
ryanyuyu 2:8ae58834937f 58 /*
ryanyuyu 2:8ae58834937f 59 * <code>pState</code> points to a state array of size <code>numTaps + blockSize - 1</code>.
ryanyuyu 2:8ae58834937f 60 * Samples in the state buffer are stored in the following order.
ryanyuyu 2:8ae58834937f 61 * \par
ryanyuyu 2:8ae58834937f 62 * <pre>
ryanyuyu 2:8ae58834937f 63 * {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}
ryanyuyu 2:8ae58834937f 64 * </pre>
ryanyuyu 2:8ae58834937f 65 * \par
ryanyuyu 2:8ae58834937f 66
ryanyuyu 2:8ae58834937f 67 */
ryanyuyu 2:8ae58834937f 68 arm_fir_instance_f32* filter = new arm_fir_instance_f32();
ryanyuyu 2:8ae58834937f 69 int state = 0;
ryanyuyu 2:8ae58834937f 70 uint16_t numTaps = NumTaps;
ryanyuyu 2:8ae58834937f 71 uint32_t blockSize = BlockSize;
ryanyuyu 2:8ae58834937f 72 while(1)
ryanyuyu 2:8ae58834937f 73 {
ryanyuyu 2:8ae58834937f 74 //pc.printf("While loop\n\r");
ryanyuyu 2:8ae58834937f 75 switch(state)
ryanyuyu 2:8ae58834937f 76 {
ryanyuyu 2:8ae58834937f 77 case 0: //initialization
ryanyuyu 1:4fe83f71b889 78
ryanyuyu 2:8ae58834937f 79 //pc.printf("pre-filter init\n\r");
ryanyuyu 2:8ae58834937f 80 arm_fir_init_f32(filter, numTaps, pCoeffs, pState, blockSize);
ryanyuyu 2:8ae58834937f 81 //pc.printf("Pre-attachment");
ryanyuyu 2:8ae58834937f 82
ryanyuyu 2:8ae58834937f 83 state = 1;
ryanyuyu 2:8ae58834937f 84 pc.printf("Done with init.\n\r");
ryanyuyu 2:8ae58834937f 85 break;
ryanyuyu 2:8ae58834937f 86
ryanyuyu 2:8ae58834937f 87 case 1: //read data, take samples
ryanyuyu 2:8ae58834937f 88 pc.printf("Reading data.\n\r");
ryanyuyu 2:8ae58834937f 89 readSamples();
ryanyuyu 2:8ae58834937f 90 state = 2;
ryanyuyu 2:8ae58834937f 91 break;
ryanyuyu 2:8ae58834937f 92
ryanyuyu 2:8ae58834937f 93 case 2: //printout to pc connection
ryanyuyu 2:8ae58834937f 94 //pc.printf("into print\n\r");
ryanyuyu 2:8ae58834937f 95 /*
ryanyuyu 2:8ae58834937f 96 for (int i = 0; i < BlockSize; i++)
ryanyuyu 2:8ae58834937f 97 {
ryanyuyu 2:8ae58834937f 98 pc.printf("Waveform contents:%f\n\r", waveform[i]);
ryanyuyu 2:8ae58834937f 99 }
ryanyuyu 2:8ae58834937f 100 */
ryanyuyu 2:8ae58834937f 101 state = 3;
ryanyuyu 2:8ae58834937f 102 break;
ryanyuyu 2:8ae58834937f 103 case 3: //filter?
ryanyuyu 2:8ae58834937f 104 pc.printf("Filtering?\n\r");
ryanyuyu 2:8ae58834937f 105 arm_fir_f32(filter, waveform, postFilterData, blockSize);
ryanyuyu 2:8ae58834937f 106 state = 6;
ryanyuyu 2:8ae58834937f 107 break;
ryanyuyu 2:8ae58834937f 108 case 4: //FFT?
ryanyuyu 2:8ae58834937f 109 break;
ryanyuyu 2:8ae58834937f 110 case 5: //output, write to display and PWM tone
ryanyuyu 2:8ae58834937f 111 break;
ryanyuyu 2:8ae58834937f 112 case 6: //calculate the average voltage
ryanyuyu 2:8ae58834937f 113 double sum = 0;
ryanyuyu 2:8ae58834937f 114 for (int i = 0; i < BlockSize; i++) sum += postFilterData[i];
ryanyuyu 2:8ae58834937f 115 double average = sum/BlockSize*3.3; //*3.3 V_ref (array stored as fractions of V_ref)
ryanyuyu 2:8ae58834937f 116 pc.printf("Average = %f\n\r", average);
ryanyuyu 2:8ae58834937f 117 wait_ms(500);
ryanyuyu 2:8ae58834937f 118 state = 1;
ryanyuyu 2:8ae58834937f 119 break;
ryanyuyu 2:8ae58834937f 120 default:
ryanyuyu 2:8ae58834937f 121 break;
ryanyuyu 2:8ae58834937f 122 }
ryanyuyu 2:8ae58834937f 123 } //end of (infinite) while loop
ryanyuyu 0:3aae5d23d0db 124 }