peak detection

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

peak.cpp

Committer:
castlefei
Date:
2019-11-25
Revision:
0:59ce24b43be2
Child:
1:d1dac3b2692a

File content as of revision 0:59ce24b43be2:

#include "peak.h"
#include <iostream>

void PEAK::findPeaks(vector<float> num,int count, float threshold)  
{  
    vector<int> sign;  
    for(int i = 1;i<count;i++)  
    {  
        /*do difference between the near points: 
         *result<0,sign = -1 
         *result>0,sign = 1 
         *result=0,sign = 0 
         */  
        float diff = num[i] - num[i-1];  
        //printf("difference:%f",diff);
        if(diff>0)  
        {  
            sign.push_back(1);  
        }  
        else if(diff<0)  
        {  
            sign.push_back(-1);  
        }  
        else  
        {  
            sign.push_back(0);  
        }  
    }  
    //do difference between the near sign
    //result < 0 save the max index
    //result > 0 save the min index 
    vector<int> indMax;  
    vector<int> indMin;  
    int cnt = 0;
    for(int j = 1;j<sign.size();j++)  
    {  
        int diff = sign[j]-sign[j-1];  
        if(diff<0)  
        {  
            indMax.push_back(j);  
        }  
        else if(diff>0)  
        {  
            indMin.push_back(j);  
        }  
    }  
    //try to find the valid max (which the previous min is smaller than threshold)
    //begin with index 1 so there will have +1 or -1 error
    //for(int j = 1;j<indMax.size();j++)  
//    {
//        
//        for(int i =0; i <indMin.size()-1; i++)
//        {
//            if(indMin[i]<indMax[j] && indMin[i+1]>indMax[j] && num[indMin[i]]< threshold)
//            {
//                cnt = cnt +1;    
//                printf("found a valid max, index:%d, value: %f \n\r", indMax[j],num[indMax[j]]);
//            }    
//        }
//        
//    }
    
    for(int j = 0; j < indMax.size(); j++)
    {
        
        if(num[indMax[j]] > threshold)
        {
            cnt = cnt +1;    
            //printf("found a valid max, index:%d, value: %f \n\r", indMax[j],num[indMax[j]]);
        }
    }
    
    
    printf("num of max: %d\n\r", indMax.size());
    printf("num of step: %d\n\r", cnt);
    
   // cout<<"max values:"<<endl;
//    for(int m = 0;m<indMax.size();m++)  
//    {  
//        printf("index:%d, value: %f ", indMax[m],num[indMax[m]]);
//    }  
//    cout<<endl;  
//    cout<<"min values:"<<endl;  
//    for(int n = 0;n<indMin.size();n++)  
//    {  
//        cout<<num[indMin[n]]<<"  ";  
//    }  
//    cout<<endl;
}