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); } } }
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; } } }
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(); }
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"); }
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; }
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))); }
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; }
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 }
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; } //} }
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