Esempio n. 1
0
		void initialize(void)
		{
			std::size_t cnt = 0;

			if ( m_window.size() != m_size )
				m_window.resize(m_size);


			if ( WINDOW_BARTLETT == m_type )
				cnt = m_size / 2;
			else if ( WINDOW_TUKEY == m_type )
				cnt = m_size - 1;
			else
				cnt = m_size;

			for ( std::size_t idx = 0; idx < cnt; idx++ ) {
				switch ( m_type ) {
					case WINDOW_HANN:
						m_window[ idx ] = 0.5 * ( 1.0 - std::cos(M_PI * 2.0 * idx / ( m_size - 1.0 )) );
						break;

					case WINDOW_HAMM:
						m_window[ idx ] = 0.54 - 0.46 * std::cos(2.0 * M_PI * idx / ( m_size - 1.0 ));
						break;

					case WINDOW_BLACKMAN:
						m_window[ idx ] = 0.42 - 0.5 * std::cos(2.0 * M_PI * idx / ( m_size - 1.0 )) + 0.08 *
										std::cos(4.0 * M_PI * idx / ( m_size - 1.0 ));
						break;

					case WINDOW_BARTLETT:
						m_window[ idx ] = ( idx / static_cast<T>( ( m_size / 2.0 ) ) );
						m_window[ idx + ( m_size / 2.0 ) ] = ( 1.0 - ( idx / static_cast<T>( ( m_size / 2.0 ) ) ) );
						break;

					case WINDOW_BLACKMAN_HARRIS:
						m_window[ idx ] = 0.35875 - 0.48829 * std::cos(2.0 * M_PI * idx / ( m_size - 1.0 ))
										+ 0.14128 * std::cos(4.0 * M_PI * idx / ( m_size - 1.0 )) - 0.01168
										* std::cos(6.0 * M_PI * idx / ( m_size - 1.0 ));
						break;

					case WINDOW_WELCH:
						m_window[ idx ] = 4.0 * idx / static_cast< T >(m_size)* ( 1.0 - ( idx / static_cast< T >( m_size ) ) );
						break;

					case WINDOW_FLATTOP:
						m_window[ idx ] = 1.0 - 1.93 * std::cos(2.0 * M_PI * idx / ( m_size - 1.0 ))
										+ 1.29 * std::cos(4.0*M_PI*idx / ( m_size - 1.0 )) - 0.388
										* std::cos(6.0*M_PI*idx / ( m_size - 1.0 )) + 0.028
										* std::cos(8.0*M_PI*idx / ( m_size - 1.0 ));
						break;

					case WINDOW_COSINE:
						m_window[ idx ] = std::cos((M_PI * idx / (m_size - 1.0)) - (M_PI / 2.0));
						break;

					case WINDOW_NUTALL:
						m_window[ idx ] = 0.355768 - 0.487396 * std::cos(2.0 * M_PI * idx / (m_size - 1.0))
										+ 0.144232 * std::cos(4.0 * M_PI * idx / (m_size - 1.0)) - 0.012604
										* std::cos(6.0 * M_PI * idx / (m_size - 1.0));
						break;

					case WINDOW_BLACKMAN_NUTALL:
						m_window[ idx ] = 0.355768 - 0.487396 * std::cos(2.0 * M_PI * idx / (m_size - 1.0))
										+ 0.144232 * std::cos(4.0 * M_PI * idx / (m_size - 1.0)) - 0.012604
										* std::cos(6.0 * M_PI * idx / (m_size - 1.0));
						break;

					case WINDOW_RECTANGULAR:
						m_window[ idx ] = 1.0;
						break;

					// -- https://github.com/JuliaDSP/DSP.jl/blob/master/src/windows.jl
					case WINDOW_TUKEY:
						if ( 0.0 > m_real || 1.0 < m_real )
							throw std::invalid_argument("Alpha value must be >= 0.0 && <= 1.0");

						if ( 0.0 == m_real )
							m_window[ idx ] = 1.0;
						else {
							T m = m_real * ( idx - 1.0 ) / 2.0;

							if ( idx <= m )
								m_window[ idx + 1 ] = 0.5 * ( 1.0 + std::cos(M_PI * ( idx / m - 1.0 )) );
							else if ( idx <= m_size - 1.0 - m )
								m_window[ idx + 1 ] = 1.0;
							else
								m_window[ idx ] = 0.5 * ( 1.0 + std::cos(M_PI * ( (idx / (m - 2.0)) / (m_real + 1.0) )) );

						}
		
						break;

					// -- https://github.com/JuliaDSP/DSP.jl/blob/master/src/windows.jl
					case WINDOW_LANCZOS:
						m_window[idx] = sinc(2 * idx / ( m_size - 1.0 ) - 1.0);
						break;
					
						// -- https://github.com/JuliaDSP/DSP.jl/blob/master/src/windows.jl
					/*case WINDOW_GAUSSIAN:
						if ( 0.0 > m_real || 0.5 < m_real )
							throw std::invalid_argument("Sigma value must be >= 0.0 && <= 0.5");

						m_window[ idx ] = std::exp(-0.5*( ( idx - ( m_size - 2.0 ) / 2.0 ) 
										/ ( m_real * ( (m_size - 1.0) / 2.0 ) ) ) ^ 2);
						break;*/

					case WINDOW_BARTLETT_HANN:
						m_window[ idx ] = 0.62 - 0.48 * std::abs((idx / ( m_size - 1.0 )) - 1.0 / 2.0) - 
										0.38 * std::cos(2.0 * M_PI * idx / (m_size - 1.0));
						break;

					case WINDOW_HANN_POISSON:
						if ( 0.0 <= m_real )
							m_real *= -1.0;

						m_window[ idx ] = 1.0 / 2.0 * ( 1.0 - std::cos(2.0 * M_PI * idx / (m_size - 1.0)) ) * 
										std::exp(m_real * std::abs((m_size - 1.0 - 2.0) * idx / (m_size - 1.0)));
						break;

					default:
						throw std::invalid_argument("Unknown or unsupported window type requested");
				};

				
			}

			return;
		}
