コード例 #1
0
ファイル: brad_dist.c プロジェクト: srejv/dspmusic
void process_thunderFuzz( Distortion *t, fixedp *x ) {
	Uint32 n;
	
	// remember to keep sample from previous cycle. :) keep in structure. disttruc
	if(t->fdb) {
		for(n=0; n < PROCESS_SIZE; n++) {
			t->prev = qadd(qmul(x[n],t->gain), qmul(t->prev, t->fdb));
		
			if (t->prev > t->lvl1) 
				t->prev = t->lvl1;
			else if (t->prev < -t->lvl2)
				t->prev = -t->lvl2;

			x[n] = qabs(t->prev);
		}
	}
	else {
		for(n=0; n < PROCESS_SIZE; n++) {
			t->prev = qmul(x[n],t->gain);

			if (t->prev > t->lvl1) 
				t->prev = t->lvl1;
			else if (t->prev < -t->lvl2)
				t->prev = -t->lvl2;
			

			x[n] = qabs(t->prev);
		}
	}
}
コード例 #2
0
ファイル: brad_dist.c プロジェクト: srejv/dspmusic
void process_squareDist(Distortion *t, fixedp *x) { 
	Uint32 n;
	
	if(t->fdb != 0) {
	
		for(n = 0; n < PROCESS_SIZE; n++) {
			t->prev = qadd(qmul(x[n], t->gain), qmul(t->prev, t->fdb));

			if (t->prev > 0)
				t->prev = t->lvl1;
			else if (t->prev < 0)
				t->prev = -t->lvl2;

			x[n] = t->prev;
		}

	}
	else {
		for(n = 0; n < PROCESS_SIZE; n++) {
			t->prev = qmul(x[n], t->gain);

			if (t->prev > 0)
				t->prev = t->lvl1;
			else if (t->prev < 0)
				t->prev = -t->lvl2;

			x[n] = t->prev;
		}
	}
}
コード例 #3
0
ファイル: bignum.cpp プロジェクト: ComputerNerd/eigenmath
void
add_numbers(void)
{
	double a, b;

	if (isrational(stack[tos - 1]) && isrational(stack[tos - 2])) {
		qadd();
		return;
	}

	save();

	p2 = pop();
	p1 = pop();

	if (isdouble(p1))
		a = p1->u.d;
	else
		a = convert_rational_to_double(p1);

	if (isdouble(p2))
		b = p2->u.d;
	else
		b = convert_rational_to_double(p2);

	push_double(a + b);

	restore();
}
コード例 #4
0
ファイル: qtestc.c プロジェクト: alpheios-project/morpheus
main()
{
    int   nitems;
    char  cline[MAXLINE];
    char  qchar, *malloc();
    Queue *qcreate();

    queue = qcreate( CHAR, 5 );
    printf("ready\n");
    while ( gets(cline) != NULL )  {
        if ( !strcmp( cline, "remove" ))  {
            if ( qremove( &qchar, queue ) == FAILURE )  {
                printf("queue empty\n");
                continue;
            }
            else  {
                printf("%c\n", qchar);
            }
        }
        else if ( !strcmp( cline, "read" ))  {
            if ( qread( &qchar, queue ) == FAILURE )  {
                printf("queue exhausted\n");
                continue;
            }
            else  {
                printf("%c\n", qchar);
            }
        }
        else if ( !strcmp( cline, "reset" ))  {
            qreset( queue );
        }
        else if ( !strcmp( cline, "clear" ))  {
            qclear( queue );
        }
        else if ( !strncmp( cline, "delete ", 7 ))  {
            if ( sscanf( cline, "delete %d", &nitems ) != 1 )  {
                printf("What?\n");
                continue;
            }
            if ( qdelete( nitems, queue ) == FAILURE )
                printf("too many items\n");
        }
        else  {
            qchar = cline[0];
            if ( qadd( &qchar, queue ) == FAILURE )
                printf("queue full\n");
        }
    }

    while ( qremove( &qchar, queue ) == SUCCESS )
        printf("%c\n");
    printf("queue empty\n");
}
コード例 #5
0
ファイル: wt.c プロジェクト: srejv/dspmusic
inline fixedp dLinTerp(fixedp x1, fixedp x2, fixedp y1, fixedp y2, fixedp x)
{
	fixedp dx, result, denom;
	denom = qsub(x2, x1);
	if(denom == 0)
		return y1; // should not ever happen

	// calculate decimal position of x
	dx = qdiv(qsub(x, x1), denom);

	// use weighted sum method of interpolating
	result = qadd( qmul( dx, y2 ), qmul( qsub( short2q(1), dx ), y1 ));

	return result;
}
コード例 #6
0
ファイル: brad_3bandeq.c プロジェクト: gerasim13/Brad-Pitch
fixedp do_3band(EQSTATE* es, fixedp sample)
{
  // Locals

  fixedp  l,m,h;      // Low / Mid / High - Sample Values

  // Filter #1 (lowpass)

  es->f1p0  = qadd(es->f1p0, qmul(es->lf, qsub(sample,   es->f1p0)));//  + vsa; might need this but i dont think so. who knows?
  es->f1p1  = qadd(es->f1p1, qmul(es->lf, qsub(es->f1p0, es->f1p1)));
  es->f1p2  = qadd(es->f1p2, qmul(es->lf, qsub(es->f1p1, es->f1p2)));
  es->f1p3  = qadd(es->f1p3, qmul(es->lf, qsub(es->f1p2, es->f1p3)));

  l          = es->f1p3;

  // Filter #2 (highpass)
  
  es->f2p0  = qadd(es->f2p0,qmul(es->hf, qsub(sample   , es->f2p0))); // + vsa;
  es->f2p1  = qadd(es->f2p1,qmul(es->hf, qsub(es->f2p0 , es->f2p1)));
  es->f2p2  = qadd(es->f2p2,qmul(es->hf, qsub(es->f2p1 , es->f2p2)));
  es->f2p3  = qadd(es->f2p3,qmul(es->hf, qsub(es->f2p2 , es->f2p3)));

  h          = qsub(es->sdm3, es->f2p3);

  // Calculate midrange (signal - (low + high))

  m          = qsub(es->sdm3, qadd(h, l));

  // Scale, Combine and store

  l         = qmul(l, es->lg);
  m         = qmul(m, es->mg);
  h         = qmul(h, es->hg);

  // Shuffle history buffer 

  es->sdm3   = es->sdm2;
  es->sdm2   = es->sdm1;
  es->sdm1   = sample;                

  // Return result

  return(qadd(l, qadd(m, h)));
}
コード例 #7
0
ファイル: qtst1.c プロジェクト: Fixman/cephes
main()
{
char s[80];
double fabs(), floor();
#if EXPSCALE || EXPSC2
double exp();
#endif
double sqrt();	/* required to compute rms error */
int i, j, k;
long m, n;

dprec();	/* set up floating point coprocessor */
merror = 0;
/*aiconf = -1;*/	/* configure Airy function */
x = 1.0;
z = x * x;
qclear( qmax );
qtoasc( qmax, strmax, 4 );
qclear( qrmsa );
qclear( qave );

#if 1
printf(" Start at random number #:" );
gets( s );
sscanf( s, "%ld", &n );
printf("%ld\n", n );
#else
n = 0;
#endif

for( m=0; m<n; m++ )
	drand( &x );
n = 0;
m = 0;
x = floor( x );

loop:

for( i=0; i<100; i++ )
{
n++;
m++;

/* make random number in desired range */
drand( &x );
x = WIDTH *  ( x - 1.0 )  +  LOW;
#if EXPSCALE
x = exp(x);
drand( &a );
a = 1.0e-13 * x * a;
if( x > 0.0 )
	x -= a;
else
	x += a;
#endif
#if ONEINT
k = x;
x = k;
#endif
etoq( &x, q1 );		/* double number to q type */

/* do again if second argument required */

#if TWOARG || THREEARG || FOURARG
drand( &a );
a = WIDTHA *  ( a - 1.0 )  +  LOWA;
/*a /= 50.0;*/
#if EXPSC2
a = exp(a);
drand( &y2 );
y2 = 1.0e-13 * y2 * a;
if( a > 0.0 )
	a -= y2;
else
	a += y2;
#endif
#if TWOINT || THREEINT
k = a + 0.25;
a = k;
#endif
etoq( &a, qy4 );
#endif


#if THREEARG || FOURARG
drand( &b );
#if PROB
/*
b = b - 1.0;
b = a * b;
*/
b = WIDTHA *  ( b - 1.0 )  +  LOWA;

/* Half-integer a and b */
/*a = 0.5*floor(2.0*a+1.0);*/
a = 0.5;
b = 0.5*floor(2.0*b+1.0);
etoq( &a, qy4 );
/*x = (a / (a+b));*/

#else
b = WIDTHA *  ( b - 1.0 )  +  LOWA;
#endif
#if THREEINT
j = b + 0.25;
b = j;
#endif
etoq( &b, qb );
#endif

#if FOURARG
drand( &c );
c = WIDTHA *  ( c - 1.0 )  +  LOWA;
/* for hyp2f1 to ensure c-a-b > -1 */
/*
z = c-a-b;
if( z < -1.0 )
	c -= 1.6 * z;
*/
etoq( &c, qc );
#endif

/*printf("%.16E %.16E\n", a, x);*/

/* compute function under test */
#if ONEARG
#if FOURANS
/*FUNC( x, &z, &y2, &y3, &y4 );*/
FUNC( x, &y4, &y2, &y3, &z );
#else
#if TWOANS
FUNC( x, &z, &y2 );
/*FUNC( x, &y2, &z );*/
#else
#if ONEINT
z = FUNC( k );
#else
z = FUNC( x );
#endif
#endif
#endif
#endif

#if TWOARG
#if TWOINT
/*z = FUNC( k, x );*/
/*z = FUNC( x, k );*/
z = FUNC( a, x );
#else
#if FOURANS
FUNC( a, x, &z, &y2, &y3, &y4 );
#else
z = FUNC( a, x );
#endif
#endif
#endif

#if THREEARG
#if THREEINT
z = FUNC( j, k, x );
#else
z = FUNC( a, b, x );
#endif
#endif

#if FOURARG
z = FUNC( a, b, c, x );
#endif

etoq( &z, q2 );

/* handle detected overflow */
if( (z == MAXNUM) || (z == -MAXNUM) )
	{
	printf("detected overflow ");
#if FOURARG
	printf("%.4E %.4E %.4E %.4E %.4E %6ld \n",
		a, b, c, x, y, n);
#else
	printf("%.16E %.4E %.4E %6ld \n", x, a, z, n);
#endif
	e = 0.0;
	m -= 1;
	goto endlup;
	}
/* Skip high precision if underflow.  */
if( merror == UNDERFLOW )
  goto underf;

/* compute high precision function */
#if ONEARG
#if FOURANS
/*QFUNC( q1, qz, qy2, qy3, qy4 );*/
QFUNC( q1, qy4, qy2, qy3, qz );
#else
#if TWOANS
QFUNC( q1, qz, qy2 );
/*QFUNC( q1, qy2, qz );*/
#else
/*qclear( qy4 );*/
/*qmov( qone, qy4 );*/
/*QFUNC( qy4, q1, qz );*/
/*QFUNC( 1, q1, qz );*/
QFUNC( q1, qz );  /* normal */
#endif
#endif
#endif

#if TWOARG
#if TWOINT
/*QFUNC( k, q1, qz );*/
/*QFUNC( q1, qy4, qz );*/
QFUNC( qy4, q1, qz );
#else
#if FOURANS
QFUNC( qy4, q1, qz, qy2, qy3, qc );
#else
/*qclear( qy4 );*/
/*qmov( qone, qy4 );*/
QFUNC( qy4, q1, qz );
#endif
#endif
#endif

#if THREEARG
#if THREEINT
QFUNC( j, k, q1, qz );
#else
QFUNC( qy4, qb, q1, qz );
#endif
#endif

#if FOURARG
QFUNC( qy4, qb, qc, q1, qz );
#endif

qtoe( qz, &y ); /* correct answer, in double precision */


/* get absolute error, in extended precision */
qsub( qz, q2, qe );
qtoe( qe, &e );		/* the error in double precision */

/*  handle function result equal to zero
    or underflowed. */
if( qz[1] < 3 || merror == UNDERFLOW || fabs(z) < underthresh )
	{
underf:
	  merror = 0;
/* Don't bother to print anything.  */
#if 0
	printf("ans 0 ");
#if ONEARG
	printf("%.8E %.8E %.4E %6ld \n", x, y, e, n);
#endif

#if TWOARG
#if TWOINT
	printf("%d %.8E %.8E %.4E %6ld \n", k, x, y, e, n);
#else
	printf("%.6E %.6E %.6E %.4E %6ld \n", a, x, y, e, n);
#endif
#endif

#if THREEARG
	printf("%.6E %.6E %.6E %.6E %.4E %6ld \n", a, b, x, y, e, n);
#endif

#if FOURARG
	printf("%.4E %.4E %.4E %.4E %.4E %.4E %6ld \n",
		a, b, c, x, y, e, n);
#endif
#endif /* 0 */
	qclear( qe );
	e = 0.0;
	m -= 1;
	goto endlup;
	}

else

/*	relative error	*/

/* comment out the following two lines if absolute accuracy report */

#if RELERR
	qdiv( qz, qe, qe );
#else
	{
	qmov( qz, q2 );
	q2[0] = 0;
	if( qcmp( q2, qone ) > 0 )
		qdiv( qz, qe, qe );
	}
#endif

qadd( qave, qe, qave );
/* absolute value of error */
qe[0] = 0;

/* peak detect the error */
if( qcmp(qe, qmax) > 0 )
	{
	qmov( qe, qmax );
	qtoasc( qmax, strmax, 4 );
#if ONEARG
	printf("%.8E %.8E %s %6ld \n", x, y, strmax, n);
#endif
#if TWOARG
#if TWOINT
	printf("%d %.8E %.8E %s %6ld \n", k, x, y, strmax, n);
#else
	printf("%.6E %.6E %.6E %s %6ld \n", a, x, y, strmax, n);
#endif
#endif
#if THREEARG
	printf("%.6E %.6E %.6E %.6E %s %6ld \n", a, b, x, y, strmax, n);
#endif
#if FOURARG
	printf("%.4E %.4E %.4E %.4E %.4E %s %6ld \n",
		a, b, c, x, y, strmax, n);
#endif
	}

/* accumulate rms error	*/
/* rmsa += e * e;  accumulate the square of the error */
qmul( qe, qe, q2 );
qadd( q2, qrmsa, qrmsa );
endlup:
	;
}

/* report every 100 trials */
/* rms = sqrt( rmsa/m ); */
ltoq( &m, q1 );
qdiv( q1, qrmsa, q2 );
qsqrt( q2, q2 );
qtoasc( q2, strrms, 4 );

qdiv( q1, qave, q2 );
qtoasc( q2, strave, 4 );
/*
printf("%6ld   max = %s   rms = %s  ave = %s \n", m, strmax, strrms, strave );
*/
printf("%6ld   max = %s   rms = %s  ave = %s \r", m, strmax, strrms, strave );
fflush(stdout);
goto loop;
}
コード例 #8
0
void two_ch_filtering(const Int32 *pQmf_r,
                      const Int32 *pQmf_i,
                      Int32 *mHybrid_r,
                      Int32 *mHybrid_i)
{

    Int32 cum0;
    Int32 cum1;
    Int32 cum2;
    Int32 tmp1;
    Int32 tmp2;

#ifndef ANDROID_DEFAULT_CODE
    tmp1 = qadd(pQmf_r[ 1], pQmf_r[11]);
    tmp2 = qadd(pQmf_i[ 1], pQmf_i[11]);
#else
    tmp1 = pQmf_r[ 1] + pQmf_r[11];
    tmp2 = pQmf_i[ 1] + pQmf_i[11];
#endif

    cum1 =   fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp1);
    cum2 =   fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp2);

