peak detection

Dependents:   mbed-test-i2c-PCA-biquad-peakdet Mix-code-v2 mbed-os-step-counting the-lastest-code

Committer:
castlefei
Date:
Mon Nov 25 23:44:10 2019 +0000
Revision:
2:6500ec04a6a1
Parent:
1:d1dac3b2692a
remove printf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
castlefei 0:59ce24b43be2 1 #include "peak.h"
castlefei 0:59ce24b43be2 2 #include <iostream>
castlefei 1:d1dac3b2692a 3 #include <algorithm>
castlefei 1:d1dac3b2692a 4 using namespace std;
castlefei 1:d1dac3b2692a 5 #define max(a, b) (((a) > (b)) ? (a) : (b))
castlefei 1:d1dac3b2692a 6 #define min(a, b) (((a) > (b)) ? (b) : (a))
castlefei 0:59ce24b43be2 7
castlefei 1:d1dac3b2692a 8 int PEAK::findPeaks(vector<float> num,int count, float &height)
castlefei 0:59ce24b43be2 9 {
castlefei 0:59ce24b43be2 10 vector<int> sign;
castlefei 1:d1dac3b2692a 11 float min;
castlefei 1:d1dac3b2692a 12 float threshold;
castlefei 0:59ce24b43be2 13 for(int i = 1;i<count;i++)
castlefei 0:59ce24b43be2 14 {
castlefei 0:59ce24b43be2 15 /*do difference between the near points:
castlefei 0:59ce24b43be2 16 *result<0,sign = -1
castlefei 0:59ce24b43be2 17 *result>0,sign = 1
castlefei 0:59ce24b43be2 18 *result=0,sign = 0
castlefei 0:59ce24b43be2 19 */
castlefei 0:59ce24b43be2 20 float diff = num[i] - num[i-1];
castlefei 0:59ce24b43be2 21 //printf("difference:%f",diff);
castlefei 0:59ce24b43be2 22 if(diff>0)
castlefei 0:59ce24b43be2 23 {
castlefei 0:59ce24b43be2 24 sign.push_back(1);
castlefei 0:59ce24b43be2 25 }
castlefei 0:59ce24b43be2 26 else if(diff<0)
castlefei 0:59ce24b43be2 27 {
castlefei 0:59ce24b43be2 28 sign.push_back(-1);
castlefei 0:59ce24b43be2 29 }
castlefei 0:59ce24b43be2 30 else
castlefei 0:59ce24b43be2 31 {
castlefei 0:59ce24b43be2 32 sign.push_back(0);
castlefei 0:59ce24b43be2 33 }
castlefei 0:59ce24b43be2 34 }
castlefei 1:d1dac3b2692a 35 /*do difference between the near sign
castlefei 1:d1dac3b2692a 36 *result < 0 save the max index
castlefei 1:d1dac3b2692a 37 *result > 0 save the min index
castlefei 1:d1dac3b2692a 38 */
castlefei 0:59ce24b43be2 39 vector<int> indMax;
castlefei 1:d1dac3b2692a 40 vector<int> indMin;
castlefei 1:d1dac3b2692a 41 vector<float> valMax;
castlefei 0:59ce24b43be2 42 int cnt = 0;
castlefei 0:59ce24b43be2 43 for(int j = 1;j<sign.size();j++)
castlefei 0:59ce24b43be2 44 {
castlefei 0:59ce24b43be2 45 int diff = sign[j]-sign[j-1];
castlefei 0:59ce24b43be2 46 if(diff<0)
castlefei 0:59ce24b43be2 47 {
castlefei 0:59ce24b43be2 48 indMax.push_back(j);
castlefei 0:59ce24b43be2 49 }
castlefei 0:59ce24b43be2 50 else if(diff>0)
castlefei 0:59ce24b43be2 51 {
castlefei 0:59ce24b43be2 52 indMin.push_back(j);
castlefei 0:59ce24b43be2 53 }
castlefei 0:59ce24b43be2 54 }
castlefei 0:59ce24b43be2 55 //try to find the valid max (which the previous min is smaller than threshold)
castlefei 0:59ce24b43be2 56 //begin with index 1 so there will have +1 or -1 error
castlefei 0:59ce24b43be2 57 //for(int j = 1;j<indMax.size();j++)
castlefei 0:59ce24b43be2 58 // {
castlefei 0:59ce24b43be2 59 //
castlefei 0:59ce24b43be2 60 // for(int i =0; i <indMin.size()-1; i++)
castlefei 0:59ce24b43be2 61 // {
castlefei 0:59ce24b43be2 62 // if(indMin[i]<indMax[j] && indMin[i+1]>indMax[j] && num[indMin[i]]< threshold)
castlefei 0:59ce24b43be2 63 // {
castlefei 0:59ce24b43be2 64 // cnt = cnt +1;
castlefei 0:59ce24b43be2 65 // printf("found a valid max, index:%d, value: %f \n\r", indMax[j],num[indMax[j]]);
castlefei 0:59ce24b43be2 66 // }
castlefei 0:59ce24b43be2 67 // }
castlefei 0:59ce24b43be2 68 //
castlefei 0:59ce24b43be2 69 // }
castlefei 0:59ce24b43be2 70
castlefei 0:59ce24b43be2 71 for(int j = 0; j < indMax.size(); j++)
castlefei 0:59ce24b43be2 72 {
castlefei 0:59ce24b43be2 73
castlefei 1:d1dac3b2692a 74 if(num[indMax[j]] > height)
castlefei 0:59ce24b43be2 75 {
castlefei 0:59ce24b43be2 76 cnt = cnt +1;
castlefei 1:d1dac3b2692a 77 //push the max values into the vector
castlefei 1:d1dac3b2692a 78 valMax.push_back(num[indMax[j]]);
castlefei 0:59ce24b43be2 79 }
castlefei 0:59ce24b43be2 80 }
castlefei 0:59ce24b43be2 81
castlefei 1:d1dac3b2692a 82 threshold = *min_element(valMax.begin(),valMax.end())* 0.3;
castlefei 0:59ce24b43be2 83
castlefei 2:6500ec04a6a1 84 //printf("height in peak: %f\n\r", height);
castlefei 2:6500ec04a6a1 85 //printf("threshold: %f\n\r", threshold);
castlefei 1:d1dac3b2692a 86
castlefei 1:d1dac3b2692a 87 if(height > 0.1001)
castlefei 1:d1dac3b2692a 88 {
castlefei 1:d1dac3b2692a 89 threshold = min(threshold,height);
castlefei 1:d1dac3b2692a 90 //printf("I am in !!!!!!\n\r");
castlefei 1:d1dac3b2692a 91
castlefei 1:d1dac3b2692a 92 }
castlefei 1:d1dac3b2692a 93
castlefei 1:d1dac3b2692a 94 threshold = max(threshold, 0.1);
castlefei 1:d1dac3b2692a 95 threshold = min(threshold, 0.2);
castlefei 1:d1dac3b2692a 96 height = threshold;
castlefei 1:d1dac3b2692a 97 return cnt;
castlefei 1:d1dac3b2692a 98
castlefei 1:d1dac3b2692a 99 //printf("num of max: %d\n\r", indMax.size());
castlefei 1:d1dac3b2692a 100 //printf("num of step: %d\n\r", cnt);
castlefei 0:59ce24b43be2 101
castlefei 0:59ce24b43be2 102 // cout<<"max values:"<<endl;
castlefei 0:59ce24b43be2 103 // for(int m = 0;m<indMax.size();m++)
castlefei 0:59ce24b43be2 104 // {
castlefei 0:59ce24b43be2 105 // printf("index:%d, value: %f ", indMax[m],num[indMax[m]]);
castlefei 0:59ce24b43be2 106 // }
castlefei 0:59ce24b43be2 107 // cout<<endl;
castlefei 0:59ce24b43be2 108 // cout<<"min values:"<<endl;
castlefei 0:59ce24b43be2 109 // for(int n = 0;n<indMin.size();n++)
castlefei 0:59ce24b43be2 110 // {
castlefei 0:59ce24b43be2 111 // cout<<num[indMin[n]]<<" ";
castlefei 0:59ce24b43be2 112 // }
castlefei 0:59ce24b43be2 113 // cout<<endl;
castlefei 0:59ce24b43be2 114 }
castlefei 0:59ce24b43be2 115