/* The algorithms, source code, look-and-feel of WSJT-X and related
 * programs, and protocol specifications for the modes FSK441, FT8, JT4,
 * JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144, are Copyright © 2001-2017
 * by one or more of the following authors: Joseph Taylor, K1JT; Bill
 * Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam,
 * KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q;
 * and other members of the WSJT Development Group.
 *
 * MSHV PI4 Decoder Part from JT4 
 * Rewritten into C++ and modified by Hrisimir Hristov, LZ2HV 2015-2017
 * (Edited by Harper Innes, VK1TTY - to remove Gendered Language and Replace with Non-Gendered language)  NOTE:May be used under the terms of the GNU General Public License (GPL)
 */

#include "decoderms.h"
//#include <QtGui>


static const double tx_nfqsopi4 = 682.8125;//1270.46;//682.8125;//1270.46;
static const int N_SYMMAX = 2000;//2520; 2000  2743 12000->2176,8
static const int G_NSYM = 146;//207 146
//static const int N_FFTMAX = 2048;

/*static const int ch_count = 3;//7
static const int nch_pi4[ch_count]=
    {
        //36,38,40,42,44,46,48 //7
        //42,42,42,42,42,42,42 //7
        //36,38,40,42,44//,46,48 //5
        //40,40,40,40,40//,46,48 //5
        38,40,42//,46,48//5
    };*/
static const int npr2_pi4[146] =
{
    0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,1,0,0,0,1,0,0,0,1,1,0,0,1,
    1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,0,1,1,0,1,1,0,1,0,
    0,0,0,0,1,1,1,1,1,0,1,0,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,0,
    1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,1,
    0,1,1,1,0,1,1,0,1,0,1,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1
};

static const char PI4_valid_chars[38] =
    {
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
        'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
        'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
        'W', 'X', 'Y', 'Z', ' ', '/'
    };

//static const int npoly1=-221228207;
//static const int npoly2=-463389625;

#define	npoly1	0xf2d05351
#define	npoly2	0xe4613c47
static const int partab_pi4[256]=
    {
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0,
        0, 1, 1, 0, 1, 0, 0, 1,
        0, 1, 1, 0, 1, 0, 0, 1,
        1, 0, 0, 1, 0, 1, 1, 0
    };