#ifndef ANDROID_DEFAULT_CODE
    tmp1 = qadd(pQmf_r[ 3], pQmf_r[9]);
    tmp2 = qadd(pQmf_i[ 3], pQmf_i[9]);
#else    
    tmp1 = pQmf_r[ 3] + pQmf_r[ 9];
    tmp2 = pQmf_i[ 3] + pQmf_i[ 9];
#endif
    
    cum1 =   fxp_msu32_Q31(cum1, Qfmt31(0.14586278335076f), tmp1);
    cum2 =   fxp_msu32_Q31(cum2, Qfmt31(0.14586278335076f), tmp2);

#ifndef ANDROID_DEFAULT_CODE
    tmp1 = qadd(pQmf_r[ 5], pQmf_r[7]);
    tmp2 = qadd(pQmf_i[ 5], pQmf_i[7]);
#else    
    tmp1 = pQmf_r[ 5] + pQmf_r[ 7];
    tmp2 = pQmf_i[ 5] + pQmf_i[ 7];
#endif
    
    cum1 =   fxp_mac32_Q31(cum1, Qfmt31(0.61193261090336f), tmp1);
    cum2 =   fxp_mac32_Q31(cum2, Qfmt31(0.61193261090336f), tmp2);

    cum0 = pQmf_r[HYBRID_FILTER_DELAY] >> 1;  /* HYBRID_FILTER_DELAY == 6 */

