#define EXTERN  extern
#include        "define.h"

#define DELTA   .01

discrim()
   {
   int          i,end;
   volatile float junk;
   float        num,den,offset;
   volatile float S1,S2,S3,S4,S5,S6,a,b,c,d;  
   
   /* throw away junk from the FIFO */
   for(end=*Xmitpulse-4,i=0; i<end; i++)        junk = *FIFO; 
   
   if(*Xmitpulse == 2)   /* special case for PW = 2 */
      S1 = S2 = 0.0;      
   else
      {
      S1 = *FIFO;
      S2 = *FIFO;
      }

   /* read 4 samples from middle of TX pulse */
   S3 = *FIFO;
   S4 = *FIFO;
   S5 = *FIFO;
   S6 = *FIFO;

   /* throw away junk from the FIFO */
   for(i=0; i<end; i++)        junk = *FIFO;

   /* get I0 and Q0 */
   if(*Xmitpulse == 2)  /* special case for PW = 2 */
      {
      *IQPTR = S5;
      *(IQPTR+1) = S6;
      }
   else
      {
      *IQPTR = *FIFO;
      *(IQPTR+1) = *FIFO;
      }

   /* throw away remaining junk from the FIFO */
   for(end=*Pulsewidth-*Xmitpulse,i=0; i<end; i++)        {junk = *FIFO; junk = *FIFO;}

   a = S1 - S3;
   b = S2 - S4;
   c = S5 - S3;
   d = S6 - S4;

   if(a < 0.0)
      {
      a = -a;
      b = -b;
      c = -c;
      d = -d;
      }

   a -= (float)ADOFFSET;
   b -= (float)ADOFFSET;
   c -= (float)ADOFFSET;
   d -= (float)ADOFFSET;
   
   num = a * d - b * c;
   den = b * (b - d) + c * (c - a);
   
   /* if less than X dB, set at X dB (make discriminator read zero for week signals) */
   if(den < 2.25E13)    den = 2.25E13;   

   *Numdiscrim = DELTA * num + (1 - DELTA) * *Numdiscrim;
   *Dendiscrim = DELTA * den + (1 - DELTA) * *Dendiscrim;
   }