static const int MAXAVE_PI4 = 20; //64 max
/*
int mettab_pi4_1[2][256] =
    {
        {
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][  0..  7]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][  8.. 15]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 16.. 23]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 24.. 31]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 32.. 39]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 40.. 47]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 48.. 55]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 56.. 63]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[0][ 64.. 71]
            3,   2,   2,   2,   2,   2,   2,   2, // mettab[0][ 72.. 79]
            2,   2,   2,   2,   2,   2,   2,   2, // mettab[0][ 80.. 87]
            2,   2,   2,   2,   2,   2,   2,   2, // mettab[0][ 88.. 95]
            1,   1,   1,   1,   1,   1,   1,   1, // mettab[0][ 96..103]
            1,   1,   1,   0,   0,   0,   0,   0, // mettab[0][104..111]
            0,   0,   0,  -1,  -1,  -1,  -1,  -1, // mettab[0][112..119]
            -1,  -2,  -2,  -2,  -2,  -2,  -3,  -3, // mettab[0][120..127]
            -3,  -3,  -3,  -4,  -4,  -4,  -4,  -5, // mettab[0][128..135]
            -5,  -5,  -5,  -6,  -6,  -6,  -7,  -7, // mettab[0][136..143]
            -7,  -8,  -8,  -8,  -8,  -9,  -9,  -9, // mettab[0][144..151]
            -10, -10, -11, -11, -11, -12, -12, -12, // mettab[0][152..159]
            -13, -13, -13, -14, -14, -15, -15, -15, // mettab[0][160..167]
            -16, -16, -16, -17, -17, -18, -18, -18, // mettab[0][168..175]
            -19, -19, -20, -20, -21, -21, -21, -22, // mettab[0][176..183]
            -22, -23, -23, -23, -24, -24, -25, -25, // mettab[0][184..191]
            -26, -26, -26, -27, -27, -28, -28, -29, // mettab[0][192..199]
            -29, -29, -30, -30, -31, -31, -32, -32, // mettab[0][200..207]
            -32, -33, -33, -34, -34, -35, -35, -35, // mettab[0][208..215]
            -36, -36, -37, -37, -38, -38, -39, -39, // mettab[0][216..223]
            -39, -40, -40, -41, -41, -42, -42, -42, // mettab[0][224..231]
            -43, -43, -44, -44, -45, -45, -46, -46, // mettab[0][232..239]
            -46, -47, -47, -48, -48, -49, -49, -49, // mettab[0][240..247]
            -50, -50, -51, -51, -52, -52, -53, -57  // mettab[0][248..255]
        },
        {
            -57, -53, -53, -52, -52, -51, -51, -50, // mettab[1][  0..  7]
            -50, -49, -49, -49, -48, -48, -47, -47, // mettab[1][  8.. 15]
            -46, -46, -46, -45, -45, -44, -44, -43, // mettab[1][ 16.. 23]
            -43, -42, -42, -42, -41, -41, -40, -40, // mettab[1][ 24.. 31]
            -39, -39, -39, -38, -38, -37, -37, -36, // mettab[1][ 32.. 39]
            -36, -35, -35, -35, -34, -34, -33, -33, // mettab[1][ 40.. 47]
            -32, -32, -32, -31, -31, -30, -30, -29, // mettab[1][ 48.. 55]
            -29, -29, -28, -28, -27, -27, -26, -26, // mettab[1][ 56.. 63]
            -26, -25, -25, -24, -24, -23, -23, -23, // mettab[1][ 64.. 71]
            -22, -22, -21, -21, -21, -20, -20, -19, // mettab[1][ 72.. 79]
            -19, -18, -18, -18, -17, -17, -16, -16, // mettab[1][ 80.. 87]
            -16, -15, -15, -15, -14, -14, -13, -13, // mettab[1][ 88.. 95]
            -13, -12, -12, -12, -11, -11, -11, -10, // mettab[1][ 96..103]
            -10,  -9,  -9,  -9,  -8,  -8,  -8,  -8, // mettab[1][104..111]
            -7,  -7,  -7,  -6,  -6,  -6,  -5,  -5, // mettab[1][112..119]
            -5,  -5,  -4,  -4,  -4,  -4,  -3,  -3, // mettab[1][120..127]
            -3,  -3,  -3,  -2,  -2,  -2,  -2,  -2, // mettab[1][128..135]
            -1,  -1,  -1,  -1,  -1,  -1,   0,   0, // mettab[1][136..143]
            0,   0,   0,   0,   0,   0,   1,   1, // mettab[1][144..151]
            1,   1,   1,   1,   1,   1,   1,   1, // mettab[1][152..159]
            1,   2,   2,   2,   2,   2,   2,   2, // mettab[1][160..167]
            2,   2,   2,   2,   2,   2,   2,   2, // mettab[1][168..175]
            2,   2,   2,   2,   2,   2,   2,   2, // mettab[1][176..183]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][184..191]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][192..199]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][200..207]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][208..215]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][216..223]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][224..231]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][232..239]
            3,   3,   3,   3,   3,   3,   3,   3, // mettab[1][240..247]
            3,   3,   3,   3,   3,   3,   3,   3  // mettab[1][248..255]
        }
    };
*/
/*
#define	ENCODE(sym,encstate){\
unsigned long _tmp;\
\
_tmp = (encstate) & npoly1;\
_tmp ^= _tmp >> 16;\
(sym) = partab_pi4[(_tmp ^ (_tmp >> 8)) & 0xff] << 1;\
_tmp = (encstate) & npoly2;\
_tmp ^= _tmp >> 16;\
(sym) |= partab_pi4[(_tmp ^ (_tmp >> 8)) & 0xff];\
}
struct node {
  unsigned long encstate;	// Encoder state of next node
  long gamma;		        // Cumulative metric to this node
  int metrics[4];		// Metrics indexed by all possible tx syms
  int tm[2];		        // Sorted metrics for current hypotheses
  int i;			// Current branch being tested
};
int fano(
	 unsigned int  *metric,	   // Final path metric (returned value)
	 unsigned int  *cycles,	   // Cycle count (returned value)
	 unsigned int  *maxnp,     // Progress before timeout (returned value)
	 unsigned char *data,	   // Decoded output data
	 unsigned char *symbols,   // Raw deinterleaved input symbols
	 unsigned int nbits,	   // Number of output bits
	 int mettab[2][256],	   // Metric table, [sent sym][rx symbol]
	 int delta,		   // Threshold adjust parameter
	 unsigned int maxcycles)   // Decoding timeout in cycles per bit
{
  struct node *nodes;		   // First node
  struct node *np;	           // Current node
  struct node *lastnode;	   // Last node
  struct node *tail;		   // First node of tail
  int t;			   // Threshold
  int  m0,m1;
  int ngamma;
  unsigned int lsym;
  unsigned int i;

  if((nodes = (struct node *)malloc((nbits+1)*sizeof(struct node))) == NULL) {
    printf("malloc failed\n");
    return 0;
  }
  lastnode = &nodes[nbits-1];
  tail = &nodes[nbits-31];
  *maxnp = 0;


  for(np=nodes;np <= lastnode;np++) {
    np->metrics[0] = mettab[0][symbols[0]] + mettab[0][symbols[1]];
    np->metrics[1] = mettab[0][symbols[0]] + mettab[1][symbols[1]];
    np->metrics[2] = mettab[1][symbols[0]] + mettab[0][symbols[1]];
    np->metrics[3] = mettab[1][symbols[0]] + mettab[1][symbols[1]];
    symbols += 2;
  }
  np = nodes;
  np->encstate = 0;

// Compute and sort branch metrics from root node
  ENCODE(lsym,np->encstate);	// 0-branch (LSB is 0)
  m0 = np->metrics[lsym];



  m1 = np->metrics[3^lsym];
  if(m0 > m1) {
    np->tm[0] = m0;                             // 0-branch has better metric
    np->tm[1] = m1;
  } else {
    np->tm[0] = m1;                             // 1-branch is better
    np->tm[1] = m0;
    np->encstate++;	                        // Set low bit
  }
  np->i = 0;	                                // Start with best branch
  maxcycles *= nbits;
  np->gamma = t = 0;

  // Start the Fano decoder
  for(i=1;i <= maxcycles;i++) {
    if((int)(np-nodes) > (int)*maxnp) *maxnp=(int)(np-nodes);
#ifdef	debug
    printf("k=%ld, g=%ld, t=%d, m[%d]=%d, maxnp=%d, encstate=%lx\n",
	   np-nodes,np->gamma,t,np->i,np->tm[np->i],*maxnp,np->encstate);
#endif

    ngamma = np->gamma + np->tm[np->i];
    if(ngamma >= t) {
      if(np->gamma < t + delta) {               // Node is acceptable

	while(ngamma >= t + delta) t += delta;
      }
      np[1].gamma = ngamma;                     // Move forward
      np[1].encstate = np->encstate << 1;
      if( ++np == (lastnode+1) ) {
	break;	                                // Done!
      }


      ENCODE(lsym,np->encstate);
      if(np >= tail) {

	np->tm[0] = np->metrics[lsym];
      } else {
	m0 = np->metrics[lsym];
	m1 = np->metrics[3^lsym];
	if(m0 > m1) {
	  np->tm[0] = m0;                       // 0-branch is better
	  np->tm[1] = m1;
	} else {
	  np->tm[0] = m1;                       // 1-branch is better
	  np->tm[1] = m0;
	  np->encstate++;	                // Set low bit
	}
      }
      np->i = 0;	                        // Start with best branch
      continue;
    }
    // Threshold violated, can't go forward
    for(;;) {                                   // Look backward
      if(np == nodes || np[-1].gamma < t) {

	t -= delta;
	if(np->i != 0) {
	  np->i = 0;
	  np->encstate ^= 1;
	}
	break;
      }
      // Back up
      if(--np < tail && np->i != 1) {
	np->i++;                          // Search next best branch
	np->encstate ^= 1;
	break;
      }                                   // else keep looking back
    }
  }
  *metric =  np->gamma;	                  // Return the final path metric

  // Copy decoded data to user's buffer
  nbits >>= 3;
  np = &nodes[7];
  while(nbits-- != 0) {
    *data++ = np->encstate;
    np += 8;
  }
  *cycles = i+1;

  free(nodes);
  if(i >= maxcycles) return -1;	          // Decoder timed out
  return 0;		                  // Successful completion
}

*/
/*
#define	ENCMAC(sym,encstate){\
	unsigned long _tmp;\
\
	_tmp = (encstate) & npoly1;\
	_tmp ^= _tmp >> 16;\
	(sym) = partab_pi4[(_tmp ^ (_tmp >> 8)) & 0xff] << 1;\
	_tmp = (encstate) & npoly2;\
	_tmp ^= _tmp >> 16;\
	(sym) |= partab_pi4[(_tmp ^ (_tmp >> 8)) & 0xff];\
}
*/
void DecoderMs::fano232(char *symbol,int beg,int nbits,int maxcycles,unsigned char *dat,int &ncycles,int &ierr)
{

    const int MAXBITS=104;//103;
    int metrics[4][MAXBITS];//(0:3,0:MAXBITS)
    int nstate[MAXBITS];// = {0};
    int tm[2][MAXBITS]; //(0:1,0:MAXBITS)
    int ii[MAXBITS];
    int gamma[MAXBITS];
    bool noback=false;
    //int metric = 0;
    int i = 0;

    int ntail=nbits-31;
    int i4a=0;
    int i4b=0;
    int np;
    zero_int_beg_end(nstate,0,MAXBITS);
    //ndelta_pi4 = 70.0;  //170 e sega

    //qDebug()<<"111111symbol[j]"<<beg<<nbits-1;

    for (np = 0; np <= (nbits-1); np++)
    {//do np=0,nbits-1
        int j=2*np;

        i4a=symbol[j+beg]+off_mettab_pi4;
        i4b=symbol[j+1+beg]+off_mettab_pi4;
        metrics[0][np] = mettab_pi4_[0][i4a] + mettab_pi4_[0][i4b];//(i4b,0)
        metrics[1][np] = mettab_pi4_[0][i4a] + mettab_pi4_[1][i4b];//(i4b,1)
        metrics[2][np] = mettab_pi4_[1][i4a] + mettab_pi4_[0][i4b];//(i4b,0)
        metrics[3][np] = mettab_pi4_[1][i4a] + mettab_pi4_[1][i4b];//(i4b,1)
        //qDebug()<<"i4a"<<mettab_pi4_[0][i4b];


        /*i4a=symbol[j+beg]+128;
        i4b=symbol[j+1+beg]+128;
        if(i4a<0) i4a=0;
        if(i4b<0) i4b=0;
        if(i4a>255) i4a=255;
        if(i4b>255) i4b=255;

        metrics[0][np] = mettab_pi4_1[0][i4a] + mettab_pi4_1[0][i4b];//(i4b,0)
        metrics[1][np] = mettab_pi4_1[0][i4a] + mettab_pi4_1[1][i4b];//(i4b,1)
        metrics[2][np] = mettab_pi4_1[1][i4a] + mettab_pi4_1[0][i4b];//(i4b,0)
        metrics[3][np] = mettab_pi4_1[1][i4a] + mettab_pi4_1[1][i4b];//(i4b,1)*/
        //qDebug()<<"iii================"<<i4a<<i4b<<np;
    }

    np=0;
    nstate[np]=0;

    //Left Shift 	ISHFT 	ISHFT(N,M) (M > 0) 	<< 	n<<m 	n shifted left by m bits
    //Right Shift 	ISHFT 	ISHFT(N,M) (M < 0) 	>> 	n>>m 	n shifted right by m bits
    // IEOR(N,M)   n^m

    int n=(nstate[np] & npoly1);
    n=(n ^ (n >> 16));
    int lsym=partab_pi4[((n ^ (n >> 8)) & 255)];
    //int lsym=partab_pi4[((n ^ (n >> 8)) & 0xff)] << 1;
    n=(nstate[np] & npoly2);
    n=(n ^ (n >> 16));
    lsym=lsym+lsym+partab_pi4[((n ^ (n >> 8)) & 255)];
    //lsym |= partab_pi4[((n ^ (n >> 8)) & 0xff)];
    //int lsym = 0;
    //int n = 0;
    //ENCMAC(nstate[np],lsym);

    int m0=metrics[lsym][np];
    int m1=metrics[(3 ^ lsym)][np];
    if (m0>m1) //c++   ==.EQ. !=.NE. >.GT. <.LT. >=.GE. <=.LE.
    {
        tm[0][np]=m0;
        tm[1][np]=m1;
    }
    else
    {
        tm[0][np]=m1;
        tm[1][np]=m0;
        nstate[np]=nstate[np] + 1;
    }

    ii[np]=0;
    gamma[np]=0;
    int nt=0;

    //int max = 0;

    for (i = 1; i < (nbits*maxcycles); i++)  //c++   ==.EQ. !=.NE. >.GT. <.LT. >=.GE. <=.LE.
    {//do i=1,nbits*maxcycles
        int ngamma=gamma[np] + tm[ii[np]][np];
        if (ngamma>=nt)
        {
            if (gamma[np]<(nt+ndelta_pi4)) nt=nt + ndelta_pi4 * ((ngamma-nt)/ndelta_pi4);
            gamma[np+1]=ngamma;
            nstate[np+1]=(nstate[np] << 1);
            np=np+1;

            //if (np>max)
            //max=np;

            if (np==nbits) goto c100;
            //if (np>=68) goto c100;

            //if(np>87 && np<89)
            //qDebug()<<"iii================"<<np<<nbits;

            n=(nstate[np] & npoly1);
            n=(n ^ (n >> 16));
            lsym=partab_pi4[((n ^ (n >> 8)) & 255)];
            //lsym=partab_pi4[((n ^ (n >> 8)) & 255)] << 1;
            n=(nstate[np] & npoly2);
            n=(n ^ (n >> 16));
            lsym=lsym+lsym+partab_pi4[((n ^ (n >> 8)) & 255)];
            //lsym |= partab_pi4[((n ^ (n >> 8)) & 255)];
            //ENCMAC(nstate[np],lsym);

            if (np>=ntail)
            {
                tm[0][np]=metrics[lsym][np];
            }
            else
            {
                m0=metrics[lsym][np];
                m1=metrics[(3 ^ lsym)][np];
                if (m0>m1)
                {
                    tm[0][np]=m0;
                    tm[1][np]=m1;
                }
                else
                {
                    tm[0][np]=m1;
                    tm[1][np]=m0;
                    nstate[np]=nstate[np] + 1;
                }
            }
            ii[np]=0;
        }
        else
        {
            while (true)
            {
                noback=false;
                if (np==0) noback=true;
                if (np>0)
                {
                    if (gamma[np-1]<nt) noback=true;
                }
                if (noback)
                {
                    nt=nt-ndelta_pi4;
                    if (ii[np]!=0)
                    {
                        ii[np]=0;
                        nstate[np]=(nstate[np] ^ 1);
                    }
                    break;
                }
                np=np-1;
                if (np<ntail && ii[np]!=1)
                {
                    ii[np]=ii[np]+1;
                    nstate[np]=(nstate[np] ^ 1);
                    break;
                }
            }
        }
    }
    i=nbits*maxcycles;

c100:
    //metric=gamma[np];

    int nbytes=(nbits+7)/8; //=13     qDebug()<<"iii================"<<nbytes;
    np=7;
    for (int j = 0; j <= nbytes-1; j++)
    {
        i4a=nstate[np];
        dat[j]=i4a;
        np=np+8;
    }
    dat[nbytes]=0;
    ncycles=i+1;
    ierr=0;
    if (i>=maxcycles*nbits) ierr=-1;


    /*if (max>=64)
    {
        if (max==73)
            qDebug()<<"famo max============================ OK OK OK ="<<max<<nbits;
        else
            qDebug()<<"famo max================ NO ="<<max<<nbits;
        //qDebug()<<dat[0]<<dat[1]<<dat[2]<<dat[3]<<dat[4]<<dat[5]<<dat[6]
        //<<dat[7]<<dat[8]<<dat[9]<<dat[10]<<dat[11]<<dat[12];
    }*/
}
void DecoderMs::interleavepi4(char *id,int beg,int ndir)
{
    int itmp[207];

    if (first_interleavepi4)
    {
        int k=-1;
        for (int i = 0; i < 256; i++)
        {
            int m=i;
            int n=(m & 1);
            n=2*n + (m/2 & 1);
            n=2*n + (m/4 & 1);
            n=2*n + (m/8 & 1);
            n=2*n + (m/16 & 1);
            n=2*n + (m/32 & 1);
            n=2*n + (m/64 & 1);
            n=2*n + (m/128 & 1);
            if (n<=G_NSYM-1) //(n<=205) jt-4->G_NSYM-2
            {
                k=k+1;
                j0_pi4[k]=n;
                //qDebug()<<k;
            }
        }
        //qDebug()<<"6==================="<<k;
        first_interleavepi4=false;
    }

    //qDebug()<<j0_pi4[0]<<j0_pi4[1]<<j0_pi4[2]<<j0_pi4[3]<<j0_pi4[4]<<j0_pi4[5]<<j0_pi4[6]<<j0_pi4[204]<<j0_pi4[205];
    if (ndir==1)
    {
        for (int i = 0; i < G_NSYM-0; i++)
        {
            itmp[j0_pi4[i]]=id[i+beg];
        }
    }
    else
    {
        for (int i = 0; i < G_NSYM-0; i++)
        {
            itmp[i]=id[j0_pi4[i]+beg];
        }
    }
    for (int i = 0; i < G_NSYM-0; i++)
    {
        id[i+beg]=itmp[i];
    }
}