#ifndef ANDROID_DEFAULT_CODE
    mHybrid_r[0] = qadd(cum0, cum1);
    mHybrid_r[1] = qsub(cum0, cum1);
#else
    mHybrid_r[0] = (cum0 + cum1);
    mHybrid_r[1] = (cum0 - cum1);
#endif

    cum0 = pQmf_i[HYBRID_FILTER_DELAY] >> 1;  /* HYBRID_FILTER_DELAY == 6 */

#ifndef ANDROID_DEFAULT_CODE
    mHybrid_i[0] = qadd(cum0, cum2);
    mHybrid_i[1] = qsub(cum0, cum2);
#else
    mHybrid_i[0] = (cum0 + cum2);
    mHybrid_i[1] = (cum0 - cum2);
#endif    

}
コード例 #9
0
ファイル: brad_dist.c プロジェクト: srejv/dspmusic
void process_overdrive(Distortion *t, fixedp *x) {
	
	Uint32 n;
	fixedp denom, tmp, a, b, numerator, denom1, denom2;

	// kom ihåg förra processens sampel?
	/*if(t->fdb) {
		for(n = 0; n < PROCESS_SIZE; n++) {
			t->prev = qadd( qmul( x[n],t->gain ), qmul( qmul(t->prev, t->gain), t->fdb ) );
			
	
			// 6554 = 0.2
			numeratorLvl1 = qmul(t->lvl1, qexp(qmul(t->prev, qadd(Q1, qmul(6554, qsub(Q1, t->lvl1))))));
			numeratorLvl2 = qmul(t->lvl2, qexp(qmul(-t->prev, qadd(Q1, qmul(6554, qsub(Q1, t->lvl2))))));
			denom = qadd(qexp(t->prev), qexp(-t->prev));
			x[n] = qdiv(qsub(numeratorLvl1, numeratorLvl2), denom);
		}
	} 
	else {*/
		for(n = 0; n < PROCESS_SIZE; n++) {

			t->prev = qmul(x[n],t->gain);
			


			a = qadd(Q1,qmul(3254,qsub(Q1,t->lvl1)));
			b = qadd(Q1,qmul(3254,qsub(Q1,t->lvl2)));
			tmp = qmul(-t->prev, qadd(a,b));
			
			if(tmp > short2q(32)) tmp = short2q(32);
			if(tmp < short2q(-32)) tmp = short2q(-32);
			
			tmp = qexp(tmp);
			numerator = qsub(t->lvl1, qmul(t->lvl2, tmp));
			
			tmp = qmul(t->prev, qsub(Q1, a));

			if(tmp > short2q(32)) tmp = short2q(32);
			if(tmp < short2q(-32)) tmp = short2q(-32);
			denom1 = qexp(tmp);

			tmp = qmul(-t->prev, qadd(Q1, a));

			if(tmp > short2q(32)) tmp = short2q(32);
			if(tmp < short2q(-32)) tmp = short2q(-32);
			denom2 = qexp(tmp);
			
			denom = qadd(denom1, denom2);
			tmp = qdiv(numerator, denom);
			
			if (tmp > AUDIOMAX) {
				// nu är tmp större än 32767
				tmp = AUDIOMAX;
			} else if (tmp < AUDIOMIN) {
				tmp = AUDIOMIN;
			}

			x[n] = tmp;
		}
	//}
}
コード例 #10
0
ファイル: biquad.c プロジェクト: gerasim13/Brad-Pitch
	return filter;
}

