Slight Mod

Dependencies:   mbed-dsp mbed

Fork of Hat_Board_v5 by John Scharf

Committer:
drnow
Date:
Thu Apr 03 10:56:37 2014 +0000
Revision:
5:ef42f4648198
Parent:
4:e9df42113893
Slight mod;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jjes144 4:e9df42113893 1 //Hat Board v5 by Cooke Scharf 4/2/2014
drnow 0:34bad5aca893 2
drnow 0:34bad5aca893 3 #include "mbed.h"
drnow 0:34bad5aca893 4 #include "SI_LIS.h"
drnow 0:34bad5aca893 5 #include <time.h>
drnow 0:34bad5aca893 6
jjes144 4:e9df42113893 7 #include "arm_math.h"
jjes144 4:e9df42113893 8 #include "math_helper.h"
jjes144 4:e9df42113893 9 #include "dsp.h"
jjes144 4:e9df42113893 10 #include "arm_const_structs.h"
jjes144 4:e9df42113893 11
drnow 0:34bad5aca893 12 DigitalOut myled3(LED3);
drnow 0:34bad5aca893 13 DigitalOut myled4(LED4);
drnow 0:34bad5aca893 14 Serial pc(USBTX,USBRX);
drnow 0:34bad5aca893 15 DigitalIn int_pin(p8);
drnow 0:34bad5aca893 16 Timer t;
drnow 0:34bad5aca893 17
drnow 5:ef42f4648198 18 int t_usec;
drnow 0:34bad5aca893 19 int reading_IR,reading_660,LSB,MSB;
drnow 0:34bad5aca893 20 char rx_data[4];
drnow 1:2efeed26d93a 21 char accel_data[6];
drnow 0:34bad5aca893 22 char temp_val;
drnow 3:8334f137c151 23 short int dataX; // short int: 16 bits. This allows easy negative results
drnow 3:8334f137c151 24 short int dataY; // short int: 16 bits. This allows easy negative results
drnow 3:8334f137c151 25 short int dataZ; // short int: 16 bits. This allows easy negative results
drnow 2:3a8cd127b72a 26 float t_msec;
drnow 3:8334f137c151 27 float dataX_fl;
drnow 3:8334f137c151 28 float dataY_fl;
drnow 3:8334f137c151 29 float dataZ_fl;
jjes144 4:e9df42113893 30 //float accel_fl;
jjes144 4:e9df42113893 31
jjes144 4:e9df42113893 32 ////////////////////////////////////////////
jjes144 4:e9df42113893 33 ///////////////////////////////////////////
jjes144 4:e9df42113893 34 #define MAX_BLOCKSIZE 4096
drnow 5:ef42f4648198 35 uint32_t fftsize = MAX_BLOCKSIZE/2;
drnow 5:ef42f4648198 36 const static arm_cfft_instance_f32 *S;
jjes144 4:e9df42113893 37
jjes144 4:e9df42113893 38 ///////////////////////////////////////////
jjes144 4:e9df42113893 39 long int BAUD_RATE = 230400;
drnow 5:ef42f4648198 40 void baud(int baudrate)
jjes144 4:e9df42113893 41 {
jjes144 4:e9df42113893 42 Serial s(USBTX,USBRX);
jjes144 4:e9df42113893 43 s.baud(baudrate);
jjes144 4:e9df42113893 44 }
jjes144 4:e9df42113893 45
jjes144 4:e9df42113893 46 ///////////////////////////////////////////
jjes144 4:e9df42113893 47 unsigned short i,j,k, m;
drnow 5:ef42f4648198 48 float32_t temp;
jjes144 4:e9df42113893 49 float32_t temp2;
jjes144 4:e9df42113893 50 float sclr;
jjes144 4:e9df42113893 51
jjes144 4:e9df42113893 52 float32_t v[MAX_BLOCKSIZE], w[MAX_BLOCKSIZE], acc[MAX_BLOCKSIZE];
jjes144 4:e9df42113893 53 float32_t testoutput[MAX_BLOCKSIZE/2];
jjes144 4:e9df42113893 54 float32_t testoutputb[26], testoutputc[26], outputacc[26];
jjes144 4:e9df42113893 55
jjes144 4:e9df42113893 56 ////////////////////////////////////////////
drnow 0:34bad5aca893 57
drnow 0:34bad5aca893 58 int main()
drnow 0:34bad5aca893 59 {
drnow 5:ef42f4648198 60 t.start();
jjes144 4:e9df42113893 61 myled4 = 0;
drnow 3:8334f137c151 62 pc.baud(460800);
drnow 2:3a8cd127b72a 63 Init_Accel(); // starts LIS3DH
drnow 2:3a8cd127b72a 64 restart(); // starts Si1142
drnow 2:3a8cd127b72a 65 wait_ms(30);
drnow 2:3a8cd127b72a 66 command (PS_AUTO); //start measuring
drnow 2:3a8cd127b72a 67 wait (0.5);
drnow 0:34bad5aca893 68
jjes144 4:e9df42113893 69 j = 0;
drnow 5:ef42f4648198 70
drnow 2:3a8cd127b72a 71 while(1) {
drnow 2:3a8cd127b72a 72 if(!int_pin) {
drnow 1:2efeed26d93a 73
drnow 2:3a8cd127b72a 74 write_reg(IRQ_STATUS,0x04); // clear the interrupt.
drnow 1:2efeed26d93a 75
drnow 2:3a8cd127b72a 76 read_reg2(PS1_DATA0);
drnow 3:8334f137c151 77 reading_IR = rx_data[1] << 8 | rx_data[0];
drnow 3:8334f137c151 78 reading_660 = rx_data[3] << 8 | rx_data[1];
drnow 1:2efeed26d93a 79
drnow 2:3a8cd127b72a 80 Get_Accel_Reg_6 (0x28);
drnow 0:34bad5aca893 81
drnow 3:8334f137c151 82 dataX = accel_data[1] << 8 | accel_data[0];
jjes144 4:e9df42113893 83 dataY = accel_data[3] << 8 | accel_data[2];
jjes144 4:e9df42113893 84 dataZ = accel_data[5] << 8 | accel_data[4];
drnow 5:ef42f4648198 85
jjes144 4:e9df42113893 86 k = (j/2)*2;
jjes144 4:e9df42113893 87 if (j==k) {
drnow 5:ef42f4648198 88 v[j] = (float32_t)reading_IR;
drnow 5:ef42f4648198 89 v[j+1] = 0;
drnow 5:ef42f4648198 90 w[j] = (float32_t)reading_660;
drnow 5:ef42f4648198 91 w[j+1] = 0;
jjes144 4:e9df42113893 92
drnow 5:ef42f4648198 93 dataX_fl = (float) dataX;
drnow 5:ef42f4648198 94 dataY_fl = (float) dataY;
drnow 5:ef42f4648198 95 dataZ_fl = (float) dataZ;
jjes144 4:e9df42113893 96
drnow 5:ef42f4648198 97 acc[j] = sqrt( (dataX_fl*dataX_fl) + (dataY_fl*dataY_fl) + (dataZ_fl*dataZ_fl) );
drnow 5:ef42f4648198 98 acc[j+1] = 0;
drnow 5:ef42f4648198 99
drnow 5:ef42f4648198 100 }
drnow 5:ef42f4648198 101 // pc.printf ("%4d %5d %5d %5d %5d %5d\n\r", j, reading_IR, reading_660, dataX, dataY, dataZ);
drnow 5:ef42f4648198 102
drnow 5:ef42f4648198 103 j= j + 2;
drnow 5:ef42f4648198 104
drnow 5:ef42f4648198 105 if(j==MAX_BLOCKSIZE) {
drnow 0:34bad5aca893 106
drnow 5:ef42f4648198 107 switch (fftsize) {
drnow 5:ef42f4648198 108 case 64:
drnow 5:ef42f4648198 109 S = & arm_cfft_sR_f32_len64;
drnow 5:ef42f4648198 110 break;
drnow 5:ef42f4648198 111 case 128:
drnow 5:ef42f4648198 112 S = & arm_cfft_sR_f32_len128;
drnow 5:ef42f4648198 113 break;
drnow 5:ef42f4648198 114 case 256:
drnow 5:ef42f4648198 115 S = & arm_cfft_sR_f32_len256;
drnow 5:ef42f4648198 116 break;
drnow 5:ef42f4648198 117 case 512:
drnow 5:ef42f4648198 118 S = & arm_cfft_sR_f32_len512;
drnow 5:ef42f4648198 119 break;
drnow 5:ef42f4648198 120 case 1024:
drnow 5:ef42f4648198 121 S = & arm_cfft_sR_f32_len1024;
drnow 5:ef42f4648198 122 break;
drnow 5:ef42f4648198 123 case 2048:
drnow 5:ef42f4648198 124 S = & arm_cfft_sR_f32_len2048;
drnow 5:ef42f4648198 125 break;
drnow 5:ef42f4648198 126 case 4096:
drnow 5:ef42f4648198 127 S = & arm_cfft_sR_f32_len4096;
drnow 5:ef42f4648198 128 break;
drnow 5:ef42f4648198 129 }
jjes144 4:e9df42113893 130
jjes144 4:e9df42113893 131 /////////////////////////////////////////////////////////////////////
jjes144 4:e9df42113893 132
drnow 5:ef42f4648198 133 /////////////////////////////////////////////////////////////////////
drnow 5:ef42f4648198 134 float32_t maxvaluea, maxvalueb, maxacc, rvalue, spo2;
drnow 5:ef42f4648198 135 uint32_t testindexa, testindexb, indexacc;
drnow 5:ef42f4648198 136
drnow 5:ef42f4648198 137 t.reset();
drnow 5:ef42f4648198 138
drnow 5:ef42f4648198 139 for (i = 0; i < 26; i++) {
drnow 5:ef42f4648198 140 // pc.printf ("\n\r%4d %10.2f %10.2f %10.2f\n\r", i, v[i], w[i], acc[i]);
drnow 5:ef42f4648198 141 }
drnow 5:ef42f4648198 142
drnow 5:ef42f4648198 143 /////////////////////////////////////////////////////////////////////
drnow 5:ef42f4648198 144 arm_cfft_f32(S, v, 0, 1);
drnow 5:ef42f4648198 145 arm_cmplx_mag_squared_f32(v, testoutput, fftsize);
drnow 5:ef42f4648198 146 sclr = 1000000/testoutput[0];
drnow 5:ef42f4648198 147 arm_scale_f32(testoutput, sclr, testoutput, fftsize);
drnow 5:ef42f4648198 148
drnow 5:ef42f4648198 149 for (i = 0; i < 26; i++) {
drnow 5:ef42f4648198 150 testoutputb[i] = testoutput[i];
drnow 5:ef42f4648198 151 if (i<4) {
drnow 5:ef42f4648198 152 testoutputb[i] = 0;
drnow 5:ef42f4648198 153 }
drnow 5:ef42f4648198 154 // pc.printf ("\n\r%4d %10.2f\n\r", i, testoutputb[i]);
drnow 5:ef42f4648198 155 }
drnow 5:ef42f4648198 156 // 805 nm
drnow 5:ef42f4648198 157 arm_max_f32(testoutputb, 26, &maxvalueb, &testindexb); // 720 hz sampling / 4096 fft = 0.1758 hz bin spacing = 360 hz sampling / 2048 fft
drnow 5:ef42f4648198 158 // 1 beat-sec / 0.1758 = about 6 bins (HR = 60 bpm)
drnow 5:ef42f4648198 159 // 3.6667 beats-sec / 0.1758 hz bin spacing = about 21 bins (HR = 220 bpm)
drnow 5:ef42f4648198 160 // pc.printf ("\n\r\n\r%4d %10.3f\n\r\n\r", testindexb, maxvalueb);
jjes144 4:e9df42113893 161
jjes144 4:e9df42113893 162 /////////////////////////////////////////////////////////////////////
drnow 5:ef42f4648198 163 arm_cfft_f32(S, w, 0, 1);
drnow 5:ef42f4648198 164 arm_cmplx_mag_squared_f32(w, testoutput, fftsize);
drnow 5:ef42f4648198 165 sclr = 1000000/testoutput[0];
drnow 5:ef42f4648198 166 arm_scale_f32(testoutput, sclr, testoutput, fftsize);
drnow 5:ef42f4648198 167
drnow 5:ef42f4648198 168 for (i = 0; i < 26; i++) {
drnow 5:ef42f4648198 169 testoutputc[i] = testoutput[i];
drnow 5:ef42f4648198 170 if (i<4) {
drnow 5:ef42f4648198 171 testoutputc[i] = 0;
drnow 5:ef42f4648198 172 }
drnow 5:ef42f4648198 173 }
drnow 5:ef42f4648198 174 // 660 nm
drnow 5:ef42f4648198 175 arm_max_f32(testoutputc, 26, &maxvaluea, &testindexa); // 720 hz sampling / 4096 fft = 0.1758 hz bin spacing = 360 hz sampling / 2048 fft
drnow 5:ef42f4648198 176 // 1 beat-sec / 0.1758 = about 6 bins (HR = 60 bpm)
drnow 5:ef42f4648198 177 // 3.6667 beats-sec / 0.1758 hz bin spacing = about 21 bins (HR = 220 bpm)
drnow 5:ef42f4648198 178 // pc.printf ("\n\r\n\r%4d %10.3f\n\r\n\r", testindexa, maxvaluea);
drnow 5:ef42f4648198 179
drnow 5:ef42f4648198 180 rvalue = maxvaluea/maxvalueb;
drnow 5:ef42f4648198 181 spo2 = -22.6 * rvalue + 108;
drnow 5:ef42f4648198 182
drnow 5:ef42f4648198 183 pc.printf ("\n\r\n\r%5.2f %5.2f\n\r\n\r", rvalue, spo2);
drnow 5:ef42f4648198 184
drnow 5:ef42f4648198 185 /////////////////////////////////////////////////////////////////////
drnow 5:ef42f4648198 186 arm_cfft_f32(S, acc, 0, 1);
drnow 5:ef42f4648198 187 arm_cmplx_mag_squared_f32(acc, testoutput, fftsize);
drnow 5:ef42f4648198 188 sclr = 1000000/testoutput[0];
drnow 5:ef42f4648198 189 arm_scale_f32(testoutput, sclr, testoutput, fftsize);
drnow 5:ef42f4648198 190
drnow 5:ef42f4648198 191 for (i = 0; i < 26; i++) {
drnow 5:ef42f4648198 192 outputacc[i] = testoutput[i];
drnow 5:ef42f4648198 193 if (i<4) {
drnow 5:ef42f4648198 194 outputacc[i] = 0;
drnow 5:ef42f4648198 195 }
drnow 5:ef42f4648198 196 // pc.printf ("\n\r%4d %10.2f\n\r", i, outputacc[i]);
drnow 5:ef42f4648198 197 }
drnow 5:ef42f4648198 198 // accelerometer
drnow 5:ef42f4648198 199 arm_max_f32(outputacc, 26, &maxacc, &indexacc); // 720 hz sampling / 4096 fft = 0.1758 hz bin spacing = 360 hz sampling / 2048 fft
drnow 5:ef42f4648198 200 // 1 beat-sec / 0.1758 = about 6 bins (HR = 60 bpm)
drnow 5:ef42f4648198 201 // 3.6667 beats-sec / 0.1758 hz bin spacing = about 21 bins (HR = 220 bpm)
drnow 5:ef42f4648198 202 // pc.printf ("\n\r\n\r%4d %10.3f\n\r\n\r", indexacc, maxacc);
drnow 5:ef42f4648198 203
drnow 5:ef42f4648198 204 /////////////////////////////////////////////////////////////////////
drnow 5:ef42f4648198 205
drnow 5:ef42f4648198 206 j = 0;
drnow 5:ef42f4648198 207 t_usec = t.read_us();
drnow 5:ef42f4648198 208 pc.printf ("FFT's etc: %d us\n",t_usec);
drnow 5:ef42f4648198 209
drnow 5:ef42f4648198 210 /////////////////////////////////////////////////////////////////////
drnow 5:ef42f4648198 211
drnow 5:ef42f4648198 212 }
drnow 5:ef42f4648198 213
jjes144 4:e9df42113893 214 //----------------------------------------------------------
drnow 2:3a8cd127b72a 215 }
drnow 2:3a8cd127b72a 216 }
drnow 0:34bad5aca893 217 }
drnow 0:34bad5aca893 218