Esempio n. 2
0
static REAL hn_lpf(int n,REAL f,REAL fs)
{
  REAL t = 1/fs;
  REAL omega = 2*PI*f;
  return 2*f*t*sinc(n*omega*t);
}
Esempio n. 3
0
void dxStepBody (dxBody *b, dReal h)
{
    // cap the angular velocity
    if (b->flags & dxBodyMaxAngularSpeed) {
        const dReal max_ang_speed = b->max_angular_speed;
        const dReal aspeed = dCalcVectorDot3( b->avel, b->avel );
        if (aspeed > max_ang_speed*max_ang_speed) {
            const dReal coef = max_ang_speed/dSqrt(aspeed);
            dScaleVector3(b->avel, coef);
        }
    }
    // end of angular velocity cap


    // handle linear velocity
    for (unsigned int j=0; j<3; j++) b->posr.pos[j] += h * b->lvel[j];

    if (b->flags & dxBodyFlagFiniteRotation) {
        dVector3 irv;	// infitesimal rotation vector
        dQuaternion q;	// quaternion for finite rotation

        if (b->flags & dxBodyFlagFiniteRotationAxis) {
            // split the angular velocity vector into a component along the finite
            // rotation axis, and a component orthogonal to it.
            dVector3 frv;		// finite rotation vector
            dReal k = dCalcVectorDot3 (b->finite_rot_axis,b->avel);
            frv[0] = b->finite_rot_axis[0] * k;
            frv[1] = b->finite_rot_axis[1] * k;
            frv[2] = b->finite_rot_axis[2] * k;
            irv[0] = b->avel[0] - frv[0];
            irv[1] = b->avel[1] - frv[1];
            irv[2] = b->avel[2] - frv[2];

            // make a rotation quaternion q that corresponds to frv * h.
            // compare this with the full-finite-rotation case below.
            h *= REAL(0.5);
            dReal theta = k * h;
            q[0] = dCos(theta);
            dReal s = sinc(theta) * h;
            q[1] = frv[0] * s;
            q[2] = frv[1] * s;
            q[3] = frv[2] * s;
        }
        else {
            // make a rotation quaternion q that corresponds to w * h
            dReal wlen = dSqrt (b->avel[0]*b->avel[0] + b->avel[1]*b->avel[1] +
                b->avel[2]*b->avel[2]);
            h *= REAL(0.5);
            dReal theta = wlen * h;
            q[0] = dCos(theta);
            dReal s = sinc(theta) * h;
            q[1] = b->avel[0] * s;
            q[2] = b->avel[1] * s;
            q[3] = b->avel[2] * s;
        }

        // do the finite rotation
        dQuaternion q2;
        dQMultiply0 (q2,q,b->q);
        for (unsigned int j=0; j<4; j++) b->q[j] = q2[j];

        // do the infitesimal rotation if required
        if (b->flags & dxBodyFlagFiniteRotationAxis) {
            dReal dq[4];
            dWtoDQ (irv,b->q,dq);
            for (unsigned int j=0; j<4; j++) b->q[j] += h * dq[j];
        }
    }
    else {
        // the normal way - do an infitesimal rotation
        dReal dq[4];
        dWtoDQ (b->avel,b->q,dq);
        for (unsigned int j=0; j<4; j++) b->q[j] += h * dq[j];
    }

    // normalize the quaternion and convert it to a rotation matrix
    dNormalize4 (b->q);
    dQtoR (b->q,b->posr.R);

    // notify all attached geoms that this body has moved
    dxWorldProcessContext *world_process_context = b->world->UnsafeGetWorldProcessingContext(); 
    for (dxGeom *geom = b->geom; geom; geom = dGeomGetBodyNext (geom)) {
        world_process_context->LockForStepbodySerialization();
        dGeomMoved (geom);
        world_process_context->UnlockForStepbodySerialization();
    }

    // notify the user
    if (b->moved_callback != NULL) {
        b->moved_callback(b);
    }

    // damping
    if (b->flags & dxBodyLinearDamping) {
        const dReal lin_threshold = b->dampingp.linear_threshold;
        const dReal lin_speed = dCalcVectorDot3( b->lvel, b->lvel );
        if ( lin_speed > lin_threshold) {
            const dReal k = 1 - b->dampingp.linear_scale;
            dScaleVector3(b->lvel, k);
        }
    }
    if (b->flags & dxBodyAngularDamping) {
        const dReal ang_threshold = b->dampingp.angular_threshold;
        const dReal ang_speed = dCalcVectorDot3( b->avel, b->avel );
        if ( ang_speed > ang_threshold) {
            const dReal k = 1 - b->dampingp.angular_scale;
            dScaleVector3(b->avel, k);
        }
    }
}
void *impComp(void *Args)
{
    struct arg_s *args = (struct arg_s *)Args;
    
    // Temporary variables and constants (high-pass filter)
	const double W = 2*M_PI*100/args->fs;
	const double R1 = exp(-W);
	const double R2 = R1;
	const double B1 = 2*R1*cos(W);
	const double B2 = -R1 * R1;
	const double A1 = -(1+R2);
	const double A2 = R2;
	double       X0, Y0, Y1, Y2;
       
    
    // Temporary variables and constants (image-method)
    double*             r = new double[3];
	double*             s = new double[3];
	double*             L = new double[3];
    double*             LPI = new double[args->Tw+1];
    double              hu[6];
    double              refl[3];
    double              dist;
    double              strength;
    
    int                 loud_nr;
    int                 mic_nr;
    int                 n1,n2,n3;
    int                 mx,my,mz;
    int                 q, j, k;
    int                 n;
    int                 fdist;
    int                 pos;
    uint64_t  abs_counter;
    
    for (loud_nr = 0; loud_nr < args->nr_of_louds; loud_nr++ )	
	{	
		
			s[0] = args->ss[loud_nr + 0*args->nr_of_louds] / args->cTs;
			s[1] = args->ss[loud_nr + 1*args->nr_of_louds] / args->cTs;
			s[2] = args->ss[loud_nr + 2*args->nr_of_louds] / args->cTs;
        
		for (mic_nr = args->tNum; mic_nr < args->nr_of_mics ; mic_nr=mic_nr+args->tTot)
		{
			
			r[0] = args->rr[mic_nr + 0*args->nr_of_mics] / args->cTs;
			r[1] = args->rr[mic_nr + 1*args->nr_of_mics] / args->cTs;
			r[2] = args->rr[mic_nr + 2*args->nr_of_mics] / args->cTs;
	
			n1 = ceil(args->nsamples/(2*args->L[0]))*args->dim_s[0];
			n2 = ceil(args->nsamples/(2*args->L[1]))*args->dim_s[1];
			n3 = ceil(args->nsamples/(2*args->L[2]))*args->dim_s[2];
	
			// Generate room impulse response
			for (mx = -n1 ; mx <= n1 ; mx++)
			{
				hu[0] = 2*mx*args->L[0];
		
	
				for (my = -n2 ; my <= n2 ; my++)
				{
					hu[1] = 2*my*args->L[1];
	
					for (mz = -n3 ; mz <= n3 ; mz++)
					{
						hu[2] = 2*mz*args->L[2];
	
						for (q = 0 ; q <= 1*args->dim_s[0] ; q++)
						{
                            hu[3] = s[0] - r[0] + 2*q*r[0] + hu[0];
							refl[0] = pow(args->beta[0], abs(mx)) * pow(args->beta[1], abs(mx+q));
							
                            for (j = 0 ; j <= 1*args->dim_s[1] ; j++)
							{
								hu[4] = s[1] - r[1] + 2*j*r[1] + hu[1];
								refl[1] = pow(args->beta[2], abs(my)) * pow(args->beta[3], abs(my+j));
	
								for (k = 0 ; k <= 1*args->dim_s[2] ; k++)
								{
									hu[5] = s[2] - r[2] + 2*k*r[2] + hu[2];
									refl[2] = pow(args->beta[4],abs(mz)) * pow(args->beta[5], abs(mz+k));
	
									dist = sqrt(pow(hu[3], 2) + pow(hu[4], 2) + pow(hu[5], 2));
	
									fdist = (int) floor(dist);
									if (abs(2*mx+q)+abs(2*my+j)+abs(2*mz+k) <= args->order || args->order == -1)
									{
										if (fdist < args->nsamples)
										{
											
                                            //if ( mx == 0 && my == 0 && mz == 0 && q == 0 && j == 0 && k==0)
                                            //{
                                            //    mexPrintf("x: %f | y: %f | z: %f \n",refl[0],refl[1],refl[2]);
                                            //}
                                            
                                            strength = sim_microphone(hu[3], hu[4], args->angle, args->mtype)
												* refl[0]*refl[1]*refl[2]/(4*M_PI*dist*args->cTs);
	
                                            //if ( mx == 0 && my == 0 && mz == 0 && q == 0 && j == 0 && k==0)
                                            //{
                                            //    mexPrintf("str: %f | dist: %f | dist*cTs: %f \n",strength,dist,dist*cTs);
                                            //}
                                            
                                      		if (args->lp_filter == 1)
                                            {
                                                for (n = 0 ; n < args->Tw+1 ; n++)
                                                    LPI[n] = args->hanning_window[n] * args->Fc * sinc( M_PI*args->Fc*(n-(dist-fdist)-(args->Tw/2)) );

                                                pos = fdist-(args->Tw/2);
                                                
                                                for (n = 0; n < args->Tw+1; n++)
                                                {    
                                                  if (pos+n >=0 && pos+n < args->nsamples)
                                                  {
                                                    //if ( mx == 0 && my == 0 && mz == 0)
                                                      abs_counter = (uint64_t)pos+(uint64_t)n +(uint64_t)args->nsamples*(uint64_t)mic_nr + (uint64_t)args->nsamples*(uint64_t)args->nr_of_mics*(uint64_t)loud_nr;//     
                                                      args->imp[ abs_counter] += strength * LPI[n];  
                                                  }
                                                }                                                
                                            }
                                            else
                                            {
                                                //if ( mx == 0 && my == 0 && mz == 0)
                                                abs_counter = (uint64_t)fdist + (uint64_t)args->nsamples*(uint64_t)mic_nr + (uint64_t)args->nsamples*(uint64_t)args->nr_of_mics*(uint64_t)loud_nr;                                                
                                                args->imp[ abs_counter] += strength;
                                            }
										}
									}
								}
							}
						}
					}
				}
			}
	
			// 'Original' high-pass filter as proposed by Allen and Berkley.
			if (args->hp_filter == 1)
			{
				Y0 = 0.0;
				Y1 = 0.0;
				Y2 = 0.0;
				for (int idx = 0 ; idx < args->nsamples ; idx++)
				{                    
                    abs_counter = (uint64_t)idx + (uint64_t)args->nsamples*(uint64_t)mic_nr + (uint64_t)args->nsamples*(uint64_t)args->nr_of_mics*(uint64_t)loud_nr;                                                                    
					X0 = args->imp[abs_counter];
					Y2 = Y1;
					Y1 = Y0;
					Y0 = B1*Y1 + B2*Y2 + X0;
					args->imp[abs_counter] = Y0 + A1*Y1 + A2*Y2;                       
				}
			}
		}
	}
   
    pthread_exit(NULL);
}
Esempio n. 5
0
File: window.c Progetto: xdsopl/fir
float lanczos(float n, float N, float a)
{
	(void)a;
	return sinc(2.0f * n / (N - 1.0f) - 1.0f);
}
Esempio n. 6
0
double Lanczos3_filter( double t ) {
	if(t < 0) t = -t;
	if(t < 3.0) return(sinc(t) * sinc(t/3.0));
	return(0.0);
}
Esempio n. 7
0
void GWigAy(struct gwig *pWig, double *Xvec, double *pay, double *paypx)
{
  int    i;
  double x, y, z;
  double kx, ky, kz, tz, kw;
  double cx, sx, chx, shx;
  double cy, syky, chy, shy, sz, shyky;
  double gamma0, beta0;
  double ay, aypx;

  x = Xvec[0];
  y = Xvec[2];
  z = pWig->Zw;
    
  kw   = 2e0*PI/(pWig->Lw);
  ay   = 0e0;
  aypx = 0e0;

  gamma0  = pWig->E0/XMC2;
  beta0   = sqrt(1e0 - 1e0/(gamma0*gamma0));
     
  if (pWig->NHharm && z>=pWig->zStartH && z<=pWig->zEndH) {
    if (pWig->PB0H!=0)
      pWig->Aw = (q_e/m_e/clight)/(2e0*PI) * (pWig->Lw) * (pWig->PB0H);
    else
      pWig->Aw = (q_e/m_e/clight)/(2e0*PI) * (pWig->Lw) * (pWig->PB0);
    if (!pWig->HSplitPole) {
      /* Normal Horizontal Wiggler: note that one potentially could have: kx=0 */
      for ( i = 0; i < pWig->NHharm; i++ ){
        pWig->HCw[i] = (pWig->HCw_raw[i])*(pWig->Aw)/(gamma0*beta0);
        kx = pWig->Hkx[i];
        ky = pWig->Hky[i];
        kz = pWig->Hkz[i];
        tz = pWig->Htz[i];
        
        sx = sin(kx * x);
        shy = sinh(ky * y);
        sz  = sin(kz * z + tz);
        ay  = ay + (pWig->HCw[i])*(kw/kz)*(kx/ky)*sx*shy*sz;
        
        cx  = cos(kx * x);
        chy = cosh(ky * y);
        
        aypx = aypx + (pWig->HCw[i])*(kw/kz)*ipow(kx/ky,2) * cx*chy*sz;
      }
    } else {
      /* Split-pole Horizontal Wiggler: note that one potentially could have: ky=0 (caught in main routine) */
      for ( i = 0; i < pWig->NHharm; i++ ){
        pWig->HCw[i] = (pWig->HCw_raw[i])*(pWig->Aw)/(gamma0*beta0);
        kx = pWig->Hkx[i];
        ky = pWig->Hky[i];
        kz = pWig->Hkz[i];
        tz = pWig->Htz[i];

        sz   = sin(kz * z + tz);
        ay   = ay - pWig->HCw[i]*(kw/kz)*kx/ky*sin(ky*y)*sinh(kx*x)*sz;
        aypx = aypx + pWig->HCw[i]*(kw/kz)*ipow(kx/ky,2)*cos(ky*y)*cosh(kx*x)*sz;
      }
    }
  }
  
  
  if (pWig->NVharm && z>=pWig->zStartV && z<=pWig->zEndV) {
    if (pWig->PB0V!=0)
      pWig->Aw = (q_e/m_e/clight)/(2e0*PI) * (pWig->Lw) * (pWig->PB0V);
    else
      pWig->Aw = (q_e/m_e/clight)/(2e0*PI) * (pWig->Lw) * (pWig->PB0);
    if (!pWig->VSplitPole) {
      /* Normal Vertical Wiggler, could have ky=0 */
      for (i = 0; i < pWig->NVharm; i++ ) {
        pWig->VCw[i] = (pWig->VCw_raw[i])*(pWig->Aw)/(gamma0*beta0);       
        kx = pWig->Vkx[i];
        ky = pWig->Vky[i];
        kz = pWig->Vkz[i];
        tz = pWig->Vtz[i];
        
        chx = cosh(kx * x);
        cy  = cos(ky * y);
        sz  = sin(kz * z + tz);
        ay  = ay + (pWig->VCw[i])*(kw/kz)*chx*cy*sz;
        
        shx = sinh(kx * x);
        if (abs(ky/kw) > GWIG_EPS)
          syky  = sin(ky * y)/ky;
        else 
          syky = y * sinc(ky * y);
        aypx = aypx + (pWig->VCw[i])*(kw/kz)* kx*shx*syky*sz;
      }
    } else {
      /* Split-pole Vertical Wiggler, could have kx=0 */
      for (i = 0; i < pWig->NVharm; i++ ) {
        pWig->VCw[i] = (pWig->VCw_raw[i])*(pWig->Aw)/(gamma0*beta0);       
        kx = pWig->Vkx[i];
        ky = pWig->Vky[i];
        kz = pWig->Vkz[i];
        tz = pWig->Vtz[i];

        sz   = sin(kz * z + tz);
        ay   = ay + (pWig->VCw[i])*(kw/kz)*cosh(ky*y)*cos(kx*x)*sz;
        shyky = sinh(ky*y)/ky;
        aypx = aypx - (pWig->VCw[i])*(kw/kz)*kx*shyky*sin(kx*x)*sz;
      }
    }
  }
  
  
  *pay = ay;
  *paypx = aypx;
}
Esempio n. 8
0
static inline void
moveAndRotateBody (dxBody * b, dReal h)
{
	int j;

	// handle linear velocity
	for (j = 0; j < 3; j++)
		b->posr.pos[j] += dMUL(h,b->lvel[j]);

	if (b->flags & dxBodyFlagFiniteRotation)
	{
		dVector3 irv;			// infitesimal rotation vector
		dQuaternion q;			// quaternion for finite rotation

		if (b->flags & dxBodyFlagFiniteRotationAxis)
		{
			// split the angular velocity vector into a component along the finite
			// rotation axis, and a component orthogonal to it.
			dVector3 frv;	// finite rotation vector
			dReal k = dDOT (b->finite_rot_axis, b->avel);
			frv[0] = dMUL(b->finite_rot_axis[0],k);
			frv[1] = dMUL(b->finite_rot_axis[1],k);
			frv[2] = dMUL(b->finite_rot_axis[2],k);
			irv[0] = b->avel[0] - frv[0];
			irv[1] = b->avel[1] - frv[1];
			irv[2] = b->avel[2] - frv[2];

			// make a rotation quaternion q that corresponds to frv * h.
			// compare this with the full-finite-rotation case below.
			h = dMUL(h,REAL (0.5));
			dReal theta = dMUL(k,h);
			q[0] = dCos (theta);
			dReal s = dMUL(sinc (theta),h);
			q[1] = dMUL(frv[0],s);
			q[2] = dMUL(frv[1],s);
			q[3] = dMUL(frv[2],s);
		}
		else
		{
			// make a rotation quaternion q that corresponds to w * h
			dReal wlen = dSqrt (dMUL(b->avel[0],b->avel[0]) + dMUL(b->avel[1],b->avel[1]) + dMUL(b->avel[2],b->avel[2]));
			h = dMUL(h,REAL (0.5));
			dReal theta = dMUL(wlen,h);
			q[0] = dCos (theta);
			dReal s = dMUL(sinc (theta),h);
			q[1] = dMUL(b->avel[0],s);
			q[2] = dMUL(b->avel[1],s);
			q[3] = dMUL(b->avel[2],s);
		}

		// do the finite rotation
		dQuaternion q2;
		dQMultiply0 (q2, q, b->q);
		for (j = 0; j < 4; j++)
			b->q[j] = q2[j];

		// do the infitesimal rotation if required
		if (b->flags & dxBodyFlagFiniteRotationAxis)
		{
			dReal dq[4];
			dWtoDQ (irv, b->q, dq);
			for (j = 0; j < 4; j++)
				b->q[j] += dMUL(h,dq[j]);
		}
	}
	else
	{
		// the normal way - do an infitesimal rotation
		dReal dq[4];
		dWtoDQ (b->avel, b->q, dq);
		for (j = 0; j < 4; j++)
			b->q[j] += dMUL(h,dq[j]);
	}

	// normalize the quaternion and convert it to a rotation matrix
	dNormalize4 (b->q);
	dQtoR (b->q, b->posr.R);

	// notify all attached geoms that this body has moved
	for (dxGeom * geom = b->geom; geom; geom = dGeomGetBodyNext (geom))
		dGeomMoved (geom);
}
Esempio n. 9
0
void GWigAy(struct gwig *pWig, double *Xvec, double *pay, double *paypx)
{
  int    i;
  double x, y, z;
  double kx, ky, kz, tz, kw;
  double cx, sx, chx, shx;
  double cy, syky, chy, shy, sz;
  double gamma0, beta0;
  double ay, aypx;

  x = Xvec[0];
  y = Xvec[2];
  z = pWig->Zw;
    
  kw   = 2e0*PI/(pWig->Lw);
  ay   = 0e0;
  aypx = 0e0;

  gamma0  = pWig->E0/XMC2;
  beta0   = sqrt(1e0 - 1e0/(gamma0*gamma0));
  pWig->Aw = (q_e/m_e/clight)/(2e0*PI) * (pWig->Lw) * (pWig->PB0);
     
  /* Horizontal Wiggler: note that one potentially could have: kx=0 */
  for ( i = 0; i < pWig->NHharm; i++ ){
    pWig->HCw[i] = (pWig->HCw_raw[i])*(pWig->Aw)/(gamma0*beta0);
    kx = pWig->Hkx[i];
    ky = pWig->Hky[i];
    kz = pWig->Hkz[i];
    tz = pWig->Htz[i];
  
    sx = sin(kx * x);
    shy = sinh(ky * y);
    sz  = sin(kz * z + tz);
    ay  = ay + (pWig->HCw[i])*(kw/kz)*(kx/ky)*sx*shy*sz;
  
    cx  = cos(kx * x);
    chy = cosh(ky * y);
    
    aypx = aypx + (pWig->HCw[i])*(kw/kz)*pow(kx/ky,2) * cx*chy*sz;
  }

  /* Vertical Wiggler: note that one potentially could have: ky=0 */
  for (i = 0; i < pWig->NVharm; i++) {
    pWig->VCw[i] = (pWig->VCw_raw[i])*(pWig->Aw)/(gamma0*beta0);       
    kx = pWig->Vkx[i];
    ky = pWig->Vky[i];
    kz = pWig->Vkz[i];
    tz = pWig->Vtz[i];

    chx = cosh(kx * x);
    cy  = cos(ky * y);
    sz  = sin(kz * z + tz);
    ay  = ay + (pWig->VCw[i])*(kw/kz)*chx*cy*sz;

    shx = sinh(kx * x);
    if (abs(ky/kw) > GWIG_EPS) {
      syky  = sin(ky * y)/ky;
    } else {
      syky = y * sinc(ky * y);
      aypx = aypx + (pWig->VCw[i])*(kw/kz)* kx*shx*syky*sz;
    }
  }
  
  *pay = ay;
  *paypx = aypx;
}
Esempio n. 10
0
status_t Resampler::UpdateCoefficients(int windowType, double alpha)
{
    const double bandWidth = (m_StopBandFrequency - m_PassBandFrequency);
    DEBUG_LOG("nFp=%g, nFs=%g\n", m_PassBandFrequency, m_StopBandFrequency);
    int N = 0;
    switch(windowType)
    {
    case HANNING:
        {
            N = static_cast<int>(6.2 / 2 / bandWidth + 0.5);
            N += (N & 1 ? 0 : 1);
            N *= m_L;
            DEBUG_LOG("N=%d (Hanning)\n", N);
            m_Coefficients.Resize(N);
            masp::window::Hanning(m_Coefficients);
        }
        break;
    case HAMMING:
        {
            N = static_cast<int>(6.6 / 2 / bandWidth + 0.5);
            N += (N & 1 ? 0 : 1);
            N *= m_L;
            DEBUG_LOG("N=%d (Hamming)\n", N);
            m_Coefficients.Resize(N);
            masp::window::Hamming(m_Coefficients);
        }
        break;
    case BLACKMAN:
        {
            N = static_cast<int>(11.0 / 2 / bandWidth + 0.5);
            N += (N & 1 ? 0 : 1);
            N *= m_L;
            DEBUG_LOG("N=%d (Blackman)\n", N);
            m_Coefficients.Resize(N);
            masp::window::Blackman(m_Coefficients);
        }
        break;
    case KAISER:
        {
            ASSERT( 2.0 <= alpha && alpha <= 10.0 );
            const int index = static_cast<int>(alpha + 0.5) - g_KaiserAlphaOffset;
            N = static_cast<int>( g_KaiserTransitionBand[index] / bandWidth + 0.5);
            N += (N & 1 ? 0 : 1);
            N *= m_L;
            DEBUG_LOG("N=%d (Kaiser), alpha=%g\n", N, alpha);
            m_Coefficients.Resize(N);
            masp::window::Kaiser(m_Coefficients, alpha);
        }
        break;
    default:
        ASSERT ( 0 );
        break;
    }

    ASSERT( N != 0 );
    {
        const double cutoff = (m_StopBandFrequency + m_PassBandFrequency) / 2.0 / (m_L > m_M ? m_L : m_M);
        DEBUG_LOG("nFp=%g, nFs=%g\n", m_PassBandFrequency, m_StopBandFrequency);
        DEBUG_LOG("nFc=%g\n", cutoff);
        mcon::Vector<double> sinc(N);
        masp::fir::GetCoefficientsLpfSinc(sinc, cutoff);
        m_Coefficients *= sinc;
    }

    return NO_ERROR;
}
Esempio n. 11
0
qreal UtilityFunction::f(qreal x)
{
    return 0.4 + sinc( 4 * x ) + 1.1 * sinc( 4 * x + 2 ) + 0.8 * sinc( 6 * x - 2 ) + 0.7 * sinc( 6 * x - 4 );
    //return sin( x );
}
static double
lanczos (double x, int n)
{
    return sinc (x) * sinc (x * (1.0 / n));
}
Esempio n. 13
0
static double lanczos(double n, double N, double alpha)
{
    (void)alpha;
    return sinc(2.0 * n / (N - 1.0) - 1.0);
}
Esempio n. 14
0
double U(double x, double y, double z int p) {
  return pow(sinc(x)*sinc(y)*sinc(z), p);
}
Esempio n. 15
0
inline double lpf(int i, double f) { return 2 * f * sinc(i * 2 * M_PI * f); }
Esempio n. 16
0
static inline double lanzcos(double index)
{
   return sinc(index);
}
Esempio n. 17
0
int main(int argc, char** argv)
{
    // nc is the number of bits to store the coefficients
    const int nc = 32;

    bool polyphase = false;
    unsigned int polyM = 160;
    unsigned int polyN = 147;
    bool debug = false;
    double Fs = 48000;
    double Fc = 20478;
    double atten = 1;
    int format = 0;


    // in order to keep the errors associated with the linear
    // interpolation of the coefficients below the quantization error
    // we must satisfy:
    //   2^nz >= 2^(nc/2)
    //
    // for 16 bit coefficients that would be 256
    //
    // note that increasing nz only increases memory requirements,
    // but doesn't increase the amount of computation to do.
    //
    //
    // see:
    // Smith, J.O. Digital Audio Resampling Home Page
    // https://ccrma.stanford.edu/~jos/resample/, 2011-03-29
    //
    int nz = 4;

    //         | 0.1102*(A - 8.7)                         A > 50
    //  beta = | 0.5842*(A - 21)^0.4 + 0.07886*(A - 21)   21 <= A <= 50
    //         | 0                                        A < 21
    //   with A is the desired stop-band attenuation in dBFS
    //
    // for eg:
    //
    //    30 dB    2.210
    //    40 dB    3.384
    //    50 dB    4.538
    //    60 dB    5.658
    //    70 dB    6.764
    //    80 dB    7.865
    //    90 dB    8.960
    //   100 dB   10.056
    double beta = 7.865;


    // 2*nzc = (A - 8) / (2.285 * dw)
    //      with dw the transition width = 2*pi*dF/Fs
    //
    int nzc = 8;

    //
    // Example:
    // 44.1 KHz to 48 KHz resampling
    // 100 dB rejection above 28 KHz
    //   (the spectrum will fold around 24 KHz and we want 100 dB rejection
    //    at the point where the folding reaches 20 KHz)
    //  ...___|_____
    //        |     \|
    //        | ____/|\____
    //        |/alias|     \
    //  ------/------+------\---------> KHz
    //       20     24     28

    // Transition band 8 KHz, or dw = 1.0472
    //
    // beta = 10.056
    // nzc  = 20
    //

    int ch;
    while ((ch = getopt(argc, argv, ":hds:c:n:f:l:b:p:v:")) != -1) {
        switch (ch) {
            case 'd':
                debug = true;
                break;
            case 'p':
                if (sscanf(optarg, "%u/%u", &polyM, &polyN) != 2) {
                    usage(argv[0]);
                }
                polyphase = true;
                break;
            case 's':
                Fs = atof(optarg);
                break;
            case 'c':
                Fc = atof(optarg);
                break;
            case 'n':
                nzc = atoi(optarg);
                break;
            case 'l':
                nz = atoi(optarg);
                break;
            case 'f':
                if (!strcmp(optarg,"fixed")) format = 0;
                else if (!strcmp(optarg,"float")) format = 1;
                else usage(argv[0]);
                break;
            case 'b':
                beta = atof(optarg);
                break;
            case 'v':
                atten = pow(10, -fabs(atof(optarg))*0.05 );
                break;
            case 'h':
            default:
                usage(argv[0]);
                break;
        }
    }

    // cut off frequency ratio Fc/Fs
    double Fcr = Fc / Fs;


    // total number of coefficients (one side)
    const int M = (1 << nz);
    const int N = M * nzc;

    // generate the right half of the filter
    if (!debug) {
        printf("// cmd-line: ");
        for (int i=1 ; i<argc ; i++) {
            printf("%s ", argv[i]);
        }
        printf("\n");
        if (!polyphase) {
            printf("const int32_t RESAMPLE_FIR_SIZE           = %d;\n", N);
            printf("const int32_t RESAMPLE_FIR_LERP_INT_BITS  = %d;\n", nz);
            printf("const int32_t RESAMPLE_FIR_NUM_COEF       = %d;\n", nzc);
        } else {
            printf("const int32_t RESAMPLE_FIR_SIZE           = %d;\n", 2*nzc*polyN);
            printf("const int32_t RESAMPLE_FIR_NUM_COEF       = %d;\n", 2*nzc);
        }
        if (!format) {
            printf("const int32_t RESAMPLE_FIR_COEF_BITS      = %d;\n", nc);
        }
        printf("\n");
        printf("static %s resampleFIR[] = {", !format ? "int32_t" : "float");
    }

    if (!polyphase) {
        for (int i=0 ; i<=M ; i++) { // an extra set of coefs for interpolation
            for (int j=0 ; j<nzc ; j++) {
                int ix = j*M + i;
                double x = (2.0 * M_PI * ix * Fcr) / (1 << nz);
                double y = kaiser(ix+N, 2*N, beta) * sinc(x) * 2.0 * Fcr;
                y *= atten;

                if (!debug) {
                    if (j == 0)
                        printf("\n    ");
                }

                if (!format) {
                    int64_t yi = floor(y * ((1ULL<<(nc-1))) + 0.5);
                    if (yi >= (1LL<<(nc-1))) yi = (1LL<<(nc-1))-1;
                    printf("0x%08x, ", int32_t(yi));
                } else {
                    printf("%.9g%s ", y, debug ? "," : "f,");
                }
            }
        }
    } else {
        for (int j=0 ; j<polyN ; j++) {
            // calculate the phase
            double p = ((polyM*j) % polyN) / double(polyN);
            if (!debug) printf("\n    ");
            else        printf("\n");
            // generate a FIR per phase
            for (int i=-nzc ; i<nzc ; i++) {
                double x = 2.0 * M_PI * Fcr * (i + p);
                double y = kaiser(i+N, 2*N, beta) * sinc(x) * 2.0 * Fcr;;
                y *= atten;
                if (!format) {
                    int64_t yi = floor(y * ((1ULL<<(nc-1))) + 0.5);
                    if (yi >= (1LL<<(nc-1))) yi = (1LL<<(nc-1))-1;
                    printf("0x%08x", int32_t(yi));
                } else {
                    printf("%.9g%s", y, debug ? "" : "f");
                }

                if (debug && (i==nzc-1)) {
                } else {
                    printf(", ");
                }
            }
        }
    }

    if (!debug) {
        printf("\n};");
    }
    printf("\n");
    return 0;
}
Esempio n. 18
0
static inline double lanzcos(double phase)
{
   return sinc(phase);
}
void KspaceCube::evaluate(double &re, double &im, double kx,double ky,double kz, double tau) {
	Q_UNUSED(tau);
	re=m_length_x*m_length_y*m_length_z*sinc(kx*m_length_x)*sinc(ky*m_length_y)*sinc(kz*m_length_z); 
	im=0;
}	
Esempio n. 20
0
static inline double window_function(double index)
{
   return sinc(M_PI * index);
}
Esempio n. 21
0
double FIRFilter::_calcH(int n, double omega) {
	if (n == 0) {
		return omega / PI;
	}
	return omega / PI * sinc(n*omega);
}
Esempio n. 22
0
 std::complex<double> SBBox::SBBoxImpl::kValue(const Position<double>& k) const
 {
     return _flux * sinc(k.x*_wo2pi)*sinc(k.y*_ho2pi);
 }