void BiQuad_FlushDelays(BiQuad* filter) {
	filter->xz1 = short2q(0);
	filter->xz2 = short2q(0);
	filter->yz1 = short2q(0);
	filter->yz2 = short2q(0);
}

// Do the filter: given input xn, calculate output yn and return it
fixedp BiQuad_do(BiQuad* this, fixedp xn) {
	// just do the difference equation: y(n) = a0x(n) + a1x(n-1) + a2x(n-2) - b1y(n-1) - b2y(n-2)
	fixedp a0 = qmul(this->a0, xn);
	fixedp a1 = qmul(this->a1, this->xz1);
	fixedp yn = qadd(a0, a1);
	a1 = qmul(this->a2, this->xz2);
	yn = qadd(yn, a1);
	a1 = qmul(this->b1, this->yz1);
	yn = qsub(yn, a1);
	a1 = qmul(this->b2, this->yz2);
	yn = qsub(yn, a1);
	//float yn = this->a0*xn + this->a1*this->xz1 + this->a2*this->xz2 - this->b1*this->yz1 - this->b2*this->yz2;

	// underflow check
	
	if(yn > 0.0 && yn < FLT_MIN_PLUS) yn = 0;
	if(yn < 0.0 && yn > FLT_MIN_MINUS) yn = 0;

	// shuffle the delays
	// Y delays