peak detection
Dependents: mbed-test-i2c-PCA-biquad-peakdet Mix-code-v2 mbed-os-step-counting the-lastest-code
peak.cpp@0:59ce24b43be2, 2019-11-25 (annotated)
- Committer:
- castlefei
- Date:
- Mon Nov 25 14:26:44 2019 +0000
- Revision:
- 0:59ce24b43be2
- Child:
- 1:d1dac3b2692a
peak detection lib by Castle;
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 | 0:59ce24b43be2 | 3 | |
castlefei | 0:59ce24b43be2 | 4 | void PEAK::findPeaks(vector<float> num,int count, float threshold) |
castlefei | 0:59ce24b43be2 | 5 | { |
castlefei | 0:59ce24b43be2 | 6 | vector<int> sign; |
castlefei | 0:59ce24b43be2 | 7 | for(int i = 1;i<count;i++) |
castlefei | 0:59ce24b43be2 | 8 | { |
castlefei | 0:59ce24b43be2 | 9 | /*do difference between the near points: |
castlefei | 0:59ce24b43be2 | 10 | *result<0,sign = -1 |
castlefei | 0:59ce24b43be2 | 11 | *result>0,sign = 1 |
castlefei | 0:59ce24b43be2 | 12 | *result=0,sign = 0 |
castlefei | 0:59ce24b43be2 | 13 | */ |
castlefei | 0:59ce24b43be2 | 14 | float diff = num[i] - num[i-1]; |
castlefei | 0:59ce24b43be2 | 15 | //printf("difference:%f",diff); |
castlefei | 0:59ce24b43be2 | 16 | if(diff>0) |
castlefei | 0:59ce24b43be2 | 17 | { |
castlefei | 0:59ce24b43be2 | 18 | sign.push_back(1); |
castlefei | 0:59ce24b43be2 | 19 | } |
castlefei | 0:59ce24b43be2 | 20 | else if(diff<0) |
castlefei | 0:59ce24b43be2 | 21 | { |
castlefei | 0:59ce24b43be2 | 22 | sign.push_back(-1); |
castlefei | 0:59ce24b43be2 | 23 | } |
castlefei | 0:59ce24b43be2 | 24 | else |
castlefei | 0:59ce24b43be2 | 25 | { |
castlefei | 0:59ce24b43be2 | 26 | sign.push_back(0); |
castlefei | 0:59ce24b43be2 | 27 | } |
castlefei | 0:59ce24b43be2 | 28 | } |
castlefei | 0:59ce24b43be2 | 29 | //do difference between the near sign |
castlefei | 0:59ce24b43be2 | 30 | //result < 0 save the max index |
castlefei | 0:59ce24b43be2 | 31 | //result > 0 save the min index |
castlefei | 0:59ce24b43be2 | 32 | vector<int> indMax; |
castlefei | 0:59ce24b43be2 | 33 | vector<int> indMin; |
castlefei | 0:59ce24b43be2 | 34 | int cnt = 0; |
castlefei | 0:59ce24b43be2 | 35 | for(int j = 1;j<sign.size();j++) |
castlefei | 0:59ce24b43be2 | 36 | { |
castlefei | 0:59ce24b43be2 | 37 | int diff = sign[j]-sign[j-1]; |
castlefei | 0:59ce24b43be2 | 38 | if(diff<0) |
castlefei | 0:59ce24b43be2 | 39 | { |
castlefei | 0:59ce24b43be2 | 40 | indMax.push_back(j); |
castlefei | 0:59ce24b43be2 | 41 | } |
castlefei | 0:59ce24b43be2 | 42 | else if(diff>0) |
castlefei | 0:59ce24b43be2 | 43 | { |
castlefei | 0:59ce24b43be2 | 44 | indMin.push_back(j); |
castlefei | 0:59ce24b43be2 | 45 | } |
castlefei | 0:59ce24b43be2 | 46 | } |
castlefei | 0:59ce24b43be2 | 47 | //try to find the valid max (which the previous min is smaller than threshold) |
castlefei | 0:59ce24b43be2 | 48 | //begin with index 1 so there will have +1 or -1 error |
castlefei | 0:59ce24b43be2 | 49 | //for(int j = 1;j<indMax.size();j++) |
castlefei | 0:59ce24b43be2 | 50 | // { |
castlefei | 0:59ce24b43be2 | 51 | // |
castlefei | 0:59ce24b43be2 | 52 | // for(int i =0; i <indMin.size()-1; i++) |
castlefei | 0:59ce24b43be2 | 53 | // { |
castlefei | 0:59ce24b43be2 | 54 | // if(indMin[i]<indMax[j] && indMin[i+1]>indMax[j] && num[indMin[i]]< threshold) |
castlefei | 0:59ce24b43be2 | 55 | // { |
castlefei | 0:59ce24b43be2 | 56 | // cnt = cnt +1; |
castlefei | 0:59ce24b43be2 | 57 | // printf("found a valid max, index:%d, value: %f \n\r", indMax[j],num[indMax[j]]); |
castlefei | 0:59ce24b43be2 | 58 | // } |
castlefei | 0:59ce24b43be2 | 59 | // } |
castlefei | 0:59ce24b43be2 | 60 | // |
castlefei | 0:59ce24b43be2 | 61 | // } |
castlefei | 0:59ce24b43be2 | 62 | |
castlefei | 0:59ce24b43be2 | 63 | for(int j = 0; j < indMax.size(); j++) |
castlefei | 0:59ce24b43be2 | 64 | { |
castlefei | 0:59ce24b43be2 | 65 | |
castlefei | 0:59ce24b43be2 | 66 | if(num[indMax[j]] > threshold) |
castlefei | 0:59ce24b43be2 | 67 | { |
castlefei | 0:59ce24b43be2 | 68 | cnt = cnt +1; |
castlefei | 0:59ce24b43be2 | 69 | //printf("found a valid max, index:%d, value: %f \n\r", indMax[j],num[indMax[j]]); |
castlefei | 0:59ce24b43be2 | 70 | } |
castlefei | 0:59ce24b43be2 | 71 | } |
castlefei | 0:59ce24b43be2 | 72 | |
castlefei | 0:59ce24b43be2 | 73 | |
castlefei | 0:59ce24b43be2 | 74 | printf("num of max: %d\n\r", indMax.size()); |
castlefei | 0:59ce24b43be2 | 75 | printf("num of step: %d\n\r", cnt); |
castlefei | 0:59ce24b43be2 | 76 | |
castlefei | 0:59ce24b43be2 | 77 | // cout<<"max values:"<<endl; |
castlefei | 0:59ce24b43be2 | 78 | // for(int m = 0;m<indMax.size();m++) |
castlefei | 0:59ce24b43be2 | 79 | // { |
castlefei | 0:59ce24b43be2 | 80 | // printf("index:%d, value: %f ", indMax[m],num[indMax[m]]); |
castlefei | 0:59ce24b43be2 | 81 | // } |
castlefei | 0:59ce24b43be2 | 82 | // cout<<endl; |
castlefei | 0:59ce24b43be2 | 83 | // cout<<"min values:"<<endl; |
castlefei | 0:59ce24b43be2 | 84 | // for(int n = 0;n<indMin.size();n++) |
castlefei | 0:59ce24b43be2 | 85 | // { |
castlefei | 0:59ce24b43be2 | 86 | // cout<<num[indMin[n]]<<" "; |
castlefei | 0:59ce24b43be2 | 87 | // } |
castlefei | 0:59ce24b43be2 | 88 | // cout<<endl; |
castlefei | 0:59ce24b43be2 | 89 | } |
castlefei | 0:59ce24b43be2 | 90 |