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 14:26:44 2019 +0000
Revision:
0:59ce24b43be2
Child:
1:d1dac3b2692a
peak detection lib by Castle;

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 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