DSS_INVERTER_OSC optimizations

This commit is contained in:
Couriersud 2009-10-12 10:08:47 +00:00
parent 2d22e450f2
commit e60cd95d44

View File

@ -42,10 +42,10 @@ struct dss_counter_context
struct dss_inverter_osc_context struct dss_inverter_osc_context
{ {
double w;
double wc;
double v_cap; double v_cap;
double v_g2_old; double v_g2_old;
double w;
double wc;
double rp; double rp;
double r1; double r1;
double r2; double r2;
@ -1629,6 +1629,7 @@ static DISCRETE_STEP(dss_inverter_osc)
double diff, vG1, vG2, vG3, vI; double diff, vG1, vG2, vG3, vI;
double vMix, rMix; double vMix, rMix;
int clamped;
/* Get new state */ /* Get new state */
vI = context->v_cap + context->v_g2_old; vI = context->v_cap + context->v_g2_old;
@ -1660,18 +1661,33 @@ static DISCRETE_STEP(dss_inverter_osc)
default: default:
fatalerror("DISCRETE_INVERTER_OSC - Wrong type on NODE_%02d", NODE_BLOCKINDEX(node)); fatalerror("DISCRETE_INVERTER_OSC - Wrong type on NODE_%02d", NODE_BLOCKINDEX(node));
} }
clamped = 0;
if (info->clamp >= 0.0)
{
if (vI < -info->clamp)
{
vI = -info->clamp;
clamped = 1;
}
else if (vI > info->vB+info->clamp)
{
vI = info->vB + info->clamp;
clamped = 1;
}
}
switch (info->options & DISC_OSC_INVERTER_TYPE_MASK) switch (info->options & DISC_OSC_INVERTER_TYPE_MASK)
{ {
case DISC_OSC_INVERTER_IS_TYPE1: case DISC_OSC_INVERTER_IS_TYPE1:
case DISC_OSC_INVERTER_IS_TYPE2: case DISC_OSC_INVERTER_IS_TYPE2:
case DISC_OSC_INVERTER_IS_TYPE3: case DISC_OSC_INVERTER_IS_TYPE3:
if ((info->clamp >= 0.0) && ((vI< - info->clamp) || (vI> info->vB+info->clamp))) if (clamped)
{ {
vI = MAX(vI, (- info->clamp)); double ratio = context->rp / (context->rp + context->r1);
vI = MIN(vI, info->vB + info->clamp); diff = vG3 * (ratio)
diff = vG3 * (context->rp / (context->rp + context->r1))
- (context->v_cap + vG2) - (context->v_cap + vG2)
+ vI*(context->r1 / (context->rp + context->r1)); + vI * (1.0 - ratio);
diff = diff - diff * context->wc; diff = diff - diff * context->wc;
} }
else else
@ -1681,11 +1697,6 @@ static DISCRETE_STEP(dss_inverter_osc)
} }
break; break;
case DISC_OSC_INVERTER_IS_TYPE4: case DISC_OSC_INVERTER_IS_TYPE4:
if ((info->clamp >= 0.0) && ((vI< - info->clamp) || (vI> info->vB+info->clamp)))
{
vI = MAX(vI, (- info->clamp));
vI = MIN(vI, info->vB + info->clamp);
}
/* FIXME handle r2 = 0 */ /* FIXME handle r2 = 0 */
rMix = (context->r1 * context->r2) / (context->r1 + context->r2); rMix = (context->r1 * context->r2) / (context->r1 + context->r2);
vMix = rMix* ((vG3 - vG2) / context->r1 + (DSS_INVERTER_OSC__MOD-vG2) / context->r2); vMix = rMix* ((vG3 - vG2) / context->r1 + (DSS_INVERTER_OSC__MOD-vG2) / context->r2);
@ -1693,25 +1704,22 @@ static DISCRETE_STEP(dss_inverter_osc)
{ {
rMix = 1.0 / rMix + 1.0 / context->rp; rMix = 1.0 / rMix + 1.0 / context->rp;
rMix = 1.0 / rMix; rMix = 1.0 / rMix;
vMix = rMix* ( (vG3-vG2) / context->r1 + (DSS_INVERTER_OSC__MOD-vG2) / context->r2 + (vI-0.7-vG2)/context->rp); vMix = rMix* ( (vG3-vG2) / context->r1 + (DSS_INVERTER_OSC__MOD-vG2) / context->r2
+ (vI - 0.7 - vG2) / context->rp);
} }
diff = vMix - context->v_cap; diff = vMix - context->v_cap;
diff = diff - diff * exp(-node->info->sample_time / (context->c * rMix)); diff = diff - diff * exp(-node->info->sample_time / (context->c * rMix));
break; break;
case DISC_OSC_INVERTER_IS_TYPE5: case DISC_OSC_INVERTER_IS_TYPE5:
if ((info->clamp >= 0.0) && ((vI< - info->clamp) || (vI> info->vB+info->clamp)))
{
vI = MAX(vI, (- info->clamp));
vI = MIN(vI, info->vB + info->clamp);
}
/* FIXME handle r2 = 0 */ /* FIXME handle r2 = 0 */
rMix = (context->r1 * context->r2) / (context->r1 + context->r2); rMix = (context->r1 * context->r2) / (context->r1 + context->r2);
vMix = rMix* ((vG3 - vG2) / context->r1 + (DSS_INVERTER_OSC__MOD-vG2) / context->r2); vMix = rMix* ((vG3 - vG2) / context->r1 + (DSS_INVERTER_OSC__MOD - vG2) / context->r2);
if (vMix > (vI -vG2 +0.7)) if (vMix > (vI -vG2 + 0.7))
{ {
rMix = 1.0 / rMix + 1.0/context->rp; rMix = 1.0 / rMix + 1.0 / context->rp;
rMix = 1.0 / rMix; rMix = 1.0 / rMix;
vMix = rMix* ( (vG3 - vG2) / context->r1 + (DSS_INVERTER_OSC__MOD-vG2) / context->r2 + (vI+0.7-vG2)/context->rp); vMix = rMix * ( (vG3 - vG2) / context->r1 + (DSS_INVERTER_OSC__MOD - vG2) / context->r2
+ (vI + 0.7 - vG2) / context->rp);
} }
diff = vMix - context->v_cap; diff = vMix - context->v_cap;
diff = diff - diff * exp(-node->info->sample_time/(context->c * rMix)); diff = diff - diff * exp(-node->info->sample_time/(context->c * rMix));