void DecoderMs::getmetpi4()
{
    double xx0[256]=
        {1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
         0.988, 1.000, 0.991, 0.993, 1.000, 0.995, 1.000, 0.991,
         1.000, 0.991, 0.992, 0.991, 0.990, 0.990, 0.992, 0.996,
         0.990, 0.994, 0.993, 0.991, 0.992, 0.989, 0.991, 0.987,
         0.985, 0.989, 0.984, 0.983, 0.979, 0.977, 0.971, 0.975,
         0.974, 0.970, 0.970, 0.970, 0.967, 0.962, 0.960, 0.957,
         0.956, 0.953, 0.942, 0.946, 0.937, 0.933, 0.929, 0.920,
         0.917, 0.911, 0.903, 0.895, 0.884, 0.877, 0.869, 0.858,
         0.846, 0.834, 0.821, 0.806, 0.790, 0.775, 0.755, 0.737,
         0.713, 0.691, 0.667, 0.640, 0.612, 0.581, 0.548, 0.510,
         0.472, 0.425, 0.378, 0.328, 0.274, 0.212, 0.146, 0.075,
         0.000,-0.079,-0.163,-0.249,-0.338,-0.425,-0.514,-0.606,
         -0.706,-0.796,-0.895,-0.987,-1.084,-1.181,-1.280,-1.376,
         -1.473,-1.587,-1.678,-1.790,-1.882,-1.992,-2.096,-2.201,
         -2.301,-2.411,-2.531,-2.608,-2.690,-2.829,-2.939,-3.058,
         -3.164,-3.212,-3.377,-3.463,-3.550,-3.768,-3.677,-3.975,
         -4.062,-4.098,-4.186,-4.261,-4.472,-4.621,-4.623,-4.608,
         -4.822,-4.870,-4.652,-4.954,-5.108,-5.377,-5.544,-5.995,
         -5.632,-5.826,-6.304,-6.002,-6.559,-6.369,-6.658,-7.016,
         -6.184,-7.332,-6.534,-6.152,-6.113,-6.288,-6.426,-6.313,
         -9.966,-6.371,-9.966,-7.055,-9.966,-6.629,-6.313,-9.966,
         -5.858,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,
         -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,
         -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,
         -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,
         -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,
         -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966};

    double bias=0.45;//0.5
    double scale=50.0;//be6e 50  tested 47
    ndelta_pi4=int(3.4*scale);
    for (int i = 0; i < 256; i++)
    {
        double xx=xx0[i];
        if (i>=160) xx=xx0[160] - ((double)i-160.0)*6.822/65.3;//0.1666666;//
        mettab_pi4_[0][(i-128)+off_mettab_pi4]=int(scale*(xx-bias));
        if (i>=1) mettab_pi4_[1][(128-i)+off_mettab_pi4]=mettab_pi4_[0][(i-128)+off_mettab_pi4];
    }
    mettab_pi4_[1][-128+off_mettab_pi4]=mettab_pi4_[1][-127+off_mettab_pi4];

    /*double bias=0.45;//0.5
    double scale=10.0;//be6e 50  tested 47
    ndelta_pi4=50.0;
    for (int i = 0; i < 256; i++)
    {
        double xx=xx0[i];
        mettab_pi4_[0][(i-128)+off_mettab_pi4]=int(scale*(xx-bias));
        if (i>=1) mettab_pi4_[1][(128-i)+off_mettab_pi4]=mettab_pi4_[0][(i-128)+off_mettab_pi4];
    }*/

    //for (int i = 248; i < 256; i++)
    //qDebug()<<mettab_pi4_[0][i];
}