int RateChanger<T>::Execute()
{
  T *start_of_buffer, *end_of_buffer;
  T *read_ptr, *write_ptr;
  T input_samp, *input_signal_ptr;
  T *output_signal_ptr;
  T *output_base;
  T sum;
  T zero_T;
  T *ptr_to_center;
  int num_sidelobes;
  int max_buf_len;
  int is, input_block_size;
  int output_block_size;
  double samp_intvl;
  float *sinc_val;
  int idx;
  double sinc_offset;
  double rt_brack_needed;
  double samp_inst;
  int num_inputs_avail;
  int rt_brack_avail;
  int beg_samp_count;
  int iflag;
  bool input_has_been_read;

  //-----------------------------------------
  // Get pointers for input and output signals
  
  output_signal_ptr = GET_OUTPUT_PTR(Out_Sig);
  output_base = GET_OUTPUT_PTR(Out_Sig);
  input_signal_ptr = GET_INPUT_PTR(In_Sig);

  input_block_size = In_Sig->GetValidBlockSize();
  *DebugFile << "input_block_size = " << input_block_size << endl;


  //------------------------------------------------
  //  copy frequently used items into local storage

  //block_size = Max_Block_Size;
  samp_intvl = Samp_Intvl;
  read_ptr = Read_Ptr;
  write_ptr = Write_Ptr;
  start_of_buffer = Start_Of_Buffer;
  end_of_buffer = End_Of_Buffer;
  sinc_val = Sinc_Val;

//    case INTERP_MODE_SINC:
      num_sidelobes = Num_Sidelobes;
      max_buf_len = Max_Buffer_Len;
      rt_brack_avail = Rt_Brack_Avail;
      num_inputs_avail = input_block_size;

      if(PassNumber == 1)
      {
        //----------------------------------
        // preload enough input samples to
        // accomodate non-causal tail of sinc window
        for(is=Num_Sidelobes; is>=0; is--)
        {
          *(end_of_buffer-is) = 0.0;
         // Buffer_Fullness++;
        }
        for(is=0; is<Num_Sidelobes; is++)
        {
          input_samp = *input_signal_ptr++;
          *write_ptr++ = input_samp;
          //Buffer_Fullness++;
          num_inputs_avail--;
        }
        Out_Samp_Count = 0;
        rt_brack_avail = 0;
      }

      //------------------------------------
      // processing for every pass

      beg_samp_count = Out_Samp_Count;

      while(num_inputs_avail >= 0)
      {
        samp_inst = Out_Samp_Count*Out_Samp_Intvl/Samp_Intvl;
        rt_brack_needed = ceil(samp_inst);

        if(rt_brack_needed <= rt_brack_avail)
        {
          if(samp_inst == rt_brack_needed)
          {
            // rt_bracket sample is the desired output
            // no interpolation needed
            ptr_to_center = Read_Ptr_Start + Num_Sidelobes;
            if(ptr_to_center > end_of_buffer) ptr_to_center -= Max_Buffer_Len;
            sum = *ptr_to_center;
          }
          else
          {
            // interploation is needed
            // desired output falls between rt_bracket and rt_bracket-1

            // generate sinc window

            sinc_offset = rt_brack_needed - samp_inst;
            for(idx=0; idx < 2*Num_Sidelobes; idx++)
              {
              sinc_val[idx] = float(sinc( idx + sinc_offset-Num_Sidelobes));
              }
            sinc_val[0] = float(0.6*sinc_val[0]);
            sinc_val[2*Num_Sidelobes-1] = float(0.6*sinc_val[2*Num_Sidelobes-1]);
            //---------------------------------------
            read_ptr = Read_Ptr_Start;

            //-----------------------------------------------
            sum = 0.0;
            zero_T = 0.0;
            for(int sum_idx=0; sum_idx< 2*Num_Sidelobes; sum_idx++)
            {
              sum += (*read_ptr) * sinc_val[sum_idx];
              read_ptr++;
              if(read_ptr > end_of_buffer)
              { 
                read_ptr = start_of_buffer;
                *DebugFile << "read_ptr wrapped" << endl;
              }
            }
          }
          Out_Samp_Count++;
          if(Out_Samp_Count == 2016)
          {
            iflag = 1;
          }
          *output_signal_ptr++ = sum;
          input_has_been_read = false;
        } // end of output generation
        else
        {
          // need to read some more inputs
          // are any avail?
          if(num_inputs_avail > 0)
          {
            input_samp = *input_signal_ptr++;
            *write_ptr++ = input_samp;
            if(write_ptr > end_of_buffer) 
            {
              write_ptr = start_of_buffer;
            }
            rt_brack_avail++;
            Read_Ptr_Start++;
            if(Read_Ptr_Start > end_of_buffer) Read_Ptr_Start = start_of_buffer;
          }
          num_inputs_avail--;
          input_has_been_read = true;
        }
      }

      output_block_size = Out_Samp_Count - beg_samp_count;
      Out_Sig->SetValidBlockSize(output_block_size);
      *DebugFile << "delayed output block size = " << output_block_size << endl;
      if(input_has_been_read)
      {
        *DebugFile << "input_has_been_read = true" << endl;
      }
      else
      {
        *DebugFile << "input_has_been_read = false" << endl;
      }
//      break;

  Rt_Brack_Avail = rt_brack_avail;
  Read_Ptr = read_ptr;
  Write_Ptr = write_ptr;
  return(_MES_AOK);
}
Esempio n. 24
0
int main () {
    double f = 1.0;
    fprintf(stderr, "sinc(%f) = %f\n", f, sinc(f));
    return 0;
}
Esempio n. 25
0
static float do_sinc(int x, int y, int, float* param)
{
  return float((sinc((x - param[3])*param[1])*sinc((y - param[4])*param[2]) + param[5])*param[0]);
}
Esempio n. 26
0
/**
   Setup the detector transfer functions. See maos/setup_powfs.c
 */
