Skip to content

Commit c5ad118

Browse files
committed
Fix denormals
1 parent f5a71a0 commit c5ad118

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

NeuralRack/engine/eq.cc

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ class Dsp {
116116
double fRec30[3];
117117
double fRec29[3];
118118
double fRec35[2];
119-
bool flush_to_zero;
120-
121-
119+
#ifdef DEBUG
120+
inline void check_state_f(double v);
121+
#endif
122122
public:
123123
float fVslider0;
124124
float fVslider1;
@@ -198,6 +198,15 @@ inline void Dsp::clear_state_internal()
198198
for (int l40 = 0; l40 < 2; l40 = l40 + 1) fRec35[l40] = 0.0;
199199
}
200200

201+
#ifdef DEBUG
202+
inline void Dsp::check_state_f(double v)
203+
{
204+
if (std::fpclassify(v) == FP_SUBNORMAL) {
205+
fprintf(stderr, "subnormal detected\n");
206+
}
207+
}
208+
#endif
209+
201210
inline void Dsp::init(uint32_t sample_rate)
202211
{
203212
fSampleRate = sample_rate;
@@ -266,7 +275,6 @@ inline void Dsp::init(uint32_t sample_rate)
266275
fConst62 = 1.0 - fConst37 / fConst21;
267276
fConst63 = 1.0 / (fConst38 / fConst21 + 1.0);
268277
fConst64 = 1.0 / (fConst29 * fConst33);
269-
flush_to_zero = true;
270278
clear_state_f();
271279
clear_state_internal();
272280
}
@@ -279,10 +287,8 @@ inline void Dsp::compute(int count, float *input0, float *output0)
279287
double fSlow3 = 0.0010000000000000009 * std::pow(1e+01, 0.05 * double(fVslider3));
280288
double fSlow4 = 0.0010000000000000009 * std::pow(1e+01, 0.05 * double(fVslider4));
281289
double fSlow5 = 0.0010000000000000009 * std::pow(1e+01, 0.05 * double(fVslider5));
282-
double sm = 0.0;
283290
for (int i0 = 0; i0 < count; i0 = i0 + 1) {
284291
double fTemp0 = double(input0[i0]);
285-
sm += std::fabs(fTemp0);
286292
fVec0[0] = fTemp0;
287293
fRec9[0] = -(fConst36 * (fConst35 * fRec9[1] - (fTemp0 + fVec0[1])));
288294
fRec8[0] = fRec9[0] - fConst34 * (fConst32 * fRec8[2] + fConst30 * fRec8[1]);
@@ -300,42 +306,42 @@ inline void Dsp::compute(int count, float *input0, float *output0)
300306
fRec2[0] = fRec3[0] - fConst13 * (fConst11 * fRec2[2] + fConst9 * fRec2[1]);
301307
double fTemp4 = fRec2[2] + fRec2[0] + 2.0 * fRec2[1];
302308
fVec4[0] = fTemp4;
303-
fRec1[0] = -(fConst49 * (fConst47 * fRec1[1] - fConst46 * (fTemp4 - fVec4[1])));
309+
fRec1[0] = 1e-18 -(fConst49 * (fConst47 * fRec1[1] - fConst46 * (fTemp4 - fVec4[1]))) + 1e-18;
304310
fRec0[0] = fRec1[0] - fConst6 * (fConst5 * fRec0[2] + fConst3 * fRec0[1]);
305311
fRec10[0] = fSlow0 + 0.999 * fRec10[1];
306312
fRec12[0] = -(fConst49 * (fConst47 * fRec12[1] - fConst13 * (fTemp4 + fVec4[1])));
307313
fRec11[0] = fRec12[0] - fConst6 * (fConst5 * fRec11[2] + fConst3 * fRec11[1]);
308314
fRec13[0] = fSlow1 + 0.999 * fRec13[1];
309315
double fTemp5 = fConst3 * fRec14[1];
310-
fRec16[0] = -(fConst45 * (fConst43 * fRec16[1] - fConst52 * (fTemp3 - fVec3[1])));
311-
fRec15[0] = fRec16[0] - fConst13 * (fConst11 * fRec15[2] + fConst9 * fRec15[1]);
316+
fRec16[0] = 1e-18 -(fConst45 * (fConst43 * fRec16[1] - fConst52 * (fTemp3 - fVec3[1]))) + 1e-18;
317+
fRec15[0] = 1e-18 + fRec16[0] - fConst13 * (fConst11 * fRec15[2] + fConst9 * fRec15[1]) - 1e-18;
312318
fRec14[0] = fConst53 * (fRec15[2] + (fRec15[0] - 2.0 * fRec15[1])) - fConst51 * (fConst50 * fRec14[2] + fTemp5);
313319
fRec17[0] = fSlow2 + 0.999 * fRec17[1];
314320
double fTemp6 = fConst3 * fRec18[1];
315321
double fTemp7 = fConst9 * fRec19[1];
316-
fRec21[0] = -(fConst42 * (fConst40 * fRec21[1] - fConst56 * (fTemp2 - fVec2[1])));
317-
fRec20[0] = fRec21[0] - fConst20 * (fConst18 * fRec20[2] + fConst16 * fRec20[1]);
318-
fRec19[0] = fConst57 * (fRec20[2] + (fRec20[0] - 2.0 * fRec20[1])) - fConst55 * (fConst54 * fRec19[2] + fTemp7);
322+
fRec21[0] = 1e-18 -(fConst42 * (fConst40 * fRec21[1] - fConst56 * (fTemp2 - fVec2[1]))) + 1e-18;
323+
fRec20[0] = 1e-18 + fRec21[0] - fConst20 * (fConst18 * fRec20[2] + fConst16 * fRec20[1]) - 1e-18;
324+
fRec19[0] = 1e-18 + fConst57 * (fRec20[2] + (fRec20[0] - 2.0 * fRec20[1])) - fConst55 * (fConst54 * fRec19[2] + fTemp7) - 1e-18;
319325
fRec18[0] = fRec19[2] + fConst55 * (fTemp7 + fConst54 * fRec19[0]) - fConst51 * (fConst50 * fRec18[2] + fTemp6);
320326
fRec22[0] = fSlow3 + 0.999 * fRec22[1];
321327
double fTemp8 = fConst3 * fRec23[1];
322328
double fTemp9 = fConst9 * fRec24[1];
323329
double fTemp10 = fConst16 * fRec25[1];
324-
fRec27[0] = -(fConst39 * (fConst37 * fRec27[1] - fConst60 * (fTemp1 - fVec1[1])));
325-
fRec26[0] = fRec27[0] - fConst27 * (fConst25 * fRec26[2] + fConst23 * fRec26[1]);
326-
fRec25[0] = fConst61 * (fRec26[2] + (fRec26[0] - 2.0 * fRec26[1])) - fConst59 * (fConst58 * fRec25[2] + fTemp10);
327-
fRec24[0] = fRec25[2] + fConst59 * (fTemp10 + fConst58 * fRec25[0]) - fConst55 * (fConst54 * fRec24[2] + fTemp9);
330+
fRec27[0] = 1e-18 -(fConst39 * (fConst37 * fRec27[1] - fConst60 * (fTemp1 - fVec1[1]))) + 1e-18;
331+
fRec26[0] = 1e-18 + fRec27[0] - fConst27 * (fConst25 * fRec26[2] + fConst23 * fRec26[1]) - 1e-18;
332+
fRec25[0] = 1e-18 + fConst61 * (fRec26[2] + (fRec26[0] - 2.0 * fRec26[1])) - fConst59 * (fConst58 * fRec25[2] + fTemp10) - 1e-18;
333+
fRec24[0] = 1e-18 + fRec25[2] + fConst59 * (fTemp10 + fConst58 * fRec25[0]) - fConst55 * (fConst54 * fRec24[2] + fTemp9) - 1e-18;
328334
fRec23[0] = fRec24[2] + fConst55 * (fTemp9 + fConst54 * fRec24[0]) - fConst51 * (fConst50 * fRec23[2] + fTemp8);
329335
fRec28[0] = fSlow4 + 0.999 * fRec28[1];
330336
double fTemp11 = fConst3 * fRec29[1];
331337
double fTemp12 = fConst9 * fRec30[1];
332338
double fTemp13 = fConst16 * fRec31[1];
333339
double fTemp14 = fConst23 * fRec32[1];
334340
fRec34[0] = -(fConst36 * (fConst35 * fRec34[1] - fConst31 * (fTemp0 - fVec0[1])));
335-
fRec33[0] = fRec34[0] - fConst34 * (fConst32 * fRec33[2] + fConst30 * fRec33[1]);
336-
fRec32[0] = fConst64 * (fRec33[2] + (fRec33[0] - 2.0 * fRec33[1])) - fConst63 * (fConst62 * fRec32[2] + fTemp14);
337-
fRec31[0] = fRec32[2] + fConst63 * (fTemp14 + fConst62 * fRec32[0]) - fConst59 * (fConst58 * fRec31[2] + fTemp13);
338-
fRec30[0] = fRec31[2] + fConst59 * (fTemp13 + fConst58 * fRec31[0]) - fConst55 * (fConst54 * fRec30[2] + fTemp12);
341+
fRec33[0] = 1e-18 + fRec34[0] - fConst34 * (fConst32 * fRec33[2] + fConst30 * fRec33[1]) - 1e-18;
342+
fRec32[0] = 1e-18 + fConst64 * (fRec33[2] + (fRec33[0] - 2.0 * fRec33[1])) - fConst63 * (fConst62 * fRec32[2] + fTemp14) - 1e-18;
343+
fRec31[0] = 1e-18 + fRec32[2] + fConst63 * (fTemp14 + fConst62 * fRec32[0]) - fConst59 * (fConst58 * fRec31[2] + fTemp13) - 1e-18;
344+
fRec30[0] = 1e-18 + fRec31[2] + fConst59 * (fTemp13 + fConst58 * fRec31[0]) - fConst55 * (fConst54 * fRec30[2] + fTemp12) - 1e-18;
339345
fRec29[0] = fRec30[2] + fConst55 * (fTemp12 + fConst54 * fRec30[0]) - fConst51 * (fConst50 * fRec29[2] + fTemp11);
340346
fRec35[0] = fSlow5 + 0.999 * fRec35[1];
341347
output0[i0] = float(fRec35[0] * (fRec29[2] + fConst51 * (fTemp11 + fConst50 * fRec29[0])) + fRec28[0] * (fRec23[2] + fConst51 * (fTemp8 + fConst50 * fRec23[0])) + fRec22[0] * (fRec18[2] + fConst51 * (fTemp6 + fConst50 * fRec18[0])) + fRec17[0] * (fRec14[2] + fConst51 * (fTemp5 + fConst50 * fRec14[0])) + fConst6 * (fRec13[0] * (fRec11[2] + fRec11[0] + 2.0 * fRec11[1]) + fConst2 * fRec10[0] * (fRec0[0] + fRec0[2] - 2.0 * fRec0[1])));
@@ -401,14 +407,6 @@ inline void Dsp::compute(int count, float *input0, float *output0)
401407
fRec29[1] = fRec29[0];
402408
fRec35[1] = fRec35[0];
403409
}
404-
if (sm < 1e-18) {
405-
if (flush_to_zero) {
406-
clear_state_f();
407-
flush_to_zero = false;
408-
}
409-
} else if (!flush_to_zero) {
410-
flush_to_zero = true;
411-
}
412410
}
413411

414412
Dsp *plugin() {

0 commit comments

Comments
 (0)