ftp.nice.ch/pub/next/unix/audio/cmix.s.tar.gz#/cmix/lpc/gauss.c

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

#include "lpc.h"
gauss(aold, bold, b)
double aold[POLEMAX][POLEMAX], *bold, *b;
{
        double amax, dum, pivot;
        double c[POLEMAX], a[POLEMAX][POLEMAX];
        int i, j, k, l, istar, ii, lp;

        /* aold and bold untouched by this subroutine */
        for (i=0; i < NPOLE ;++i)  {
                c[i] = bold[i];
                for (j=0; j < NPOLE ;++j)
                        a[i][j] = aold[i][j];
        }
        /* eliminate i-th unknown */
        for (i=0; i < NPOLE - 1 ;++i)  {        /* find largest pivot */
                amax = 0.0;
                for (ii=i; ii < NPOLE ;++ii)  {
                        if (fabs(a[ii][i]) >= amax)  {
                                istar = ii;
                                amax = fabs(a[ii][i]);
                        }
                }
                if (amax < 1e-20)  {
                        fprintf(stderr, "gauss: ill-conditioned\n");
                        return(0);  /* ill-conditioned */
                }
                for (j=0; j < NPOLE ;++j)  {    /* switch rows */
                        dum = a[istar][j];
                        a[istar][j] = a[i][j];
                        a[i][j] = dum;
                }
                dum = c[istar];
                c[istar] = c[i];
                c[i] = dum;
                        /* pivot */
                for (j=i+1; j < NPOLE ;++j)  {
                        pivot = a[j][i] / a[i][i];
                        c[j] = c[j] - pivot * c[i];
                        for (k=0; k < NPOLE ;++k)
                                a[j][k] = a[j][k] - pivot * a[i][k];
                }
        }       /* return if last pivot is too small */
        if (fabs(a[NPOLE-1][NPOLE-1]) < 1e-20)  {
                fprintf(stderr, "gauss: ill-conditioned.\n");
                return(0);      /* ill-conditioned */
        }
        *(b+NPOLE-1) = c[NPOLE-1] / a[NPOLE-1][NPOLE-1];
                        /* back substitute */
        for (k=0; k<NPOLE-1; ++k)  {
                l = NPOLE-1 -(k+1);
                *(b+l) = c[l];
                lp = l + 1;
                for (j = lp; j<NPOLE; ++j)
                        *(b+l) += -a[l][j] * *(b+j);
                *(b+l) /= a[l][l];
        }
        return(1);
}

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