static void setup_powfs_dtf(POWFS_S *powfs, const PARMS_S* parms){
    const int npowfs=parms->maos.npowfs;
    for(int ipowfs=0; ipowfs<npowfs; ipowfs++){
	const int ncomp=parms->maos.ncomp[ipowfs];
	const int ncomp2=ncomp>>1;
	const int embfac=parms->maos.embfac[ipowfs];
	const int pixpsa=parms->skyc.pixpsa[ipowfs];
	const double pixtheta=parms->skyc.pixtheta[ipowfs];
	const double blur=parms->skyc.pixblur[ipowfs]*pixtheta;
	const double e0=exp(-2*M_PI*M_PI*blur*blur);
	const double dxsa=parms->maos.dxsa[ipowfs];
	const double pixoffx=parms->skyc.pixoffx[ipowfs];
	const double pixoffy=parms->skyc.pixoffy[ipowfs];
	const double pxo=-(pixpsa/2-0.5+pixoffx)*pixtheta;
	const double pyo=-(pixpsa/2-0.5+pixoffy)*pixtheta;
	loc_t *loc_ccd=mksqloc(pixpsa, pixpsa, pixtheta, pixtheta, pxo, pyo);
	powfs[ipowfs].dtf=mycalloc(parms->maos.nwvl,DTF_S);
	for(int iwvl=0; iwvl<parms->maos.nwvl; iwvl++){
	    const double wvl=parms->maos.wvl[iwvl];
	    const double dtheta=wvl/(dxsa*embfac);
	    const double pdtheta=pixtheta*pixtheta/(dtheta*dtheta);
	    const double du=1./(dtheta*ncomp);
	    const double du2=du*du;
	    const double dupth=du*pixtheta;
	    cmat *nominal=cnew(ncomp,ncomp);
	    //cfft2plan(nominal,-1);
	    //cfft2plan(nominal,1);
	    cmat* pn=nominal;
	    const double theta=0;
	    const double ct=cos(theta);
	    const double st=sin(theta);
	    for(int iy=0; iy<ncomp; iy++){
		int jy=iy-ncomp2;
		for(int ix=0; ix<ncomp; ix++){
		    int jx=ix-ncomp2;
		    double ir=ct*jx+st*jy;
		    double ia=-st*jx+ct*jy;
		    IND(pn,ix,iy)=sinc(ir*dupth)*sinc(ia*dupth)
			*pow(e0,ir*ir*du2)*pow(e0,ia*ia*du2)
			*pdtheta;
		}
	    }
	    if(parms->skyc.fnpsf1[ipowfs]){
		warning("powfs %d has additional otf to be multiplied\n", ipowfs);
		dcell *psf1c=dcellread("%s", parms->skyc.fnpsf1[ipowfs]);
		dmat *psf1=NULL;
		if(psf1c->nx == 1){
		    psf1=dref(psf1c->p[0]);
		}else if(psf1c->nx==parms->maos.nwvl){
		    psf1=dref(psf1c->p[iwvl]);
		}else{
		    error("skyc.fnpsf1 has wrong dimension\n");
		}
		dcellfree(psf1c);
		if(psf1->ny!=2){
		    error("skyc.fnpsf1 has wrong dimension\n");
		}
		dmat *psf1x=dnew_ref(psf1->nx, 1, psf1->p);
		dmat *psf1y=dnew_ref(psf1->nx, 1, psf1->p+psf1->nx);
		dmat *psf2x=dnew(ncomp*ncomp, 1);
		for(int iy=0; iy<ncomp; iy++){
		    int jy=iy-ncomp2;
		    for(int ix=0; ix<ncomp; ix++){
			int jx=ix-ncomp2;
			psf2x->p[ix+iy*ncomp]=sqrt(jx*jx+jy*jy)*dtheta;
		    }
		}
		info("powfs %d, iwvl=%d, dtheta=%g\n", ipowfs, iwvl, dtheta*206265000);
		writebin(psf2x, "powfs%d_psf2x_%d", ipowfs,iwvl);
		dmat *psf2=dinterp1(psf1x, psf1y, psf2x, 0);
		normalize_sum(psf2->p, psf2->nx*psf2->ny, 1);
		psf2->nx=ncomp; psf2->ny=ncomp;
		writebin(psf2, "powfs%d_psf2_%d", ipowfs,iwvl);
		cmat *otf2=cnew(ncomp, ncomp);
		//cfft2plan(otf2, -1);
		ccpd(&otf2, psf2);//peak in center
		cfftshift(otf2);//peak in corner
		cfft2(otf2, -1);
		cfftshift(otf2);//peak in center
		writebin(otf2, "powfs%d_otf2_%d", ipowfs, iwvl);
		writebin(nominal, "powfs%d_dtf%d_nominal_0",ipowfs,iwvl);
		for(int i=0; i<ncomp*ncomp; i++){
		    nominal->p[i]*=otf2->p[i];
		}
		writebin(nominal, "powfs%d_dtf%d_nominal_1",ipowfs,iwvl);
		dfree(psf1x);
		dfree(psf1y);
		dfree(psf2x);
		dfree(psf1);
		cfree(otf2);
		dfree(psf2);
	    }
	    cfftshift(nominal);//peak in corner
	    cfft2(nominal,-1);
	    cfftshift(nominal);//peak in center
	    cfft2i(nominal,1);
	    warning_once("double check nominal for off centered skyc.fnpsf1\n");
	    /*This nominal will multiply to OTF with peak in corner. But after
	      inverse fft, peak will be in center*/
	    ccp(&powfs[ipowfs].dtf[iwvl].nominal, nominal);
	    cfree(nominal);

	    loc_t *loc_psf=mksqloc(ncomp, ncomp, dtheta, dtheta, -ncomp2*dtheta, -ncomp2*dtheta);
	    powfs[ipowfs].dtf[iwvl].si=mkh(loc_psf,loc_ccd,0,0,1);
	    locfree(loc_psf);
	    if(parms->skyc.dbg){
		writebin(powfs[ipowfs].dtf[iwvl].nominal,
		       "%s/powfs%d_dtf%d_nominal",dirsetup,ipowfs,iwvl);
		writebin(powfs[ipowfs].dtf[iwvl].si,
			"%s/powfs%d_dtf%d_si",dirsetup,ipowfs,iwvl);
	    }
	    powfs[ipowfs].dtf[iwvl].U=cnew(ncomp,1);
	    dcomplex *U=powfs[ipowfs].dtf[iwvl].U->p;

	    for(int ix=0; ix<ncomp; ix++){
		int jx=ix<ncomp2?ix:(ix-ncomp);
		U[ix]=COMPLEX(0, -2.*M_PI*jx*du);
	    }
	}/*iwvl */
	locfree(loc_ccd);
    }/*ipowfs */
}
Esempio n. 27
0
void dxStepBody (dxBody *b, dReal h)
{
  int j;
#ifdef DEBUG_VALID
dIASSERT(dValid(b->avel[0])&&dValid(b->avel[1])&&dValid(b->avel[2]));
#endif
  // handle linear velocity
  for (j=0; j<3; j++) b->pos[j] += h * b->lvel[j];

  if (b->flags & dxBodyFlagFiniteRotation) {
    dVector3 irv;	// infitesimal rotation vector
    dQuaternion q;	// quaternion for finite rotation

    if (b->flags & dxBodyFlagFiniteRotationAxis) {
      // split the angular velocity vector into a component along the finite
      // rotation axis, and a component orthogonal to it.
      dVector3 frv;		// finite rotation vector
      dReal k = dDOT (b->finite_rot_axis,b->avel);
      frv[0] = b->finite_rot_axis[0] * k;
      frv[1] = b->finite_rot_axis[1] * k;
      frv[2] = b->finite_rot_axis[2] * k;
      irv[0] = b->avel[0] - frv[0];
      irv[1] = b->avel[1] - frv[1];
      irv[2] = b->avel[2] - frv[2];

      // make a rotation quaternion q that corresponds to frv * h.
      // compare this with the full-finite-rotation case below.
      h *= REAL(0.5);
      dReal theta = k * h;
      q[0] = dCos(theta);
      dReal s = sinc(theta) * h;
      q[1] = frv[0] * s;
      q[2] = frv[1] * s;
      q[3] = frv[2] * s;
    }
    else {
      // make a rotation quaternion q that corresponds to w * h
      dReal wlen = dSqrt (b->avel[0]*b->avel[0] + b->avel[1]*b->avel[1] +
			  b->avel[2]*b->avel[2]);
      h *= REAL(0.5);
      dReal theta = wlen * h;
      q[0] = dCos(theta);
      dReal s = sinc(theta) * h;
      q[1] = b->avel[0] * s;
      q[2] = b->avel[1] * s;
      q[3] = b->avel[2] * s;
    }

    // do the finite rotation
    dQuaternion q2;
    dQMultiply0 (q2,q,b->q);
    for (j=0; j<4; j++) b->q[j] = q2[j];

    // do the infitesimal rotation if required
    if (b->flags & dxBodyFlagFiniteRotationAxis) {
      dReal dq[4];
      dWtoDQ (irv,b->q,dq);
      for (j=0; j<4; j++) b->q[j] += h * dq[j];
    }
  }
  else {
    // the normal way - do an infitesimal rotation
    dReal dq[4];
    dWtoDQ (b->avel,b->q,dq);
    for (j=0; j<4; j++) b->q[j] += h * dq[j];
  }

  // normalize the quaternion and convert it to a rotation matrix
  dNormalize4 (b->q);
  dQtoR (b->q,b->R);

  // notify all attached geoms that this body has moved
  for (dxGeom *geom = b->geom; geom; geom = dGeomGetBodyNext (geom))
    dGeomMoved (geom);

#ifdef DEBUG_VALID
dIASSERT(dValid(b->avel[0])&&dValid(b->avel[1])&&dValid(b->avel[2]));
#endif






}
Esempio n. 28
0
const FIRInstance *
ParamFIR::make(int sample_rate) const
{
  int i;

  /////////////////////////////////////////////////////////////////////////////
  // Normalize

  double norm_factor = norm? 1.0: 1.0 / sample_rate;
  double f1_ = f1 * norm_factor;
  double f2_ = f2 * norm_factor;
  double df_ = df * norm_factor;

  /////////////////////////////////////////////////////////////////////////////
  // Trivial cases

  if (f1_ < 0.0 || f2_ < 0.0 || df_ <= 0.0 || a < 0.0) return 0;
  if (a == 0.0) return new IdentityFIRInstance(sample_rate);

  switch (type)
  {
    case low_pass:
      if (f1_ >= 0.5) return new IdentityFIRInstance(sample_rate);
      if (f1_ == 0.0) return new GainFIRInstance(sample_rate, db2value(a));
      break;

    case high_pass:
      if (f1_ >= 0.5) return new GainFIRInstance(sample_rate, db2value(a));
      if (f1_ == 0.0) return new IdentityFIRInstance(sample_rate);
      break;

    case band_pass:
      if (f1_ >= 0.5) return new GainFIRInstance(sample_rate, db2value(a));
      if (f2_ == 0.0) return new GainFIRInstance(sample_rate, db2value(a));
      if (f1_ == 0.0 && f2_ >= 0.5) return new IdentityFIRInstance(sample_rate);
      break;

    case band_stop:
      if (f1_ >= 0.5) return new IdentityFIRInstance(sample_rate);
      if (f2_ == 0.0) return new IdentityFIRInstance(sample_rate);
      if (f1_ == 0.0 && f2_ >= 0.5) return new GainFIRInstance(sample_rate, db2value(a));
      break;

    default:
      return 0;
  }

  /////////////////////////////////////////////////////////////////////////////
  // Build the filter

  int n = kaiser_n(a, df_) | 1; // make odd (type 1 filter)
  int c = n / 2;

  DynamicFIRInstance *fir = new DynamicFIRInstance(sample_rate, n, c);
  double *filter = fir->buf;

  filter[0] = 1.0;
  double alpha = kaiser_alpha(a);
  switch (type)
  {
    case low_pass:
      for (i = 0; i < n; i++)
        filter[i] = (sample_t) (2 * f1_ * sinc((i - c) * 2 * M_PI * f1_) * kaiser_window(i - c, n, alpha));
      return fir;

    case high_pass:
      for (i = 0; i < n; i++)
        filter[i] = (sample_t) (-2 * f1_ * sinc((i - c) * 2 * M_PI * f1_) * kaiser_window(i - c, n, alpha));
      filter[c] = (sample_t) ((1 - 2 * f1_) * kaiser_window(0, n, alpha));
      return fir;

    case band_pass:
      for (i = 0; i < n; i++)
        filter[i] = (sample_t) ((2 * f2_ * sinc((i - c) * 2 * M_PI * f2_) - 2 * f1_ * sinc((i - c) * 2 * M_PI * f1_)) * kaiser_window(i - c, n, alpha));
      return fir;

    case band_stop:
      for (i = 0; i < n; i++)
        filter[i] = (sample_t) ((2 * f1_ * sinc((i - c) * 2 * M_PI * f1_) - 2 * f2_ * sinc((i - c) * 2 * M_PI * f2_)) * kaiser_window(i - c, n, alpha));
      filter[c] = (sample_t) ((2 * f1_ + 1 - 2 * f2_) * kaiser_window(0, n, alpha));
      return fir;
  };

  // never be here
  assert(false);
  delete filter;
  return 0;
}
Esempio n. 29
0
static void gentbl_fsk9600(FILE *f)
{
        int i, j, k, l, m;
	float s;
	float c[44];
	float min, max;

	fprintf(f, "\n/*\n * fsk9600 specific tables\n */\n");
	min = max = 0;
	memset(c, 0, sizeof(c));
#if 0
	memcpy(c+2, fsk96_tx_coeff_4, sizeof(fsk96_tx_coeff_4));
#else
	for (i = 0; i < 29; i++)
		c[3+i] = sinc(1.2*((i-14.0)/4.0))*hamming(i/28.0)/3.5;
#endif
	fprintf(f, "static unsigned char fsk96_txfilt_4[] = {\n\t");
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 256; j++) {
			for (k = 1, s = 0, l = i; k < 256; k <<= 1) {
				if (j & k) {
					for (m = 0; m < 4; m++, l++)
						s += c[l];
				} else {
					for (m = 0; m < 4; m++, l++)
						s -= c[l];
				}
			}
			s *= 0.75;
			if (s > max)
				max = s;
			if (s < min)
				min = s;
			fprintf(f, "%4d", (int)(128+127*s));
			if (i < 3 || j < 255)
				fprintf(f, ",%s", (j & 7) == 7 
					? "\n\t" : "");
		}
	}
