  
  // Note! code is messy, but all it does is manually allocate
  // weighted points for all the common periods... 
  // Normally this would be done by the PIC
  // in real time as each period was captured! This version
  // assumes the 30 periods are stored in a RAM array.
  // For details see; www.RomanBlack.com/DTMF/DTMF_alg.htm
  
  // clear the tone accumulators first
  for(i=0; i<16; i++)  Dtone[i] = 0;

  // loop and process all the 30 periods 
  for(i=0; i<MAXSAMP; i++)
  {
    // get the period value
    per = periods[i];

    // 0. 697 1209
    if(per >= 97 && per <= 100)   Dtone[0] += 8;
    if(per >= 65 && per <= 67)    Dtone[0] += 2;  

    // 1. 770 1209
    if(per >= 62 && per <= 64)    Dtone[1] += 4;
    if(per >= 93 && per <= 95)    Dtone[1] += 6;  

    // 2. 852 1209
    if(per >= 59 && per <= 62)    Dtone[2] += 6;
    if(per >= 89 && per <= 92)    Dtone[2] += 4;  

    // 3. 941 1209
    if(per >= 57 && per <= 59)    Dtone[3] += 8;
    if(per >= 85 && per <= 88)    Dtone[3] += 2;  

    // 4. 697 1336
    if(per >= 91 && per <= 93)    Dtone[4] += 8;

    // 5. 770 1336
    if(per >= 88 && per <= 90)    Dtone[5] += 7;
    if(per >= 59 && per <= 61)    Dtone[5] += 3;  

    // 6. 852 1336
    if(per >= 84 && per <= 86)    Dtone[6] += 6;
    if(per >= 56 && per <= 58)    Dtone[6] += 5;  
 
    // 7. 941 1336
    if(per >= 54 && per <= 56)    Dtone[7] += 8;
    if(per >= 81 && per <= 83)    Dtone[7] += 2;  
 
    // 8. 697 1477
    if(per >= 85 && per <= 87)    Dtone[8] += 3;
    if(per >= 111 && per <= 117)  Dtone[8] += 38;  
  
    // 9. 770 1477
    if(per >= 82 && per <= 84)    Dtone[9] += 6;

    // 10. 852 1477
    if(per >= 79 && per <= 81)    Dtone[10] += 6;
    if(per >= 53 && per <= 55)    Dtone[10] += 2;  

    // 11. 941 1477
    if(per >= 76 && per <= 78)    Dtone[11] += 4;
    if(per >= 51 && per <= 53)    Dtone[11] += 6;  

    // 12. 697 1633
    if(per >= 80 && per <= 82)    Dtone[12] += 2;
    if(per >= 104 && per <= 108)  Dtone[12] += 14;  

    // 13. 770 1633
    if(per >= 77 && per <= 79)    Dtone[13] += 6;
    if(per >= 101 && per <= 104)  Dtone[13] += 4;  

    // 14. 852 1633
    if(per >= 74 && per <= 76)    Dtone[14] += 6;

    // 15. 941 1633
    if(per >= 71 && per <= 73)    Dtone[15] += 4;
    if(per >= 48 && per <= 50)    Dtone[15] += 6;  
  }
