the first vision of peak detection. I try to detect the value max of a array that the previous min point is lower than a threshold given.

main.cpp

Committer:
castlefei
Date:
2019-11-20
Revision:
0:08dd14677b02

File content as of revision 0:08dd14677b02:

/* mbed Microcontroller Library
 * Copyright (c) 2019 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"
#include "platform/mbed_thread.h"
#include <vector>  
#include <iostream>

// Blinking rate in milliseconds
#define BLINKING_RATE_MS                                                    500
using namespace std;

void findPeaks(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 
         */  
        int diff = num[i] - num[i-1];  
        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 = 1;
    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]]);
            }    
        }
        
    }
    printf("num of max: %d\n\r", indMax.size());
    printf("num of valid max: %d\n\r", cnt);
    
    cout<<"max values:"<<endl;
    for(int m = 0;m<indMax.size();m++)  
    {  
        cout<<num[indMax[m]]<<"  ";  
    }  
    cout<<endl;  
    cout<<"min values:"<<endl;  
    for(int n = 0;n<indMin.size();n++)  
    {  
        cout<<num[indMin[n]]<<"  ";  
    }  
    cout<<endl;
}  

int main()
{
    // Initialise the digital pin LED1 as an output
    DigitalOut led(LED1);
    float a[] = {1,2,10,2,4,0,8,10,23,0,2, 0, 5};  
    int len = sizeof(a)/sizeof(int);
    while (true) {
        //printf("len of a is %d \n\r", len);
        findPeaks(a,len,1); 
        led = !led;
        thread_sleep_for(BLINKING_RATE_MS);
    }
}