summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Couriersud <couriersud@users.noreply.github.com>2009-01-25 02:10:31 +0000
committer Couriersud <couriersud@users.noreply.github.com>2009-01-25 02:10:31 +0000
commit84683a2e5b353beb6ea09b5ae8a7ae0c8e349f4a (patch)
tree48f1416e0b702ae2aed3cb7457383a45f1d53a1d
parent2c9f0e33fb1f6ab1730363bb851c223a110fe508 (diff)
Use formula derived from figures 2 and 3 in LS624 datasheet. Coefficients
where calculated using least square approximation. This approach gives a bit better audible results compared to the prior approach.
-rw-r--r--src/emu/sound/disc_dev.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/emu/sound/disc_dev.c b/src/emu/sound/disc_dev.c
index 3dd26594db9..4e2ef3c865d 100644
--- a/src/emu/sound/disc_dev.c
+++ b/src/emu/sound/disc_dev.c
@@ -1582,13 +1582,19 @@ static DISCRETE_RESET(dsd_566)
#define DSD_LS624__OUTTYPE (*(node->input[4]))
/*
- * These formulas are derived from diagrams in the datasheet!
- * They are not based on any law. The function is not
- * described anywhere.
+ * The datasheet mentions a 600 ohm discharge. It also gives
+ * equivalent circuits for VI and VR.
*/
#define LS624_F1(x) (0.19 + 20.0/90.0*(x))
-#define LS624_T(_C, _R, _F) (-600.0 * (_C) * log(1.0-LS624_F1(_R)*0.12/LS624_F1(_F)))
+#define LS624_T(_C, _R, _F) ((-600.0 * (_C) * log(1.0-LS624_F1(_R)*0.12/LS624_F1(_F))) * 16.0 )
+
+/* The following formula was derived from figures 2 and 3 in LS624 datasheet. Coefficients
+ * where calculated using least square approximation.
+ * This approach gives a bit better results compared to the first approach.
+ */
+#define LS624_F(_C, _VI, _VR) pow(10, -0.912029404 * log10(_C) + 0.243264328 * (_VI) \
+ - 0.091695877 * (_VR) -0.014110946 * (_VI) * (_VR) - 3.207072925)
static DISCRETE_STEP(dsd_ls624)
{
@@ -1602,8 +1608,8 @@ static DISCRETE_STEP(dsd_ls624)
int lst, cntf = 0, cntr = 0;
sample_t = discrete_current_context->sample_time; /* Change in time */
- dt = LS624_T(DSD_LS624__C, DSD_LS624__VRNG, DSD_LS624__VMOD);
- dt = 16 * dt;
+ //dt = LS624_T(DSD_LS624__C, DSD_LS624__VRNG, DSD_LS624__VMOD) / 2.0;
+ dt = 1.0f / (2.0f * LS624_F(DSD_LS624__C, DSD_LS624__VMOD, DSD_LS624__VRNG));
t = context->remain;
lst = context->state;
while (t + dt < sample_t)