#ifdef VERBOSE
	fprintf(stderr, "fsk9600: txfilt4: min = %f; max = %f\n", min, max);
#endif
	fprintf(f, "\n};\n\n");
	min = max = 0;
	memset(c, 0, sizeof(c));
#if 0
	memcpy(c+2, fsk96_tx_coeff_5, sizeof(fsk96_tx_coeff_5));
#else
	for (i = 0; i < 36; i++)
		c[4+i] = sinc(1.2*((i-17.5)/5.0))*hamming(i/35.0)/4.5;
#endif
	fprintf(f, "static unsigned char fsk96_txfilt_5[] = {\n\t");
	for (i = 0; i < 5; i++) {
		for (j = 0; j < 256; j++) {
			for (k = 1, s = 0, l = i; k < 256; k <<= 1) {
				if (j & k) {
					for (m = 0; m < 5; m++, l++)
						s += c[l];
				} else {
					for (m = 0; m < 5; m++, l++)
						s -= c[l];
				}
			}
			s *= 0.75;
			if (s > max)
				max = s;
			if (s < min)
				min = s;
			fprintf(f, "%4d", (int)(128+127*s));
			if (i < 4 || j < 255)
				fprintf(f, ",%s", (j & 7) == 7 
					? "\n\t" : "");
		}
	}
#ifdef VERBOSE
	fprintf(stderr, "fsk9600: txfilt5: min = %f; max = %f\n", min, max);
#endif
	fprintf(f, "\n};\n\n");
}
Esempio n. 30
0
 KFR_INTRINSIC friend vec<T, N> get_elements(const expression_lanczos& self, cinput_t cinput,
                                                 size_t index, vec_shape<T, N> y)
 {
     return sinc(get_elements(self.linspace, cinput, index, y));
 }