bjt, dio, jfet, res: use device temperature for noise analysis too

This commit is contained in:
dwarning 2024-02-14 18:16:50 +01:00
parent 20c82a5b1b
commit a1dbd3f3c8
4 changed files with 50 additions and 23 deletions

View File

@ -82,17 +82,23 @@ BJTnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt,
switch (mode) { switch (mode) {
case N_DENS: case N_DENS:
NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ], double dtemp;
if (inst->BJTtempGiven)
dtemp = inst->BJTtemp - ckt->CKTtemp + (model->BJTtnom-CONSTCtoK);
else
dtemp = inst->BJTdtemp;
NevalSrcInstanceTemp(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ],
ckt, THERMNOISE, inst->BJTcollCXNode, inst->BJTcolNode, ckt, THERMNOISE, inst->BJTcollCXNode, inst->BJTcolNode,
inst->BJTtcollectorConduct * inst->BJTm); inst->BJTtcollectorConduct * inst->BJTm, dtemp);
NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ], NevalSrcInstanceTemp(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ],
ckt, THERMNOISE, inst->BJTbasePrimeNode, inst->BJTbaseNode, ckt, THERMNOISE, inst->BJTbasePrimeNode, inst->BJTbaseNode,
*(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm); *(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm, dtemp);
NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE], NevalSrcInstanceTemp(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE],
ckt, THERMNOISE, inst->BJTemitPrimeNode, inst->BJTemitNode, ckt, THERMNOISE, inst->BJTemitPrimeNode, inst->BJTemitNode,
inst->BJTtemitterConduct * inst->BJTm); inst->BJTtemitterConduct * inst->BJTm, dtemp);
NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ], NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ],
ckt, SHOTNOISE, inst->BJTcolPrimeNode, inst->BJTemitPrimeNode, ckt, SHOTNOISE, inst->BJTcolPrimeNode, inst->BJTemitPrimeNode,

View File

@ -80,9 +80,17 @@ DIOnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
switch (mode) { switch (mode) {
case N_DENS: case N_DENS:
NevalSrc(&noizDens[DIORSNOIZ],&lnNdens[DIORSNOIZ],
double dtemp;
if (inst->DIOtempGiven)
dtemp = inst->DIOtemp - ckt->CKTtemp + (model->DIOnomTemp-CONSTCtoK);
else
dtemp = inst->DIOdtemp;
NevalSrcInstanceTemp(&noizDens[DIORSNOIZ],&lnNdens[DIORSNOIZ],
ckt, THERMNOISE, inst->DIOposPrimeNode, inst->DIOposNode, ckt, THERMNOISE, inst->DIOposPrimeNode, inst->DIOposNode,
inst->DIOtConductance * inst->DIOarea * inst->DIOm); inst->DIOtConductance * inst->DIOarea * inst->DIOm, dtemp);
NevalSrc(&noizDens[DIOIDNOIZ],&lnNdens[DIOIDNOIZ], NevalSrc(&noizDens[DIOIDNOIZ],&lnNdens[DIOIDNOIZ],
ckt, SHOTNOISE, inst->DIOposPrimeNode, inst->DIOnegNode, ckt, SHOTNOISE, inst->DIOposPrimeNode, inst->DIOnegNode,
*(ckt->CKTstate0 + inst->DIOcurrent)); *(ckt->CKTstate0 + inst->DIOcurrent));

View File

@ -80,20 +80,27 @@ JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *d
switch (mode) { switch (mode) {
case N_DENS: case N_DENS:
NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ],
ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETdrainNode,
model->JFETdrainConduct * inst->JFETarea * inst->JFETm);
NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ], double dtemp;
if (inst->JFETtempGiven)
dtemp = inst->JFETtemp - ckt->CKTtemp + (model->JFETtnom-CONSTCtoK);
else
dtemp = inst->JFETdtemp;
NevalSrcInstanceTemp(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ],
ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETdrainNode,
model->JFETdrainConduct * inst->JFETarea * inst->JFETm, dtemp);
NevalSrcInstanceTemp(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ],
ckt, THERMNOISE, inst->JFETsourcePrimeNode, ckt, THERMNOISE, inst->JFETsourcePrimeNode,
inst->JFETsourceNode, model->JFETsourceConduct * inst->JFETsourceNode, model->JFETsourceConduct *
inst->JFETarea * inst->JFETm); inst->JFETarea * inst->JFETm, inst->JFETdtemp);
if (model->JFETnlev < 3) { if (model->JFETnlev < 3) {
NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], NevalSrcInstanceTemp(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ],
ckt, THERMNOISE, inst->JFETdrainPrimeNode, ckt, THERMNOISE, inst->JFETdrainPrimeNode,
inst->JFETsourcePrimeNode, inst->JFETsourcePrimeNode,
(2.0 / 3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); (2.0 / 3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm))), inst->JFETdtemp);
} else { } else {
vgs = *(ckt->CKTstate0 + inst->JFETvgs); vgs = *(ckt->CKTstate0 + inst->JFETvgs);
vds = vgs - *(ckt->CKTstate0 + inst->JFETvgd); vds = vgs - *(ckt->CKTstate0 + inst->JFETvgd);
@ -104,10 +111,10 @@ JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *d
alpha = 0; /* saturation region */ alpha = 0; /* saturation region */
beta = inst->JFETtBeta * inst->JFETarea * inst->JFETm; beta = inst->JFETtBeta * inst->JFETarea * inst->JFETm;
NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], NevalSrcInstanceTemp(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ],
ckt, THERMNOISE, inst->JFETdrainPrimeNode, ckt, THERMNOISE, inst->JFETdrainPrimeNode,
inst->JFETsourcePrimeNode, inst->JFETsourcePrimeNode,
(2.0 / 3.0*beta*vgst*(1 + alpha + alpha*alpha) / (1 + alpha) * model->JFETgdsnoi)); (2.0 / 3.0*beta*vgst*(1 + alpha + alpha*alpha) / (1 + alpha) * model->JFETgdsnoi), inst->JFETdtemp);
} }
NevalSrc(&noizDens[JFETFLNOIZ], NULL, ckt, NevalSrc(&noizDens[JFETFLNOIZ], NULL, ckt,

View File

@ -88,13 +88,19 @@ RESnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt,
case N_DENS: case N_DENS:
double dtemp;
if (inst->REStempGiven)
dtemp = inst->REStemp - ckt->CKTtemp + (model->REStnom-CONSTCtoK);
else
dtemp = inst->RESdtemp;
NevalSrcInstanceTemp(&noizDens[RESTHNOIZ],&lnNdens[RESTHNOIZ], NevalSrcInstanceTemp(&noizDens[RESTHNOIZ],&lnNdens[RESTHNOIZ],
ckt, THERMNOISE, inst->RESposNode, inst->RESnegNode, ckt, THERMNOISE, inst->RESposNode, inst->RESnegNode,
inst->RESconduct, inst->RESdtemp); inst->RESconduct, dtemp);
NevalSrcInstanceTemp(&noizDens[RESFLNOIZ], NULL, ckt, NevalSrc(&noizDens[RESFLNOIZ], NULL, ckt,
N_GAIN, inst->RESposNode, inst->RESnegNode, N_GAIN, inst->RESposNode, inst->RESnegNode,
(double) 0.0, (double) 0.0); (double) 0.0);
#if 0 #if 0
printf("DC current in resistor %s: %e\n", inst->RESname, inst->REScurrent); printf("DC current in resistor %s: %e\n", inst->RESname, inst->REScurrent);