请教一下心率算法的程序

想问一下,
1、程序里变量IBI、Peak、Trough、thresh、amp的初始值为什么是600、512、100?
2、void rountine(void)函数N > (IBI/5)*3,N > 250是为什么?
(如果你们有相关讲解视频希望能分享一下,好人一生平安)

volatile unsigned int BPM;                   // used to hold the pulse rate
volatile unsigned long Signal;                // holds the incoming raw data
volatile unsigned int IBI = 600;             // holds the time between beats, must be seeded! 
volatile bit Pulse = false;     // true when pulse wave is high, false when it's low
volatile bit QS = false;        // becomes true when Arduoino finds a beat.
volatile int rate[10];                    // array to hold last ten IBI values
volatile unsigned long sampleCounter = 0;          // used to determine pulse timing
volatile unsigned long lastBeatTime = 0;           // used to find IBI
volatile int Peak =512;                      // used to find peak in pulse wave, seeded
volatile int Trough = 512;                     // used to find trough in pulse wave, seeded
volatile int thresh = 512;                // used to find instant moment of heart beat, seeded
volatile int amp = 100;                   // used to hold amplitude of pulse waveform, seeded
volatile bit firstBeat = true;        // used to seed rate array so we startup with reasonable BPM
volatile bit secondBeat = false;      // used to seed rate array so we startup with reasonable BPM

void rountine(void)//获取心率
{                       
  int N;
    unsigned char i;
    // keep a running total of the last 10 IBI values
  unsigned int runningTotal = 0;                  // clear the runningTotal variable    

    EA=0;                                      // disable interrupts while we do this
    TL0 = 0xCD;        //2ms
    TH0 = 0xF8;
  Signal = Read_ADC0832(0)<<2;              // read the Pulse Sensor 
  sampleCounter += 2;                         // keep track of the time in mS with this variable
  N = sampleCounter - lastBeatTime;       // monitor the time since the last beat to avoid noise


    //  find the peak and trough of the pulse wave
  if(Signal < thresh && N > (IBI/5)*3)
        {       // avoid dichrotic noise by waiting 3/5 of last IBI
    if (Signal < Trough)
            {                        // T is the trough
      Trough = Signal;                         // keep track of lowest point in pulse wave 
      }
   }

  if(Signal > thresh && Signal > Peak)
        {          // thresh condition helps avoid noise
    Peak = Signal;                             // P is the peak
    }                                        // keep track of highest point in pulse wave

  //  NOW IT'S TIME TO LOOK FOR THE HEART BEAT
  // signal surges up in value every time there is a pulse
  if (N > 250)
{                                   // avoid high frequency noise
    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) )
            {        
      Pulse = true;                               // set the Pulse flag when we think there is a pulse
                     // turn on pin 13 LED
      IBI = sampleCounter - lastBeatTime;         // measure time between beats in mS
      lastBeatTime = sampleCounter;               // keep track of time for next pulse

      if(secondBeat)
                {                        // if this is the second beat, if secondBeat == TRUE
        secondBeat = false;                  // clear secondBeat flag
        for(i=0; i<=9; i++)
                    {             // seed the running total to get a realisitic BPM at startup
          rate[i] = IBI;                      
          }
        }
 
      if(firstBeat)
                {                         // if it's the first time we found a beat, if firstBeat == TRUE
        firstBeat = false;                   // clear firstBeat flag
        secondBeat = true;                   // set the second beat flag
        EA=1;                               // enable interrupts again
        return;                              // IBI value is unreliable so discard it
        }   



      for(i=0; i<=8; i++)
                {                // shift data in the rate array
        rate[i] = rate[i+1];                  // and drop the oldest IBI value 
        runningTotal += rate[i];              // add up the 9 oldest IBI values
        }

      rate[9] = IBI;                          // add the latest IBI to the rate array
      runningTotal += rate[9];                // add the latest IBI to runningTotal
      runningTotal /= 10;                     // average the last 10 IBI values 
      BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!
            if(BPM<150&&BPM>60)
             {
                    heartrate=BPM;
             }
            else
             {
                    heartrate=0;
             }    
      QS = true;                              // set Quantified Self flag 
      // QS FLAG IS NOT CLEARED INSIDE THIS ISR
    }                       
 }

  if (Signal < thresh && Pulse == true)
        {   // when the values are going down, the beat is over
                // turn off pin 13 LED
    Pulse = false;                         // reset the Pulse flag so we can do it again
    amp = Peak - Trough;                           // get amplitude of the pulse wave
    thresh = amp/2 + Trough;                    // set thresh at 50% of the amplitude
    Peak = thresh;                            // reset these for next time
    Trough = thresh;
    }

  if (N > 2500)
        {                           // if 2.5 seconds go by without a beat
    thresh = 512;                          // set thresh default
    Peak = 512;                               // set P default
    Trough = 512;                               // set T default
    lastBeatTime = sampleCounter;          // bring the lastBeatTime up to date        
    firstBeat = true;                      // set these to avoid noise
    secondBeat = false;                    // when we get the heartbeat back
    }
  heartrate = adc_value*1.0113;
  //EA=1;                                   // enable interrupts when youre done!
    
}