void DecoderMs::extractpi4(double *sym0,int &ncount,QString &decoded)
{
    double sym[207];
    char symbol[207];
    unsigned char data1[13]={0}; //unsigned char unsigned char can be 0,..255 and char can be -128 , .. +127
    pomAll.zero_double_beg_end(sym,0,207);
    //zero_int_beg_end(symbol,0,207);
    for (int i = 0; i < G_NSYM; i++)
        symbol[i]=0;

    if (first_extractpi4)
    {
        getmetpi4();
        first_extractpi4=false;
    }

    double amp=30.0;// be6e 30.0
    int limit=20000;//be6e 10000

    double ave0=0.0;
    for (int i = 0; i < G_NSYM; i++)
        ave0 += sym0[i];
    ave0 = ave0 / (double)G_NSYM;
    for (int i = 0; i < G_NSYM; i++)
        sym[i]=sym0[i]-ave0;
    double sq=dot_product_da_da(sym,sym,G_NSYM,0);
    double rms0=sqrt(sq/(double)((double)G_NSYM-0.0));
    if(rms0==0.0)// no div by zero
    	rms0=1.0;
    for (int i = 0; i < G_NSYM; i++)
        sym[i]=sym[i]/rms0;

    //int mins = 0.0;
    //int maxs = 0.0;
    for (int j = 0; j < G_NSYM; j++)
    {//do j=1,207
        int n=int(amp*sym[j]);
        if (n<-128) n=-128;
        if (n>127) n=127;
        symbol[j]=n;
        //qDebug()<<"symbol[j]"<<symbol[j];

        /*if(mins>symbol[j])
           mins=symbol[j];
        if(maxs<symbol[j])
           maxs=symbol[j];*/
    }
    //qDebug()<<"minsminsmins="<<mins<<maxs;
    /*QString sss;
          for (int i = 0; i <146; i++)
          {
              //ss1_[i][j]=0.0;
              //sss.append(QString("%1").arg(sym[i],0,'f',2));
              sss.append(QString("%1").arg((int)symbol[i]));
              sss.append(",");
          }
          qDebug()<<"1sss="<<sss;*/


    int nbits=42; //72  42
    int ncycles=0;
    ncount=-1;
    decoded="";

    interleavepi4(symbol,0,-1);

    fano232(symbol,0,nbits+31,limit,data1,ncycles,ncount);

    /*unsigned int  *metric = new unsigned int[1000];
    unsigned int  *cycles = new unsigned int[1000];
    unsigned int  *maxnp = new unsigned int[1000];
    unsigned int maxcycles = 10000;
    unsigned char symbolss[146];
    for (int j = 0; j < G_NSYM; j++)
    	{
    	int i4a = symbol[j]+128;
    	if(i4a<0) i4a=0;
        if(i4a>255) i4a=255;
        symbolss[j]=i4a;
        }
      ncount = fano(metric,cycles,maxnp,data1,symbolss,nbits+31,mettab_pi4_1,ndelta_pi4,maxcycles); */

    //qDebug()<<"ncount"<<ncount<<"data1"<<data1[0]<<data1[1]<<data1[2]<<data1[3]<<data1[4]<<data1[5]<<data1[6]
    //<<data1[7]<<data1[8]<<data1[9]<<data1[10]<<data1[11]<<data1[12];
    //PI4 120300 6 -17 dB 1.1 s -36 Hz 32 W Freq 646 Hz > 00000000
    if (ncount>=0)//0=ok  "-1=no ok go to avg"  "-2no real coll no go in avg"
    {
        long long int data_val = (long long int)data1[0] << 34;
        data_val |= (long long int)data1[1] << 26;
        data_val |= (long long int)data1[2] << 18;
        data_val |= (long long int)data1[3] << 10;
        data_val |= (long long int)data1[4] << 2;
        data_val |= (long long int)data1[5] >> 6;

        for (int i = 7; i >= 0; i--)
        {
            //currentResult_.dataGram[i] = PI4_valid_chars[data_val % 38];
            decoded.prepend(PI4_valid_chars[data_val % 38]);
            data_val /= 38;
        }
        //qDebug()<<"DDDDDDDDDD"<<decoded;
        if (decoded.mid(0,8)=="00000000" || decoded.mid(0,8)=="AWDA5SEY"/* || decoded.mid(0,8)=="PTGIVNNM"*/)//00000000
        {
            decoded="";
            ncount=-2;
        }
    }
}
/*void sq_filter(double *d,int d_c)
{


}*/
void DecoderMs::decodepi4(double *dat,int npts,double dtx,double nfreq/*,double flip*/,int mode4,
                          QString &decoded,int &nfano)
{
    double dt=2.0/DEC_SAMPLE_RATE; //2.0/DEC_SAMPLE_RATE;
    //double df=DEC_SAMPLE_RATE/N_SYMMAX;
    double df=DEC_SAMPLE_RATE/2048.0;
    //double df=0.5*DEC_SAMPLE_RATE/1024.0;
    //  double DEC_SAMPLE_RATE/2048.0;//ok tested hv
    int nsym=G_NSYM-1;//206;
    double amp=15.0;//15
    int istart=int((dtx+0.0)/dt);
    //qDebug()<<"1istart"<<istart;
    //                                       if (istart<0) istart=0;
    //istart=13969;
    //qDebug()<<"2istart"<<istart;
    int nchips=0;

    //ichbest=-1;
    double complex c0,cz0,c1,cz1;
    int k=istart;
    double phi0=0.0;
    double phi1=0.0;
    double sym[207];
    //double sqall[40];

    //short *ddd = new short[180000];
    //int c_ddd =0;
    /*double complex *cx = new double complex[npts];
    int NMAX=512*1024;
    double *s = new double[NMAX];
    analytic(dat,0,npts,25,s,cx); 
    for (int i = 0; i < npts; i++)
    	cx[i]=cx[i]*1000.0;*/

    //short *ddd = new short[180000];
    //int c_ddd =0;


    //ddd[c_ddd]=(creal(c0))*500.0;
    //c_ddd++;
    //emit EmitDataToSaveInFile(ddd,c_ddd,"LZ2HV_LZ2HV_PI4_170508_000000");


    //for (int ich = ich1_pi4; ich <= ich2_pi4; ich++)
    //for (int ich = 1; ich <= 1; ich++)
    //{
    //qDebug()<<"ichichichichichichich"<<ich<<nch_pi4[ich];
    nchips=mode4;
    int nspchip=((double)(N_SYMMAX/2)/(double)nchips);

    k=istart; //qDebug()<<"istart"<<istart;
    phi0=0.0;
    phi1=0.0;
    //double fac2=1.e-8 * sqrt((double)mode4);
    double fac2=0.0001 * sqrt((double)mode4);
    //double f0,f1;//,f2,f3;
    //double dphi0,dphi1;//,dphi2,dphi3;
    //double sq0,sq1;//,sq2,sq3;
    //double sq01,sq11;


    for (int j = 0; j < nsym+1; j++) //dtx+0.0)/dt
    {
        double f0=(nfreq) + (double)(npr2_pi4[j]*mode4)*df;
        double f1=(nfreq) + (double)((2+npr2_pi4[j])*mode4)*df;

        double dphi0=twopi*dt*f0;
        double dphi1=twopi*dt*f1;
        double sq0=0.0;
        double sq1=0.0;

        for (int nc = 0; nc < nchips; nc++)
        {
            c0=0.0+0.0*I;
            c1=0.0+0.0*I;
            for (int i = 0; i < nspchip; i++)
            {
                //if (phi > twopi) phi -= twopi;
                phi0=phi0+dphi0;
                phi1=phi1+dphi1;
                cz0=(cos(phi0)-sin(phi0)*I);
                cz1=(cos(phi1)-sin(phi1)*I);

                if (k<npts)
                {
                    if (k>=0)// hv i -dt
                    {
                        c0 += cz0*dat[k];
                        c1 += cz1*dat[k];

                        //ddd[c_ddd]=(short)1000.0*(dat[k]*sin(phi));
                        //ddd[c_ddd]=(short)10.0*(cimag(cz1)*200.0);
                        //ddd[c_ddd]=(short)1000.0*(sin(phi1));
                        //ddd[c_ddd]=(short)1000.0*dat[k];
                        //ddd[c_ddd]=0.1*(cabs(c1)-cabs(c0));
                        //ddd[c_ddd]=(creal(c0))*500.0;
                        //c_ddd++;
                    }
                }
                k++;
            }
            sq0 += pomAll.ps_hv(c0);//0.01;0.0039
            sq1 += pomAll.ps_hv(c1);//0.01;
        }
        //sq0=fac2*sq0;
        //sq1=fac2*sq1;
        //sq0=sq0;
        //sq1=sq1;
        sq0=sqrt(fac2*sq0);//*0.01;
        sq1=sqrt(fac2*sq1);//*0.01;

        double rsym=amp*(sq1-sq0);//a[j]=(fmax(ss1,ss3) - fmax(ss0,ss2))/sqrt(wsum);

        if (j>=0) // if(j>=1)
        {
            rsymbol_pi4_[j]=rsym;
            sym[j]=rsym;
        }
    }
    int ncount=-1;

    //emit EmitDataToSaveInFile(ddd,c_ddd,"LZ2HV_LZ2HV_PI4_170508_000000");
    //qDebug()<<"kkkk"<<c_ddd;

    /*QString sss;
    for (int i = 0; i <146; i++)
    {
        //ss1_[i][j]=0.0;
        sss.append(QString("%1").arg(sym[i],0,'f',0));
        //sss.append(QString("%1").arg(s_sh65[j]));
        sss.append(",");
    }
    qDebug()<<"1sss="<<sss;*/

    extractpi4(sym,ncount,decoded);

    /*double sss[146]={2,0,1,0,0,3,3,3,3,2,3,2,1,2,1,2,0,3,2,2,0,3,2,2,0,1,1,0,0,1,3,1,3,0,2,1,1,3,3,1,
                     2,0,1,3,2,1,3,3,3,2,1,2,3,1,2,1,1,0,3,2,0,2,0,0,1,3,3,1,3,2,3,2,3,0,2,0,0,2,1,3,
                     3,3,1,2,3,0,0,3,0,2,3,2,1,0,2,0,2,1,0,0,1,1,0,2,0,2,2,3,3,2,2,2,2,3,1,0,0,1,3,3,
                     0,1,3,1,2,1,3,0,3,0,3,0,1,2,2,0,2,3,1,3,2,0,0,2,1,1};
    extractpi4(sss,ncount,decoded);*/

    nfano=0; //ncount ->0=ok  "-1=no ok go to avg"  "-2no real coll no go in avg"
    if (ncount>=0)
    {
        nfano=1; //nfano -> 1=ok  "0=no ok go to avg"  "-1no real coll no go in avg"
    }
    else if (ncount==-2)
    {
        nfano=-1;
    }

    //nfano = ncount;

    //qual=0.0;
    //!     if(ndepth.ge.1) then
    /*if(iand(ndepth,32).eq.32) then
       call deep4(sym(2),neme,flip,mycall,theircall,theirgrid,deepmsg,qual)
       if(qual.gt.qbest) then
          qbest=qual
          deepbest=deepmsg
          ichbest=ich
       endif
    endif*/
    //}
    //delete cx;
    //delete s;
    /*if (qbest>qtop)
    {
        qtop=qbest;
    }*/
    //qual=qbest;
//c3:
    //return;
}
void DecoderMs::xcorpi4(double s2_[770][1260],int ipk,int nsteps,int nsym,int lag1,int lag2,int mode4,
                        double *ccf,double &ccf0,int &lagpk,double &flip)
{
    const int NSMAX=770;   //525;
    double a[NSMAX];
    int lagmin = 0;
    //zero_double_beg_end(a,0,770);

    if (first_xcorpi4)
    {
        for (int i = 0; i < nsym; i++)
        {
            pr2_pi4[i]=2.0*npr2_pi4[i]-1;
        }
        first_xcorpi4=false;
    }
    double ccfmax=0.0;
    double ccfmin=0.0;
    double nw=mode4;
    //qDebug()<<"1111ipkkkkkkkkkkkkkkkkkkkkkkk"<<ipk;
    for (int j = 0; j < nsteps; j++)
    {
        int n=2*mode4;
        if (mode4==1)
        {
            //a[j]=fmax(s2(ipk+n,j),s2(ipk+3*n,j)) - fmax(s2(ipk  ,j),s2(ipk+2*n,j))
            a[j]=fmax(s2_[j][ipk+n],s2_[j][ipk+3*n]) - fmax(s2_[j][ipk],s2_[j][ipk+2*n]);
        }
        else
        {

            int kz=fmax(1,nw/2);
            double ss0=0.0;
            double ss1=0.0;
            double ss2=0.0;
            double ss3=0.0;
            double wsum=0.0001;// hv vazno
            int beg = -kz+1;
            if (beg<0) beg = 0;//hv inportent 1.40
            for (int k = beg; k < kz-0; k++)// problem is -> kz-1
            {
                //qDebug()<<"222ipk"<<ipk+k<<k;
                double w=double(kz-abs(k))/(double)nw;
                wsum=wsum+w;
                ss0=ss0 + w*s2_[j][ipk    +k];
                ss1=ss1 + w*s2_[j][ipk+  n+k];
                ss2=ss2 + w*s2_[j][ipk+2*n+k];
                ss3=ss3 + w*s2_[j][ipk+3*n+k];
            }
            double div = sqrt(wsum);
            if(div==0.0)
            	div=1.0;
            a[j]=(fmax(ss1,ss3) - fmax(ss0,ss2))/div;
        }

    }
    //qDebug()<<"222ipkkkkkkkkkkkkkkkkkkkkkkk"<<lag1<<lag2<<nsteps;
    for (int lag = lag1; lag < lag2; lag++)
    {
        double x=0.0;
        for (int i = 0; i < nsym; i++)
        {
            int j=2*i-0+lag;
            if (j>=0 && j<nsteps) x=x+a[j]*pr2_pi4[i]; // *0.01  if(j>=1 && j<=nsteps)
        }

        ccf[lag]=2.0*x;
        if (ccf[lag]>ccfmax)
        {
            ccfmax=ccf[lag];
            lagpk=lag;
        }
        if (ccf[lag]<ccfmin)
        {
            ccfmin=ccf[lag];
            lagmin=lag;
        }
    }

    ccf0=ccfmax;
    flip=1.0;
    if (-ccfmin>ccfmax)
    {
        for (int lag = lag1; lag < lag2; lag++)
        {
            ccf[lag]=-ccf[lag];
        }
        lagpk=lagmin;
        ccf0=-ccfmin;
        flip=-1.0;
    }
}
void DecoderMs::smo_pi4(double*x,int x_begin,int npts,double*y,double nadd)
{
    int nh=nadd/2;
    for (int i = 1+nh; i < npts-nh; i++)
    {
        double sum=0.0;
        for (int j = -nh; j < nh; j++)
        {
            sum=sum + x[i+(j+x_begin)];
        }
        y[i]=sum;
    }
    for (int i = 0; i < npts; i++)
        x[i+x_begin]=y[i];

    pomAll.zero_double_beg_end(x,0,nh);
    pomAll.zero_double_beg_end(x,npts-nh+0,npts);
}
void DecoderMs::flat1b(double *psavg,int nsmo,double s2_[770][1260],int nh,int nsteps)
{
    double x[8192];
    double *temp = new double[nsmo];//double temp[nsmo];

    int ia=nsmo/2 + 1;
    int ib=nh - nsmo/2 - 1;
    for (int i = ia; i < ib; i++)
    {

        for (int z = 0; z < nsmo; z++)
            temp[z]=psavg[(i-nsmo/2)+z];
        x[i] = pomAll.pctile_shell(temp,nsmo,50);
    }
    delete [] temp;
    for (int i = 0; i < ia; i++)
    {
        x[i]=x[ia];
    }
    for (int i = ib; i < nh; i++)
    {
        x[i]=x[ib-1];
    }
    for (int i = 0; i < nh; i++)
    {
    	double div = x[i];
    	if(div==0.0)
    		div=1.0;
        psavg[i]=psavg[i]/div;
        for (int j = 0; j < nsteps; j++)
        {
            s2_[j][i]=s2_[j][i]/div;
        }
    }
}
void DecoderMs::pspi4(double *dat,int beg,int nfft,double *s)
{
    const int NMAX=N_SYMMAX+50;
    double dat2[NMAX+10];
    double complex c[NMAX+10];

    int nh=nfft/2;   //qDebug()<<"jjjjjjjjjjj"<<beg<<nh+beg;
    for (int i = 0; i < nh; i++)
    {
        dat2[i]=dat[i+beg]/128.0;
    }
    for (int i = nh; i < nfft; i++)
    {
        dat2[i]=0.0;
    }

    f2a.four2a_d2c(c,dat2,nfft,-1,0);
    //qDebug()<<"sss="<<beg<<nh+beg;
    double fac=1.0/(double)nfft;
    for (int i = 0; i < nh; i++)
    {
        s[i]=fac*pomAll.ps_hv(c[i]);
    }
}
void DecoderMs::syncpi4(double *dat,int jz,int ntol,int NFreeze,int MouseDF,int mode,int mode4,
                        double &dtx,double &dfx,double &snrx,double &snrsync,double *ccfblue,double *ccfred1,
                        double &flip,double &width/*,double *ps0*/)
{
    //jz = fmin(180000 ,jz);
    const int NFFTMAX=N_SYMMAX;//2520;
    int nsym = G_NSYM;//207; 146

    const int NHMAX=NFFTMAX/2; // 1260
    int NSMAX=770; //for 12000hz=751 no-525;

    double ccfred_p[900+40];
    double *ccfred = &ccfred_p[450+20];
    //double red_p[900+40];
    //double *red = &red_p[450+20];

    double psavg[NHMAX];
    //double tmp[NHMAX];
    //double s2_[NSMAX][NHMAX];
    double (*s2_)[1260]=new double[NSMAX][1260];

    int nfft=NFFTMAX;//NFFTMAX;
    int nh=nfft/2;
    int nq=nfft/4;
    int nsteps=jz/nq - 0; //jz/nq - 1;
    double df=0.5*DEC_SAMPLE_RATE/2048.0;//0.5
    int lagpk0 = 0;
    int lagpk = 0;
    double ccf0 = 0.0;

    /*for (int i = 0; i < NSMAX; i++)
        {
            for (int j = 0; j < 1200; j++)   // row major = i
                s2_[i][j]=0.0;
    }*/



    pomAll.zero_double_beg_end(psavg,0,nh);
    if (mode==-999) width=0.0;
    //qDebug()<<"dat c="<<nsteps<<nh;
    for (int j = 0; j < nsteps; j++)
    {
        int k=(j-0)*nq + 0;//(j-1)*nq + 1
        //qDebug()<<"j="<<j;
        pspi4(dat,k,nfft,s2_[j]);
        for (int i = 0; i < nh; i++)
            psavg[i]=psavg[i] + s2_[j][i];
    }

    int nsmo=fmin(10*mode4,150);//40
    flat1b(psavg,nsmo,s2_,nh,nsteps);

    /*QString sss;
    for (int i = 0; i < nh; i++)
    {
        //for (int j = 0; j < 1260; j++)
        	//{
        //sss.append(QString("%1").arg(s2_[i][j],0,'f',2));
        //sss.append(",");
        //}
        //sss.append("#");
        sss.append(QString("%1").arg(psavg[i],0,'f',2));
        sss.append(",");
        
    }
    qDebug()<<"1sss="<<sss;*/

    if (mode4>=9)
    {
    	double tmp[NHMAX];
        smo_pi4(psavg,0,nh,tmp,(mode4/4)); /*qDebug()<<"mode4="<<mode4;*/
    }

    int i0=132;

    double famin=200.0 + 3.0*(double)mode4*df;
    double fbmax=2700.0 - 3.0*(double)mode4*df;

    double fa=famin;
    double fb=fbmax;
    if (NFreeze==1)
    {
        fa=fmax(famin,tx_nfqsopi4+MouseDF-ntol);
        fb=fmin(fbmax,tx_nfqsopi4+MouseDF+ntol);
    }
    else
    {
        fa=fmax(famin,tx_nfqsopi4+MouseDF-600);
        fb=fmin(fbmax,tx_nfqsopi4+MouseDF+600);
    }

    int ia=fa/df - 3.0*(double)mode4;
    int ib=fb/df - 3.0*(double)mode4;

    i0=int(tx_nfqsopi4/df);
    int irange=450;
    if (ia-i0<-irange) ia=i0-irange;
    if (ib-i0>irange)  ib=i0+irange;

    //qDebug()<<"ffffttttttttttttttttttttttttttt="<<fa<<fb;

    int lag1=-5;//-5;
    int lag2=79;//2.16=79 -3s to +3.5sec    old 59; 
    double syncbest=-1.e30;
    pomAll.zero_double_beg_end(ccfred,-460,460);
    int jmax=-1000;
    int jmin=1000;
    int ipk=0;

    int kz=mode4/2;
    //bool savered=false;
    //qDebug()<<"ffff="<<ia+kz<<ib-kz<<ia<<ib<<kz;

    for (int i = ia+kz; i < ib-kz; i++)// min 100hz df
    {
        xcorpi4(s2_,i,nsteps,nsym,lag1,lag2,mode4,ccfblue,ccf0,lagpk0,flip);
        //qDebug()<<"iiiiiiii="<<ccf0<<lagpk0<<flip;
        int j=i-i0 + 3*mode4;
        if (j>=-372 && j<=372)
        {
            ccfred[j]=ccf0;
            jmax=fmax(j,jmax);
            jmin=fmin(j,jmin);
        }
        //            qDebug()<<"ffff="<<ccfblue[lagpk0];
        slope(ccfblue,lag1,lag2-lag1+0,lagpk0-lag1+0.0);
        double sync=fabs(ccfblue[lagpk0]);

        //qDebug()<<"ffff="<<sync<<lagpk0;
        if (flip<0) continue;
        if (sync>syncbest)
        {
            ipk=i;
            lagpk=lagpk0;
            //ichpk=ich;
            syncbest=sync;
            //savered=true;
            //double pppp=((double)(ipk-i0) + 3.0*(double)mode4)*df;
            //qDebug()<<"iiiiiiiiiiiiiiiiiiiiiiiiii="<<(pppp + tx_nfqsopi4 - 1.5*4.375*mode4)<<sync<<ich;
        }
    }
    /*if (savered)
    {
        for (int x = -460; x < 460; x++)
            red[x]=ccfred[x];
    }
    //qDebug()<<"iiiiiiiiiiiiiiiiiiiiiiiiii="<<ichpk;
    for (int x = -460; x < 460; x++)
        ccfred[x]=red[x];    //ccfred=red*/

    //!  width=df*nch(ichpk)
    dfx=((double)(ipk-i0) + 3.0*(double)mode4)*df; /// mahane 5

    //qDebug()<<"111iiiiiiiiiiiiiiiiiiiiiiiiii="<<dfx<<ipk<<lag1<<lag2<<nsteps<<nsym;
    double ccfmax = 0.0;

    //zero_double_beg_end(ccfblue,-10,550);
    //qDebug()<<"222iiiiiiiccf10="<<ipk<<ichpk;
    //ichpk = 2;
    xcorpi4(s2_,ipk,nsteps,nsym,lag1,lag2,mode4,ccfblue,ccfmax,lagpk,flip);
    //ccfmax = 0.75347;
    //qDebug()<<"222iiiiiiiiiiiiiiiiiiiiiiiiii="<<flip;
    double xlag=lagpk;

    if (lagpk>lag1 && lagpk<lag2)
    {
        double dx2 = pomAll.peakup(ccfblue[lagpk-1],ccfmax,ccfblue[lagpk+1]);
        xlag=lagpk+dx2;
    }
    //qDebug()<<"222iiiiiiiccf10="<<xlag<<lag1<<lag2<<lagpk<<ccfmax;
    slope(ccfblue,lag1,lag2-lag1+0,xlag-lag1+0.0);
    double sq=0.0;
    double nsq=0.0;
    for (int lag = lag1; lag < lag2; lag++)
    {
        if (fabs(lag-xlag)>2.0)//2.0 pri men 20.0
        {
            sq += ccfblue[lag]*ccfblue[lag];
            nsq=nsq+1.0;
            //qDebug()<<"222iiiiiiiccf10="<<lag<<fabs(lag-xlag);
        }
    }
    if(nsq==0.0)
    	nsq=1.0;
    double rms=sqrt(sq/nsq);
    if(rms==0.0)
    	rms=1.0;
    snrsync=fmax(0.0,pomAll.db(fabs(ccfblue[lagpk]/rms - 1.0)) - 4.5);

    double snrx1=fabs(ccfblue[lagpk]/rms - 1.0) - 30.0;// + snrsync;
    //double snrx1=fabs(ccfblue[lagpk]/rms - 1.0)*1.5-35.0;//*2.0-50.0
    //double snrx1=fabs(ccfblue[lagpk]/rms - 1.0)-20.0;
    //double snrx1=db(fabs(ccfred[lagpk])) ;// + snrsync;
    //snrx=db(fabs(ccfblue[lagpk]/rms)) - 36.0 + snrsync;
    double snrx2=pomAll.db(snrsync) - 26.0;
    //qDebug()<<"1ssssssssssss="<<snrx1<<snrx2;
    if (snrx1<snrx2)
        snrx=snrx2;
    else
        snrx=snrx1;

    ////old method ///////////
    /*snrx=-21.0;
    //36,38,40,42,44,46,72
    if (mode4==36)  snrx=-21.0;
    if (mode4==38)  snrx=-21.0;
    if (mode4==40)  snrx=-21.0;
    if (mode4==42) snrx=-20.0;
    if (mode4==44) snrx=-20.0;
    if (mode4==46) snrx=-20.0;
    //if(mode4==2)  snrx=-25.
    //if(mode4==4)  snrx=-24.
    //if(mode4==9)  snrx=-23.
    //if(mode4==18) snrx=-22.
    //if(mode4==36) snrx=-21.
    //if(mode4==72) snrx=-20.
    //snrx=snrx + snrsync;
    ////end old method ///////////*/

    double dt=2.0/DEC_SAMPLE_RATE; //???? 2.0/DEC_SAMPLE_RATE
    double istart=xlag*(double)nq;//xlag*2048.0/11025.0;
    dtx=istart*dt;//3.3

    //dtx=xlag*2048.0/12000.0;

    pomAll.zero_double_beg_end(ccfred1,-230,230);//ccfred1=0.  ve4e e napraveno
    jmin=fmax(jmin,-224);
    jmax=fmin(jmax,224);
    for (int i = jmin; i < jmax; i++)
    {
        ccfred1[i]=ccfred[i];
    }

    int ipk1 = pomAll.maxloc_da_beg_to_end(ccfred1,-224,224);//-225;//
    //qDebug()<<"222iiiiiiiccf10="<<ipk1;
    double ns=0.0;
    double s=0.0;
    double iw=fmin(mode4,(ib-ia)/4);
    for (int i = jmin; i < jmax; i++)
    {
        if (fabs(i-ipk1)>iw)
        {
            s=s+ccfred1[i];
            ns=ns+1.0;
        }
    }
    double base=s/ns;
    for (int i = -230; i < 230; i++)
        ccfred1[i]=ccfred1[i]-base;

    double ccf10=0.5*pomAll.maxval_da_beg_to_end(ccfred1,-224,224);//
    //qDebug()<<"222iiiiiiiccf10="<<ccfred1[ipk1]<<ccf10;
    int i = 0;
    for (i = ipk1; i >= jmin; i--)
    {
        if (ccfred1[i]<=ccf10) break;
    }
    int i1=i;
    for (i = ipk1; i < jmax; i++)
    {
        if (ccfred1[i]<=ccf10) break;
    }
    //width=(i-i1)*df/5.52;
    width=((i-i1)/4.0)*df-2.197265;

    //ia=fa/df - 3.0*(double)mode4;
    //qDebug()<<"222iiiiiiiiiiiiiiiiiiiiiiiiii="<<i<<i1<<df<<jmin<<jmax;

    delete [] s2_;
}


