Capstone project files
Dependencies: mbed-dsp mbed capstone_display_2
main.cpp@2:8ae58834937f, 2014-03-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |