aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2023-02-11 00:24:37 -0800
committerChris Robinson <[email protected]>2023-02-11 00:24:37 -0800
commit74d7d60a6c78893d0e05e40b6a55f7d8642bac19 (patch)
tree02a1a4afd1864085b90a252390bdcf92a1556604 /core
parentca419e2966f43ccec5a023afc206972ddbf0a137 (diff)
Don't require samplesToDo > forwardSamples for decoders
Diffstat (limited to 'core')
-rw-r--r--core/uhjfilter.cpp20
-rw-r--r--core/uhjfilter.h6
2 files changed, 13 insertions, 13 deletions
diff --git a/core/uhjfilter.cpp b/core/uhjfilter.cpp
index ac5f2d40..da253300 100644
--- a/core/uhjfilter.cpp
+++ b/core/uhjfilter.cpp
@@ -336,7 +336,7 @@ void UhjDecoderIIR::decode(const al::span<float*> samples, const size_t samplesT
mFilter2DT.process(Filter2Coeff, {mTemp.data(), samplesToDo}, forwardSamples, xoutput);
/* Apply filter1 to S and store in mTemp. */
- mFilter1S.process(Filter1Coeff, {mS.data(), samplesToDo-1}, forwardSamples, mTemp.data()+1);
+ mFilter1S.process(Filter1Coeff, {mS.data(), samplesToDo}, forwardSamples, mTemp.data()+1);
mTemp[0] = mDelayS; mDelayS = mTemp[forwardSamples];
/* W = 0.981532*S + 0.197484*j(0.828331*D + 0.767820*T) */
@@ -347,18 +347,18 @@ void UhjDecoderIIR::decode(const al::span<float*> samples, const size_t samplesT
xoutput[i] = 0.418496f*mTemp[i] - xoutput[i];
- /* Apply filter1 to (0.795968*D - 0.676392*T) and store in youtput. */
- std::transform(mD.cbegin(), mD.cbegin()+samplesToDo, youtput, mTemp.begin(),
+ /* Apply filter1 to (0.795968*D - 0.676392*T) and store in mTemp. */
+ std::transform(mD.cbegin(), mD.cbegin()+samplesToDo, youtput, youtput,
[](const float d, const float t) noexcept { return 0.795968f*d - 0.676392f*t; });
- mFilter1DT.process(Filter1Coeff, {mTemp.data(), samplesToDo-1}, forwardSamples, youtput+1);
- youtput[0] = mDelayDT; mDelayDT = youtput[forwardSamples];
+ mFilter1DT.process(Filter1Coeff, {youtput, samplesToDo}, forwardSamples, mTemp.data()+1);
+ mTemp[0] = mDelayDT; mDelayDT = mTemp[forwardSamples];
- /* Precompute j*S and store in mTemp. */
- mFilter2S.process(Filter2Coeff, {mS.data(), samplesToDo}, forwardSamples, mTemp.data());
+ /* Precompute j*S and store in youtput. */
+ mFilter2S.process(Filter2Coeff, {mS.data(), samplesToDo}, forwardSamples, youtput);
/* Y = 0.795968*D - 0.676392*T + j(0.186633*S) */
for(size_t i{0};i < samplesToDo;++i)
- youtput[i] = youtput[i] + 0.186633f*mTemp[i];
+ youtput[i] = mTemp[i] + 0.186633f*youtput[i];
if(samples.size() > 3)
@@ -506,7 +506,7 @@ void UhjStereoDecoderIIR::decode(const al::span<float*> samples, const size_t sa
float *RESTRICT youtput{al::assume_aligned<16>(samples[2])};
/* Apply filter1 to S and store in mTemp. */
- mFilter1S.process(Filter1Coeff, {mS.data(), samplesToDo-1}, forwardSamples, mTemp.data()+1);
+ mFilter1S.process(Filter1Coeff, {mS.data(), samplesToDo}, forwardSamples, mTemp.data()+1);
mTemp[0] = mDelayS; mDelayS = mTemp[forwardSamples];
/* Precompute j*D and store in xoutput. */
@@ -523,7 +523,7 @@ void UhjStereoDecoderIIR::decode(const al::span<float*> samples, const size_t sa
mFilter2S.process(Filter2Coeff, {mS.data(), samplesToDo}, forwardSamples, youtput);
/* Apply filter1 to D and store in mTemp. */
- mFilter1D.process(Filter1Coeff, {mD.data(), samplesToDo-1}, forwardSamples, mTemp.data()+1);
+ mFilter1D.process(Filter1Coeff, {mD.data(), samplesToDo}, forwardSamples, mTemp.data()+1);
mTemp[0] = mDelayD; mDelayD = mTemp[forwardSamples];
/* Y = 1.6822415*w*D - 0.2156194*j*S */
diff --git a/core/uhjfilter.h b/core/uhjfilter.h
index 0cdd0f90..ebab14e5 100644
--- a/core/uhjfilter.h
+++ b/core/uhjfilter.h
@@ -164,13 +164,13 @@ struct UhjDecoderIIR final : public DecoderBase {
/* FIXME: These IIR decoder filters actually have a 1-sample delay on the
* non-filtered components, which is not reflected in the source latency
* value. sInputPadding is 0, however, because it doesn't need any extra
- * input samples as long as 'forwardSamples' is less than 'samplesToDo'.
+ * input samples.
*/
static constexpr size_t sInputPadding{0};
alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge> mS{};
alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge> mD{};
- alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge> mTemp{};
+ alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge+1> mTemp{};
float mDelayS{}, mDelayDT{}, mDelayQ{};
UhjAllPassFilter mFilter1S;
@@ -218,7 +218,7 @@ struct UhjStereoDecoderIIR final : public DecoderBase {
alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge> mS{};
alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge> mD{};
- alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge> mTemp{};
+ alignas(16) std::array<float,BufferLineSize+MaxResamplerEdge+1> mTemp{};
float mDelayS{}, mDelayD{};
UhjAllPassFilter mFilter1S;