void DecoderMs::avgpi4(int nutc,double snrsync,double dtxx,double flip,double nfreq,int ntol,
                       QString &avemsg/*,double &qave*/,int &nfanoave)
{
    double sym_[207];//(207,7)
    //double syncave;
    //double dtave;
    //double fave;
    int ncount = 0;

    if (first_avgpi4)
    {
        for (int i = 0; i < MAXAVE_PI4; i++)
        {
            iutc_pi4[i]=-1;
            nfsave_pi4[i]=0.0;
        }
        dtdiff_pi4=0.2;
        first_avgpi4=false;
        nsave_pi4 = 0;
    }

    for (int i = 0; i < MAXAVE_PI4; i++)
    {
        if (iutc_pi4[i]<0) break;
        if (nutc==iutc_pi4[i] && fabs(nfreq-nfsave_pi4[i])<=ntol) goto c10;
    }

    if (iutc_pi4[nsave_pi4] < 0)
        count_saved_avgs_pi4++;

    iutc_pi4[nsave_pi4]=nutc;
    syncsave_pi4[nsave_pi4]=snrsync;
    dtsave_pi4[nsave_pi4]=dtxx;
    nfsave_pi4[nsave_pi4]=nfreq;
    flipsave_pi4[nsave_pi4]=flip;

    for (int j = 0; j < G_NSYM; j++)
        ppsave_pi4_[nsave_pi4][j]=rsymbol_pi4_[j];

    nsave_pi4++;

c10:


    for (int j = 0; j < G_NSYM; j++)
        sym_[j]=0.0;

    double syncsum=0.0;
    double dtsum=0.0;
    double nfsum=0.0;
    int nsum=0;

    for (int i = 0; i < MAXAVE_PI4; i++)
    {
        cused_pi4[i]='.';
        if (iutc_pi4[i]<0) continue;
        //if(mod(iutc_pi4(i),2).ne.mod(nutc_pi4,2)) cycle  !Use only same sequence
        if (fabs(dtxx-dtsave_pi4[i])>dtdiff_pi4) continue;//cycle  !DT must match
        if (fabs(nfreq-nfsave_pi4[i])>ntol) continue;//cycle   !Freq must match
        if (flip!=flipsave_pi4[i]) continue;// cycle            //!Sync (* / #) must match

        for (int x = 0; x < G_NSYM; x++)
            sym_[x]=sym_[x] +  ppsave_pi4_[i][x];


        syncsum=syncsum + syncsave_pi4[i];
        dtsum=dtsum + dtsave_pi4[i];
        nfsum=nfsum + nfsave_pi4[i];
        cused_pi4[i]='$';
        iused_pi4[nsum]=i;
        nsum++;
    }
    if (nsum<MAXAVE_PI4-0) iused_pi4[nsum+0]=0;


    if (nsum<2)//2
    {
        emit EmitAvgSavesPi4(count_use_avgs_pi4,count_saved_avgs_pi4);
        goto c900; //ne pomalko ot 1 da ima if(nsum<2) go to 900
    }

    count_use_avgs_pi4 = nsum;
    emit EmitAvgSavesPi4(count_use_avgs_pi4,count_saved_avgs_pi4);
    //qDebug()<<"AVG TRAY nsum used============"<<nsum;

    //syncave=0.0;
    //dtave=0.0;
    //fave=0.0;
    if (nsum>0)
    {
        for (int x = 0; x < G_NSYM; x++)
            sym_[x]=sym_[x]/(double)nsum;
        //syncave=syncsum/nsum;
        //dtave=dtsum/nsum;
        //fave=(double)nfsum/nsum;
    }

    /*do i=1,nsave
        csync='*'
        if(flipsave(i).lt.0.0) csync='#'
        if (associated (this%average_callback)) then
           call this%average_callback(cused(i) .eq. '$',iutc(i),               &
                syncsave(i),dtsave(i),nfsave(i),flipsave(i).lt.0.)
        end if
     enddo

     sqt=0.
     sqf=0.
     do j=1,64
        i=iused(j)
        if(i.eq.0) exit
        csync='*'
        if(flipsave(i).lt.0.0) csync='#'
        sqt=sqt + (dtsave(i)-dtave)**2
        sqf=sqf + (nfsave(i)-fave)**2
     enddo
     rmst=0.
     rmsf=0.
     if(nsum.ge.2) then
        rmst=sqrt(sqt/(nsum-1))
        rmsf=sqrt(sqf/(nsum-1))
     endif
     kbest=ich1*/

    //qDebug()<<"AVGnsum============"<<nsum;


    extractpi4(sym_,ncount,avemsg);
    nfanoave=0;
    if (ncount>=0)
    {
        nfanoave=nsum;
        goto c900;
    }


c900:
    nsave_pi4=fmod(nsave_pi4,MAXAVE_PI4);//MAXAVE_PI4 hv if MAXAVE place chenged to 0
    //qDebug()<<"Next nsave"<<nsave_pi4;
    return;
}
void DecoderMs::print_msgpi4(int nsync,int nsnr,double dtx,int df,int width,QString decoded,QString csync,
                             QString cflags,int nfreq)
{
    bool f_only_one_color = true;
    if (f_only_one_color)
    {
        f_only_one_color = false;
        SetBackColor();
    }

    decoded = RemBegEndWSpaces(decoded);

    QStringList list;
    list <<s_time<<QString("%1").arg(nsync)<<QString("%1").arg(nsnr)
    <<QString("%1").arg(dtx,0,'f',1)
    <<QString("%1").arg(df)<<QString("%1").arg(width)
    <<decoded<<csync<<cflags<<QString("%1").arg(nfreq);
    //<<QString("%1").arg(8)<<QString("%1").arg(9.0,0,'f',1);
    emit EmitDecodetText(list,s_fopen,true);

}
void DecoderMs::mshvpi4(double *dat,int npts,int nutc,int minsync,int ntol,
                        int mode4,double nfqso,int ndepth/*,int neme*/)
{
    double ccfblue_p[545+40];
    double *ccfblue = &ccfblue_p[5+10];
    double ccfred_p[448+40];
    double *ccfred = &ccfred_p[224+10];
    double dtx,dfx,snrx,snrsync,flip,width;
    QString decoded;
    //QString special="     ";
    //double nsync = 0.0;
    QString csync;
    //double qbest;
    //double qabest;
    bool prtavg;
    //double qave;
    int nfanoave=0;

    pomAll.zero_double_beg_end(ccfblue,-10,550);
    //zero_double_beg_end(ccfred,-230,230);

    if (first_pi4)
    {
        nsave_pi4=0;
        first_pi4=false;
        blank_pi4 = "";
        clearave_pi4 = true;//hv first time clar all avg
        //ccfblue_pi4=0.
        //ccfred_pi4=0.
        //if (dttol==-99.0 && emedelay==-99.0 && nagain) return;
    }
    //!    syncmin=3.0 + minsync
    double syncmin=1.0+minsync;
    //int naggressive=0;
    //if (ndepth>=2) naggressive=1;
    //int nq1=3;
    //nq2=6
    //if (naggressive==1) nq1=1;
    if (clearave_pi4)
    {
        clearave_pi4 = false;
        nsave_pi4=0;

        for (int i = 0; i < MAXAVE_PI4; i++)
        {
            iutc_pi4[i]=-1;
            nfsave_pi4[i]=0.0;
            dtsave_pi4[i]=0.0;
            syncsave_pi4[i]=0.0;

            for (int z = 0; z < G_NSYM; z++)
            {
                if (i==0)
                    rsymbol_pi4_[z]=0.0;
                ppsave_pi4_[i][z]=0.0;
            }
        }
        //listutc[10]=0  no use
        //nfanoave_pi4=0;
        //ndeepave_pi4=0;
        count_use_avgs_pi4 = 0;
        count_saved_avgs_pi4 = 0;
    }

    // call timer('sync4   ',0)   7.142857  1.5*4.375
    int MouseDF=int(nfqso + 8.142857*mode4 - tx_nfqsopi4);   //qDebug()<<"zzzzzz";
    //qDebug()<<"MouseDF"<<nfqso<<1.5*4.375*mode4<<tx_nfqsopi4<<MouseDF;

    //npts = fmin(180000 ,npts);

    syncpi4(dat,npts,ntol,1,MouseDF,4,mode4,dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width/*,ps0*/);
    //qDebug()<<"syncpi4"<<dfx<<dfx + tx_nfqsopi4 - mode4;

    double sync=snrsync;
    double dtxz=dtx-0.0;//dtx-0.0; -0.337406
    double nfreqz=dfx + tx_nfqsopi4 - 8.142857*mode4;//1.5*4.375  682.8125 - 9.0;//
    double nfreq = 0.0;
    //double idf = 1.0; //??? HV no exist

    //int ich1 = 0;
    //double qual = 0.0;
    int nfano = 0;
    //double dtx0 = 0.0;
    //double nfreq0 = 0.0;
    //double ich0 = 0.0;
    QString cflags = "";
    csync="*";

    //double dtx1 = 0.0;
    //double nfreq1 = 0.0;

    if (flip<0.0) csync="#";
    decoded=blank_pi4;

    //snrx=db(sync) - 26.0; // old method
    int nsnr=int(snrx);
    if (nsnr < -30) nsnr=-30; //hv v1.41


    //qDebug()<<"sync snrx nsnr "<<sync<<snrx<<"dtxz snr freq flip"<<dtxz<<nfreqz<<flip<<width;
    //sync = 2;
    if (sync<syncmin)
    {
        csync = "$";//2.16 +3s  -3.0
        print_msgpi4((int)sync,nsnr,dtxz-3.0,(nfreqz-tx_nfqsopi4),width,decoded,csync,cflags,(int)nfreqz);
        goto c990;
    }

    //deepmsg=blank_pi4;
    //special="     ";
    //nsync=sync;
    //nsnrlim=-33;

    //qbest=0.0;
    //qabest=0.0;
    prtavg=false;

    /*double dt=2.0/DEC_SAMPLE_RATE;
    if (dtxz<0)
    {
        int istart_min = fabs(dtxz/dt);
        for (int i = 0; i < istart_min; i++)
             dat
    }*/
    //dtxz=1.14118;
    for (int idt = -10; idt <= 10; idt++)//10
        //for (int idt = -0; idt <= 0; idt++)
    {//do idt=-2,2
        dtx=dtxz + 0.001666666666*(double)idt; //prez 10=samples dtx=dtxz + 0.03*idt       1.52830 i 1.52820
        //dtx=dtxz + 0.0001666666666*(double)idt;//prez 1=sample
        //dtx=dtxz + 0.03*(double)idt;
        nfreq=nfreqz;// + 1.0*(double)idt;//idf ????? 2.2
        //qDebug()<<"START NORMAL decoded=="<<dtx;

        decodepi4(dat,npts,dtx,nfreq/*,flip*/,mode4,decoded,nfano);

        //double dt=2.0/DEC_SAMPLE_RATE;
        //qDebug()<<"ssss="<<idt<<dtx<<"istart="<<int(dtx/dt);

        //qDebug()<<"NORMAL decoded=="<<decoded<<nfano;

        //nfano = 0;

        if (nfano>0)//nfano -> 1=ok  "0=no ok go to avg"  "-1no real coll no go in avg"
        {
            cflags = "Nor";//norm  //2.16 +3s  -3.0
            print_msgpi4((int)sync,nsnr,dtx-3.0,(nfreq-tx_nfqsopi4),width,decoded,csync,cflags,(int)nfreq);

            nsave_pi4=0;
            goto c990;
        }
        //qDebug()<<"AVGGG=qDebug()"<<nfano;

        if (idt!=0) continue;

        //qave=0.0;

        //qDebug()<<"AVGGG=="<<(ndepth & 16)<<prtavg<<nutc<<nutc0_pi4<<nfreq-nfreq0_pi4<<ntol;
        //nfano -> 1=ok  "0=no ok go to avg"  "-1no real coll no go in avg"
        if ((ndepth & 16)==16 && !prtavg && nfano!=-1)
        {
            //qDebug()<<"AVGGG=qDebug()Innnnnnnnnnnn"<<nfano<<idt;
            QString avemsg;
            if (nutc!=nutc0_pi4 || fabs(nfreq-nfreq0_pi4)>ntol)//
            {

                nutc0_pi4=nutc;
                nfreq0_pi4=nfreq;

                //nsave=nsave+1
                //nsave=mod(nsave-1,64)+1

                avgpi4(nutc,sync,dtx,flip,nfreq,ntol,avemsg/*,qave*/,nfanoave);
                //qDebug()<<"AVG MSGGGG = "<<avemsg;

            }
            //qDebug()<<"AVGGG==nfanoave_pi4"<<nfanoave<<ich1_pi4<<ich2_pi4<<nutc<<nutc0_pi4;
            if (nfanoave>0)
            {
                cflags = "Avg";
                csync = "**";//2.16 +3s  -3.0
                print_msgpi4((int)sync,nsnr,dtx-3.0,(nfreq-tx_nfqsopi4),width,avemsg,csync,cflags,(int)nfreq);
                prtavg=true;

                //SetClearAvgPi4();

                continue; // cycle
            }
        }
    }
    //nfano -> 1=ok  "0=no ok go to avg"  "-1no real coll no go in avg"
    if (nfano!=-1 && decoded.isEmpty() && !prtavg)//nfano -> 1=ok  "0=no ok go to avg"  "-1no real coll no go in avg"
    {
        cflags = "Nor";//norm
        csync = "#";
        decoded = "?";//2.16 +3s  -3.0
        print_msgpi4((int)sync,nsnr,dtxz-3.0,(nfreq-tx_nfqsopi4),width,decoded,csync,cflags,(int)nfreq);
    }

c990:
    return;
}
void DecoderMs::lpf1(double *dd,int jz,double *dat,int &jz2)
{
    int NFFT1=64*DEC_SAMPLE_RATE;// change hv 
    int NFFT2=32*DEC_SAMPLE_RATE;//2.16 3s

    //int offset_pi4 = 1.0*(DEC_SAMPLE_RATE/2.0);//3.2     1.0,2.0,3.0 ... sec  work from to 0.2s-4.0s

    //double x[NFFT1+50];
    double *x = new double[NFFT1+1024];//+1024 for linux crash
    //double complex cx[NFFT1/2+50];
    double complex *cx = new double complex[NFFT1+1024];//2.09 crash->[NFFT1/2+1024];//+1024 for linux crash

    double fac=1.0/double(NFFT1);
    for (int i = 0; i < jz; i++)
        x[i]=fac*dd[i];
    for (int i = jz; i < NFFT1; i++)
        x[i]=0.0;
    f2a.four2a_d2c(cx,x,NFFT1,-1,0);
    for (int i = NFFT2/2; i < NFFT1/2; i++)
        cx[i]=0.0+0.0*I;

    f2a.four2a_d2c(cx,x,NFFT2,1,-1);
    jz2=jz/2;

    /*for (int i = 0; i < offset_pi4; i++)
              dat[i] = 0.0;
    int count_offset = offset_pi4;
    for (int i = 0; i < jz2-(offset_pi4+1); i++)
    {
        dat[count_offset]=x[i];
        count_offset++;
    }*/

    for (int i = 0; i < jz2; i++)
    {
        dat[i]=x[i]*0.01;//hv koeficient double
    }

    delete [] cx;
    delete [] x;
}
void DecoderMs::SetClearAvgPi4()
{
    clearave_pi4 = true;
    emit EmitAvgSavesPi4(0,0); // exception
}
void DecoderMs::pi4_decode(double *dd,int jz)
{
    int jz2 = 0;
    //double dat[361000]; //60*6000=360000   61*6000=366000
    double *dat = new double[366000];//366000

    int mode4=40;//nmode hv

    //bool NClearAve = clearave_pi4;
    int ntol = G_DfTolerance;
    //int neme = 0;
    int nutc = s_time.toInt()/100;
    int minsync = G_MinSigdB;
    //double emedelay = 0.0; // -99.0 outof cicle
    //double dttol = 3.0;
    //int minw = 0;
    double s_nfqsoPi4 = s_nfqso_all;
    //bool NAgain = false;
    int ndepth = 16;//G_DepthAvg;//0 stop  avg=16 ;

    //qDebug()<<"s_nfqsoPi4 ntol"<<s_nfqsoPi4<<ntol<<jz;

    //qDebug()<<"in raw="<<jz;
    //inportent hv 1.41 max_samp = 1s from prev period + 25s from msg + 4s for sync = 1+25+4=30s
    //int max_samp = 31.0*DEC_SAMPLE_RATE;
    //inportent hv 2.16 max_samp = 3s from prev period + 25s from msg + 4s for sync = 3+25+4=32s
    int max_samp = 33.0*DEC_SAMPLE_RATE;//2.16 +3s 33
    jz = fmin(max_samp,jz);
    //qDebug()<<"out raw="<<jz;

    lpf1(dd,jz,dat,jz2);

    //qDebug()<<"sssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"<<jz<<jz2;

    //for (int i = 10; i < 20; i++)
    //{
    //ndelta_pi4 = i;
    //first_extractpi4 = true;
    //ssss = (double)i;
    mshvpi4(dat,jz2,nutc,minsync,ntol,mode4,s_nfqsoPi4,ndepth/*,neme*/);
    //qDebug()<<"sssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"<<ssss;
    //}

    //resample_12_6(dd,jz,dat);
    //mshvpi4(dat,jz,nutc,minsync,ntol,emedelay,dttol,mode4,minw,s_nfqsoPi4,NAgain,ndepth/*,neme*/);

    delete [] dat;//delete [] dat;
}
/*
void DecoderMs::resample_12_6(double *d2,int &npts,double *dd)
{
    int NZ12 =60*12000;
    int NFFT2=64*6000;
    int NFFT1=64*12000;
    //double x[NFFT2];
    //double complex cx[NFFT1/2];//(0:NFFT1/2)
    double *x = new double[NFFT1];
    double complex *cx = new double complex[NFFT1];

    int jz=fmin(NZ12,npts);
    for (int i = 0; i < jz; i++)
        x[i]=d2[i];
    for (int i = jz; i < NFFT2; i++)
        x[i]=0.0;
    //qDebug()<<"s_nfqsoPi4 ntol";
    four2a_double_to_complex(cx,x,NFFT1,1,-1,0); //call four2a(x,nfft1,1,-1,0)//!Forward FFT, r2c
    double df=12000.0/(double)NFFT1;
    int ia=5000.0/df;//??? ia=5000.0/df
    for (int i = ia; i < NFFT1/2; i++)
        cx[i]=0.0;// cx(ia:)=0.0
    four2a_double_to_complex(cx,x,NFFT2,1,1,-1);//call four2a(cx,nfft2,1,1,-1)//!Inverse FFT, c2r

    npts=jz*6000.0/12000.0;
    double fac=1.e-6;
    for (int i = 0; i < npts; i++)
        dd[i]=fac*x[i];//dd(1:npts)=fac*x(1:npts)

    delete cx;
    delete x;
}
*/





