Exemplo n.º 1
0
int main(void)
{
	int i,j,mval;
	float a=(-PIO2),b=PIO2,poly,x,y;
	float c[NVAL],d[NVAL];

	chebft(a,b,c,NVAL,func);
	for (;;) {
		printf("\nHow many terms in Chebyshev evaluation?\n");
		printf("Enter n between 6 and %2d. (n=0 to end).\n",NVAL);
		scanf("%d",&mval);
		if ((mval <= 0) || (mval > NVAL)) break;
		chebpc(c,d,mval);
		/* Test polynomial */
		printf("\n%9s %14s %14s\n","x","actual","polynomial");
		for (i = -8;i<=8;i++) {
			x=i*PIO2/10.0;
			y=(x-0.5*(b+a))/(0.5*(b-a));
			poly=d[mval-1];
			for (j=mval-2;j>=0;j--) poly=poly*y+d[j];
			printf("%12.6f %12.6f %12.6f\n",x,func(x),poly);
		}
	}
	return 0;
}
Exemplo n.º 2
0
void
HarmEnhancer::calcula_mag (float *Rmag)
{

    int i;
    float mag_fix = 0.0f;

    float mag[HARMONICS] = {
        0.0f, Rmag[0], Rmag[1], Rmag[2], Rmag[3], Rmag[4], Rmag[5],
        Rmag[6], Rmag[7], Rmag[8], Rmag[9]
    };



    // Normalise magnitudes

    for (i = 0; i < 10; i++)
        mag_fix += fabs (Rmag[i]);


    if (mag_fix < 1.0f) {
        mag_fix = 1.0f;
    } else {
        mag_fix = 1.0f / mag_fix;
    }
    for (i = 0; i < HARMONICS; i++) {
        mag[i] *= mag_fix;
    }

    // Calculate polynomial coefficients, using Chebychev aproximation
    chebpc (mag, p);

}
Exemplo n.º 3
0
static void runAddingHarmonicGen(LADSPA_Handle instance, unsigned long sample_count) {
	HarmonicGen *plugin_data = (HarmonicGen *)instance;
	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;

	/* Fundamental magnitude (float value) */
	const LADSPA_Data mag_1 = *(plugin_data->mag_1);

	/* 2nd harmonic magnitude (float value) */
	const LADSPA_Data mag_2 = *(plugin_data->mag_2);

	/* 3rd harmonic magnitude (float value) */
	const LADSPA_Data mag_3 = *(plugin_data->mag_3);

	/* 4th harmonic magnitude (float value) */
	const LADSPA_Data mag_4 = *(plugin_data->mag_4);

	/* 5th harmonic magnitude (float value) */
	const LADSPA_Data mag_5 = *(plugin_data->mag_5);

	/* 6th harmonic magnitude (float value) */
	const LADSPA_Data mag_6 = *(plugin_data->mag_6);

	/* 7th harmonic magnitude (float value) */
	const LADSPA_Data mag_7 = *(plugin_data->mag_7);

	/* 8th harmonic magnitude (float value) */
	const LADSPA_Data mag_8 = *(plugin_data->mag_8);

	/* 9th harmonic magnitude (float value) */
	const LADSPA_Data mag_9 = *(plugin_data->mag_9);

	/* 10th harmonic magnitude (float value) */
	const LADSPA_Data mag_10 = *(plugin_data->mag_10);

	/* Input (array of floats of length sample_count) */
	const LADSPA_Data * const input = plugin_data->input;

	/* Output (array of floats of length sample_count) */
	LADSPA_Data * const output = plugin_data->output;
	float itm1 = plugin_data->itm1;
	float otm1 = plugin_data->otm1;

#line 61 "harmonic_gen_1220.xml"
	unsigned long pos, i;
	float mag_fix;
	float mag[HARMONICS] = {0.0f, mag_1, mag_2, mag_3, mag_4, mag_5, mag_6,
	                        mag_7, mag_8, mag_9, mag_10};
	float p[HARMONICS];

	// Normalise magnitudes
	mag_fix = (fabs(mag_1) + fabs(mag_2) + fabs(mag_3) + fabs(mag_4) +
	           fabs(mag_5) + fabs(mag_6) + fabs(mag_7) + fabs(mag_8) +
	           fabs(mag_9) + fabs(mag_10));
	if (mag_fix < 1.0f) {
	  mag_fix = 1.0f;
	} else {
	  mag_fix = 1.0f / mag_fix;
	}
	for (i=0; i<HARMONICS; i++) {
	  mag[i] *= mag_fix;
	}

	// Calculate polynomial coefficients, using Chebychev aproximation
	chebpc(mag, p);

	for (pos = 0; pos < sample_count; pos++) {
	  float x = input[pos], y;

	  // Calculate the polynomial using Horner's Rule
	  y = p[0] + (p[1] + (p[2] + (p[3] + (p[4] + (p[5] + (p[6] + (p[7] +
	      (p[8] + (p[9] + p[10] * x) * x) * x) * x) * x) * x) * x) * x) *
	      x) * x;

	  // DC offset remove (odd harmonics cause DC offset)
	  otm1 = 0.999f * otm1 + y - itm1;
	  itm1 = y;

	  buffer_write(output[pos], otm1);
	}

	plugin_data->itm1 = itm1;
	plugin_data->otm1 = otm1;
}
Exemplo n.º 4
0
void tzFit(pulsar *psr,int npsr,longdouble *tmin,double *doppler,double *rms,double *utc,
	   longdouble tmidMJD,int ncoeff, longdouble *coeff,char *binPhase,int nsets,longdouble afmjd,
	   char* sitename,int tspan,double obsFreq,char *date,longdouble *val,int trueDM,char* polyco_file)
{
  FILE *fout,*fout2;
  int ntoas=32; 
  int nb;
  int j,i,k,iref;
  longdouble fac,sum,rphase,dm;
  longdouble c[31],d[31],ph[31],t[31],phase[800];
  longdouble b,a,rtime,sq,phtst,ct,ct2,phifac,phi0;
  struct tm *timePtr;
  time_t tm;
  char fname1[128];
  char fname2[128];

  strcpy(fname1,polyco_file);
  strcpy(fname2,polyco_file);
  strcat(fname1,"polyco_new.dat");
  strcat(fname2,"newpolyco.dat");
  fout = fopen(fname1,"a");
  fout2 = fopen(fname2,"a");

  /* Note: throughout we are ignoring the first 'TOA' */
  for (i=1;i<psr->nobs;i++)
    phase[i]=psr->obsn[i].phase;

  for (nb = 0;nb < nsets; nb++)
    {
      iref   = (nb+1)*(ntoas-1)-(int)((ntoas-1)/2.0);                            
      rtime  = tmin[iref];
      afmjd = (int)psr->obsn[iref].sat;
      tmidMJD = psr->obsn[iref].sat - (int)psr->obsn[iref].sat;

      tm = (time_t)((double)afmjd-40587.0)*SECDAY; /* Number of seconds since 01-Jan-70 */
      timePtr = gmtime(&tm);
      strftime(date,100,"%d-%b-%y",timePtr);
      if (date[0]=='0') date[0]=' ';
      rphase = psr->obsn[iref].phase;
      //      printf("rphase = %d %d %Lg\n",ntoas,iref,rphase);
      i=iref-(int)((ntoas-1)/2.0)-1; /* -1;*/ /* Maybe another -1 */
      for (j=1;j<ntoas;j++) 
	{      
	  i++;
	  t[j]  = tmin[i]-rtime; 
	  ph[j] = phase[i]-rphase-t[j]*psr->param[param_f].val[0]*60.0L;        
	}
      
      /* This bit of code is based on 'chebft' in numerical recipes for fitting
       * a Chebyshev polynomial
       */
      
      fac = 2.0/(ntoas-1);
      for (j=1;j<ntoas;j++)
	{
	  sum = 0.0;
	  for (k=1;k<ntoas;k++)
	    sum+=ph[k]*cos((M_PI*(j-1))*((k-0.5)/(longdouble)(ntoas-1.0)));
	  c[j-1] = fac*sum;
	}
      
      b = tspan/2.0+5.0;
      a = -b;
      
      chebpc(c,d,ncoeff);
      pcshft(a,b,d,ncoeff);
      for (i=0;i<ncoeff;i++)
	coeff[i] = d[i];
      sq=0.0;
            
      longdouble arg;
      for (j=1;j<ntoas;j++)
	{
	  phtst = d[0];
	  arg = t[j];
	  for (k=1;k<ncoeff;k++)
	    {
	      phtst+=d[k]*arg;
	      arg *= t[j];
	    }
	  sq+=(phtst-ph[j])*(phtst-ph[j]);
	}
      *rms = 1.0e6*sqrt(sq/(ntoas-1))/psr->param[param_f].val[0];
            
      /* Calculate UTC */
      {
	int nutsec,nuthrs,nutmin;
	longdouble uts;
	nutsec = (int)fortran_mod((longdouble)(86400.0*tmidMJD+0.005),86400.0);
	nuthrs = (int)(nutsec/3600.0);
	nutmin = (int)((nutsec-3600*nuthrs)/60.0);
	uts = nutsec-3600.0*nuthrs-60.0*nutmin;
	*utc = 10000.0*nuthrs+100.0*nutmin+uts;
      }
      
      /* Calculate binary phase */
      strcpy(binPhase," ");
      if (psr->param[param_pb].paramSet[0]==1) /* If binary pulsar */
	{
	  ct2 = psr->obsn[1].bat;   
	  ct = ct2 + (psr->obsn[iref].sat-psr->obsn[1].sat);
	  phifac=8.64e4/(psr->param[param_pb].val[0]*86400.0);
	  phi0=fortran_mod((ct-psr->param[param_t0].val[0])*phifac+90000.0,1.0); 
	  sprintf(binPhase,"%7.4Lf%9.4Lf",phi0,phifac);
	}
      *doppler = ((psr->obsn[iref].freqSSB-psr->obsn[iref].freq*1.0e6)/(psr->obsn[iref].freq*1.0e6));
      (*doppler)*=1.0e6/100.0; /* WHY THIS SCALING? */
      *rms     = log10(1.0e-6*(*rms)*psr->param[param_f].val[0]);
	  
      /* Output in original TEMPO format */
      if (psr->name[0]=='J') fprintf(fout,"%-10.10s ",(psr->name)+1);
      else fprintf(fout,"%-10.10s ",psr->name);
      fprintf(fout,"%9.9s",date);
      fprintf(fout,"%11.2f",*utc);
      fprintf(fout,"%20.11f",(double)(afmjd+tmidMJD));
      if (trueDM==0) dm = psr->param[param_dm].val[0];
      else dm = (psr->obsn[iref].tdis1+psr->obsn[iref].tdis2)*DM_CONST*1.0e-12*psr->obsn[iref].freqSSB*psr->obsn[iref].freqSSB;
	
      fprintf(fout,"%21.6f ",(double)dm);
      fprintf(fout,"%6.3f",*doppler);
      fprintf(fout,"%7.3f",*rms);
      fprintf(fout,"\n");
      fprintf(fout,"%20.6Lf",rphase);
      fprintf(fout,"%18.12f",(double)psr->param[param_f].val[0]);
      fprintf(fout,"%5s",sitename);
      fprintf(fout,"%5d",tspan);
      fprintf(fout,"%5d",ncoeff);
      fprintf(fout,"%10.3f",obsFreq);
      fprintf(fout,"%16s",binPhase);
      fprintf(fout,"\n");
      for (i=0;i<ncoeff;i++)
	{
	  fprintf(fout,"%25.17le",(double)coeff[i]);
	  if ((i+1)%3==0) fprintf(fout,"\n");
	}
      if ((i%3)!=0) fprintf(fout,"\n");
      
      fprintf(fout2,"TEMPO2: POLYCO TEMPO1 emulation\n");
      if (psr->name[0]=='J') fprintf(fout2,"%-10.10s\n",(psr->name)+1);
      else fprintf(fout2,"%-10.10s\n",psr->name);
      fprintf(fout2,"%-9.9s\n",date);
      fprintf(fout2,"%-11.2f\n",*utc);
      fprintf(fout2,"%-.20Lf\n",(afmjd+tmidMJD));
      fprintf(fout2,"%-25.10Lf\n",dm);
      fprintf(fout2,"%-10.7f\n",*doppler);
      fprintf(fout2,"%-7.3f\n",*rms);
      fprintf(fout2,"%-.15Lf\n",rphase);
      fprintf(fout2,"%-.20Lf\n",psr->param[param_f].val[0]);
      fprintf(fout2,"%-5s\n",sitename);
      fprintf(fout2,"%-5d\n",tspan);
      fprintf(fout2,"%-5d\n",ncoeff);
      fprintf(fout2,"%-10.3f\n",obsFreq);
      if (strlen(binPhase)<2) fprintf(fout2,"0.000000 0.00000\n");
      else fprintf(fout2,"%-16s\n",binPhase);
      
      for (i=0;i<ncoeff;i++)
	fprintf(fout2,"%-.30Le\n",coeff[i]);
    }
  fclose(fout);
  fclose(fout2);
}