ftp.nice.ch/pub/next/science/physics/delta-sigma.s.tar.gz#/delta-sigma.src/examples/sim.c

This is sim.c in view mode; [Download] [Up]

/*
 * Simulate the difference equations which describe an
 * 4th-order delta-sigma modulator.
 */

#include <stdio.h>
#include <math.h>
#define ORDER 4

main(){
double
     beta[] = { -0.000944282, -0.0228947, -0.184512, -0.764231 },
     gamma[] = { 0.000278509, 0.00178657 },
     /* alpha0 must be slightly different from beta[0] ensure a dc gain of 1 */
     alpha0 = 0.000996165,
     c[] = { 1, 1, 1, 1 },
     scaling[] = { 0.02, 0.2, 1, 1.5 };
/* You may need to change the initial value of y to match 
   simulations of your circuit. */
double u, x[ORDER], xx, y=0, zm1y=0, max[ORDER];
int i;

/* initial state = 0 */
for( i=0; i<ORDER; ++i ){
    x[i]=0;
    max[i]=0;
    }

#ifdef SCALED
/* Apply the scaling factors. */
alpha0 /= scaling[0];
for( i=0; i<ORDER; ++i ){
    beta[i] /= scaling[i];
    if( i<ORDER-1 )
	c[i] = scaling[i]/scaling[i+1];
    else
	c[i] = scaling[i];
    }
for( i=0; i<ORDER/2; ++i )
    gamma[i] *= scaling[2*i+1]/scaling[2*i];
#endif

#ifdef PRINTSCALEDVALUES
printf("The scaling factors are: ");
for( i=0; i<ORDER; ++i )
    printf("%g ", scaling[i]);
printf("\n");
printf("The a0 coefficient is: %g\n", alpha0);
printf("The b coefficients are: ");
for( i=0; i<ORDER; ++i )
    printf("%g ", beta[i]);
printf("\n");
printf("The g coefficients are: ");
for( i=0; i<ORDER/2; ++i )
    printf("%g ", gamma[i] );
printf("\n");
printf("The c coefficients are: ");
for( i=0; i<ORDER; ++i ){
    printf("%g ", c[i]);
    }
printf("\n");

#else

while( scanf("%lf",&u) > 0){ 
    /* At the top of the loop, we have
       x[0,2](n), x[1,3](n-1) and y(n-1) */
    x[1] += beta[1]*y + c[0]*x[0];
    x[3] += beta[3]*y + c[2]*x[2];
    x[0] += alpha0*u + beta[0]*y - gamma[0]*x[1];
    x[2] += c[1]*x[1] + beta[2]*y - gamma[1]*x[3];
    xx = c[3]*x[3];
    y = (xx>=0)?1:-1;
    /* At the bottom of the loop, we have
       x[0,2](n+1), x[1,3](n) and y(n) */
#ifdef COMPARATORINPUT
    printf("%g\n", xx);
#else
#ifndef MAXIMA 
    printf("%g\n", y);
#endif
#endif

#ifdef MAXIMA
    /* check for maxima */
    for(i=0; i<ORDER; ++i){
	double tmp=fabs(x[i]);
	if( tmp > max[i] )
	    max[i]=tmp;
	}
#endif
    }

#ifdef MAXIMA
for(i=0; i<ORDER; ++i)
    printf("%g\t", max[i]);
printf("\n");
#endif
#endif
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.