From 479da90cbfe4797075f02ba13bc58cf7acd5b941 Mon Sep 17 00:00:00 2001 From: Dane Wagner Date: Sat, 29 Nov 2025 01:19:10 +0100 Subject: [PATCH] Adjust minimum dropout of each frequency bin --- .../net/pmarks/chromadoze/PhononMutable.java | 3 +++ .../net/pmarks/chromadoze/SpectrumData.java | 21 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/pmarks/chromadoze/PhononMutable.java b/app/src/main/java/net/pmarks/chromadoze/PhononMutable.java index 39e19ea..f83c590 100644 --- a/app/src/main/java/net/pmarks/chromadoze/PhononMutable.java +++ b/app/src/main/java/net/pmarks/chromadoze/PhononMutable.java @@ -121,6 +121,9 @@ public float getBar(int band) { return mBars[band] / (float) BAR_MAX; } + /* + * Returns the scaled value of all bars from [0.0, 1.0] + */ private float[] getAllBars() { float[] out = new float[BAND_COUNT]; for (int i = 0; i < BAND_COUNT; i++) { diff --git a/app/src/main/java/net/pmarks/chromadoze/SpectrumData.java b/app/src/main/java/net/pmarks/chromadoze/SpectrumData.java index 884be5e..fca3806 100644 --- a/app/src/main/java/net/pmarks/chromadoze/SpectrumData.java +++ b/app/src/main/java/net/pmarks/chromadoze/SpectrumData.java @@ -46,11 +46,26 @@ public SpectrumData(float[] donateBars) { } mData = donateBars; for (int i = 0; i < BAND_COUNT; i++) { - if (mData[i] <= 0f) { + /* Input donateBars values are a linear scale in [0.0, 1.0]. + * Audio samples are 16 bits per channel or about 48 dB dynamic + * range. Scale the input to [-50 dB, 0.0 dB] or [10^-5, 1.0] on + * a log scale. As a special case, if the input is 0.0, completely + * silence that frequency band. + */ + if (mData[i] < 0.000001f) { mData[i] = 0f; - } else { - mData[i] = 0.001f * (float) Math.pow(1000, mData[i]); + continue; } + /* This calculation was previously 0.001 * Math.pow(1000f, mData[i]) + * which is equal to Math.pow(10.0, 3*(mData[i] - 1)). I've changed + * the equation to extend the input scaling down to below a single + * LSB of audio output to ensure an appropriate volume difference + * between the lowest non-zero value of a bin and zero. I've also + * refactored the equation to make the relationship to dB clearer. + * The exp variable is in units of dB/10. + */ + float exp = 5f*(mData[i] - 1f); + mData[i] = (float) Math.pow(10.0, exp); } }