You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.4 KiB
45 lines
1.4 KiB
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1987 Gary W. Ng
|
|
**********/
|
|
|
|
/*
|
|
* Nintegrate.c (noizDens, lnNdens, lnNlstDens, data)
|
|
*
|
|
* This subroutine evaluates the integral of the function
|
|
*
|
|
* EXPONENT
|
|
* NOISE = a * (FREQUENCY)
|
|
*
|
|
* given two points from the curve. If EXPONENT is relatively close
|
|
* to 0, the noise is simply multiplied by the change in frequency.
|
|
* If it isn't, a more complicated expression must be used. Note that
|
|
* EXPONENT = -1 gives a different equation than EXPONENT <> -1.
|
|
* Hence, the reason for the constant 'N_INTUSELOG'.
|
|
*/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/noisedef.h"
|
|
|
|
#define limexp(x) (x > 700 ? exp(700.0)*(1.0+x-700.0) : exp(x))
|
|
|
|
double
|
|
Nintegrate (double noizDens, double lnNdens, double lnNlstDens, Ndata *data)
|
|
{
|
|
double exponent;
|
|
double a;
|
|
|
|
exponent = (lnNdens - lnNlstDens) / data->delLnFreq;
|
|
if ( fabs(exponent) < N_INTFTHRESH ) {
|
|
return (noizDens * data->delFreq);
|
|
} else {
|
|
a = limexp(lnNdens - exponent*data->lnFreq);
|
|
exponent += 1.0;
|
|
if (fabs(exponent) < N_INTUSELOG) {
|
|
return (a * (data->lnFreq - data->lnLastFreq));
|
|
} else {
|
|
return (a * ((exp(exponent * data->lnFreq) - exp(exponent * data->lnLastFreq)) /
|
|
exponent));
|
|
}
|
|
}
|
|
}
|