peak detection
Dependents: mbed-test-i2c-PCA-biquad-peakdet Mix-code-v2 mbed-os-step-counting the-lastest-code
peak.cpp@2:6500ec04a6a1, 2019-11-25 (annotated)
- 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?
User | Revision | Line number | New 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 |