Arduino
int detectDirection(int16_t* buffI, int16_t* buffQ) 
{ 
  int16_t directionRet = 0; 
  int indicator = 0; 
  bool edgechanged = true; 
  bool nextismax = true; 
  int16_t mean = 0; 
   
  mean  = getMeanValue(buffI, SAMPLES); 
  for (int i = 0; i < (SAMPLES - 1); i++) 
  { 
    if ((buffI[i] < (mean - SENSIVITY)) || (buffI[i] > (mean + SENSIVITY))) 
    { 

      if(edgechanged) // Determine next turning point type       {         if(buffI[i] > buffI[i+1])   // I(t): New edge is falling           nextismax = false;        // Look for minimum         else                        // I(t): New edge is rising           nextismax = true;         // Look for maximum         edgechanged = false;       }
      if (nextismax)       {         if (buffI[i] > buffI[i + 1])    // Waiting for maximum         {           if (buffQ[i] > buffQ[i + 1])  // ... meets falling edge Q(t)               indicator++;            else if (buffQ[i] < buffQ[i + 1]) // ... meets rising edge Q(t)               indicator--;            edgechanged = true// Prepare for determine next edge I(t)         }       }       else       {         if (buffI[i] < buffI[i + 1])   // Waiting for minimum         {           if (buffQ[i] > buffQ[i + 1]) // ... meets falling edge Q(t)               indicator--;                 else if (buffQ[i] < buffQ[i + 1]) // ... meets rising edge Q(t)               indicator++;           edgechanged = true;   // Prepare for next edge I(t)         }       }     }   }
  if (indicator > 0)     directionRet = 1;   else if (indicator < 0)     directionRet = -1;
  return directionRet; }