aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2019-06-04 17:50:36 -0700
committerChris Robinson <[email protected]>2019-06-04 17:50:36 -0700
commit9d861406c06d44f4b39e25f3a4deabdf11242ea1 (patch)
treeb3c8328dface60cb14da460b211db146a88717f4
parent4522a51ea21813de9a59dd059c50f85d8a5116f1 (diff)
Avoid a separate struct for the bandsplitter all-pass
-rw-r--r--Alc/alu.cpp11
-rw-r--r--Alc/filters/splitter.cpp27
-rw-r--r--Alc/filters/splitter.h27
-rw-r--r--Alc/hrtf.cpp7
-rw-r--r--Alc/panning.cpp3
5 files changed, 17 insertions, 58 deletions
diff --git a/Alc/alu.cpp b/Alc/alu.cpp
index d41a66aa..97ebf0cb 100644
--- a/Alc/alu.cpp
+++ b/Alc/alu.cpp
@@ -1499,7 +1499,6 @@ void ApplyStablizer(FrontStablizer *Stablizer, FloatBufferLine *Buffer, const in
}
}
- const SplitterAllpass &APFilter = Stablizer->APFilter;
ALfloat (&lsplit)[2][BUFFERSIZE] = Stablizer->LSplit;
ALfloat (&rsplit)[2][BUFFERSIZE] = Stablizer->RSplit;
auto &tmpbuf = Stablizer->TempBuf;
@@ -1507,7 +1506,7 @@ void ApplyStablizer(FrontStablizer *Stablizer, FloatBufferLine *Buffer, const in
/* This applies the band-splitter, preserving phase at the cost of some
* delay. The shorter the delay, the more error seeps into the result.
*/
- auto apply_splitter = [&APFilter,&tmpbuf,SamplesToDo](const FloatBufferLine &Buffer,
+ auto apply_splitter = [&tmpbuf,SamplesToDo](const FloatBufferLine &Buffer,
ALfloat (&DelayBuf)[FrontStablizer::DelayLength], BandSplitter &Filter,
ALfloat (&splitbuf)[2][BUFFERSIZE]) -> void
{
@@ -1522,13 +1521,9 @@ void ApplyStablizer(FrontStablizer *Stablizer, FloatBufferLine *Buffer, const in
std::copy_n(std::begin(tmpbuf), FrontStablizer::DelayLength, std::begin(DelayBuf));
/* Apply an all-pass on the reversed signal, then reverse the samples
- * to get the forward signal with a reversed phase shift. Note that the
- * all-pass filter is copied to a local for use, since each pass is
- * indepedent because the signal's processed backwards (with a delay
- * being used to hide discontinuities).
+ * to get the forward signal with a reversed phase shift.
*/
- SplitterAllpass allpass{APFilter};
- allpass.process(tmpbuf, SamplesToDo+FrontStablizer::DelayLength);
+ Filter.applyAllpass(tmpbuf, SamplesToDo+FrontStablizer::DelayLength);
std::reverse(std::begin(tmpbuf), tmpbuf_end+FrontStablizer::DelayLength);
/* Now apply the band-splitter, combining its phase shift with the
diff --git a/Alc/filters/splitter.cpp b/Alc/filters/splitter.cpp
index 8b1a4db4..09e7bfe8 100644
--- a/Alc/filters/splitter.cpp
+++ b/Alc/filters/splitter.cpp
@@ -94,30 +94,13 @@ void BandSplitterR<Real>::applyHfScale(Real *samples, const Real hfscale, const
this->ap_z1 = ap_z1;
}
-template class BandSplitterR<float>;
-template class BandSplitterR<double>;
-
-
-template<typename Real>
-void SplitterAllpassR<Real>::init(Real f0norm)
-{
- const Real w{f0norm * al::MathDefs<Real>::Tau()};
- const Real cw{std::cos(w)};
- if(cw > std::numeric_limits<float>::epsilon())
- coeff = (std::sin(w) - 1.0f) / cw;
- else
- coeff = cw * -0.5f;
-
- z1 = 0.0f;
-}
-
template<typename Real>
-void SplitterAllpassR<Real>::process(Real *samples, int count)
+void BandSplitterR<Real>::applyAllpass(Real *samples, const int count) const
{
ASSUME(count > 0);
const Real coeff{this->coeff};
- Real z1{this->z1};
+ Real z1{0.0f};
auto proc_sample = [coeff,&z1](const Real in) noexcept -> Real
{
const Real out{in*coeff + z1};
@@ -125,8 +108,8 @@ void SplitterAllpassR<Real>::process(Real *samples, int count)
return out;
};
std::transform(samples, samples+count, samples, proc_sample);
- this->z1 = z1;
}
-template class SplitterAllpassR<float>;
-template class SplitterAllpassR<double>;
+
+template class BandSplitterR<float>;
+template class BandSplitterR<double>;
diff --git a/Alc/filters/splitter.h b/Alc/filters/splitter.h
index cd5fe864..70fddd9e 100644
--- a/Alc/filters/splitter.h
+++ b/Alc/filters/splitter.h
@@ -21,28 +21,16 @@ public:
void init(Real f0norm);
void clear() noexcept { lp_z1 = lp_z2 = ap_z1 = 0.0f; }
void process(Real *hpout, Real *lpout, const Real *input, const int count);
- void applyHfScale(Real *samples, const Real hfscale, const int count);
-};
-using BandSplitter = BandSplitterR<float>;
-
-/* The all-pass portion of the band splitter. Applies the same phase shift
- * without splitting the signal.
- */
-template<typename Real>
-class SplitterAllpassR {
- Real coeff{0.0f};
- Real z1{0.0f};
-public:
- SplitterAllpassR() = default;
- SplitterAllpassR(const SplitterAllpassR&) = default;
- SplitterAllpassR(Real f0norm) { init(f0norm); }
+ void applyHfScale(Real *samples, const Real hfscale, const int count);
- void init(Real f0norm);
- void clear() noexcept { z1 = 0.0f; }
- void process(Real *samples, int count);
+ /* The all-pass portion of the band splitter. Applies the same phase shift
+ * without splitting the signal. Note that each use of this method is
+ * indepedent, it does not track history between calls.
+ */
+ void applyAllpass(Real *samples, const int count) const;
};
-using SplitterAllpass = SplitterAllpassR<float>;
+using BandSplitter = BandSplitterR<float>;
struct FrontStablizer {
@@ -50,7 +38,6 @@ struct FrontStablizer {
alignas(16) float DelayBuf[MAX_OUTPUT_CHANNELS][DelayLength];
- SplitterAllpass APFilter;
BandSplitter LFilter, RFilter;
alignas(16) float LSplit[2][BUFFERSIZE];
alignas(16) float RSplit[2][BUFFERSIZE];
diff --git a/Alc/hrtf.cpp b/Alc/hrtf.cpp
index 16b2dc3c..0980dcb6 100644
--- a/Alc/hrtf.cpp
+++ b/Alc/hrtf.cpp
@@ -338,7 +338,6 @@ void BuildBFormatHrtf(const HrtfEntry *Hrtf, DirectHrtfState *state, const ALsiz
static constexpr ALsizei base_delay{DualBand ? 12 : 0};
const ALdouble xover_norm{400.0 / Hrtf->sampleRate};
BandSplitterR<double> splitter{xover_norm};
- SplitterAllpassR<double> allpass{xover_norm};
auto tmpres = al::vector<HrirArray<ALdouble>>(NumChannels);
auto tmpfilt = al::vector<std::array<ALdouble,HRIR_LENGTH*4>>(3);
@@ -381,8 +380,7 @@ void BuildBFormatHrtf(const HrtfEntry *Hrtf, DirectHrtfState *state, const ALsiz
* sample array. This produces the forward response with a backwards
* phase-shift (+n degrees becomes -n degrees).
*/
- allpass.clear();
- allpass.process(tmpfilt[2].data(), static_cast<int>(tmpfilt[2].size()));
+ splitter.applyAllpass(tmpfilt[2].data(), static_cast<int>(tmpfilt[2].size()));
std::reverse(tmpfilt[2].begin(), tmpfilt[2].end());
/* Now apply the band-splitter. This applies the normal phase-shift,
@@ -408,8 +406,7 @@ void BuildBFormatHrtf(const HrtfEntry *Hrtf, DirectHrtfState *state, const ALsiz
std::transform(fir, fir+Hrtf->irSize, tmpfilt[2].rbegin() + HRIR_LENGTH*3,
[](const ALfloat (&ir)[2]) noexcept -> ALdouble { return ir[1]; });
- allpass.clear();
- allpass.process(tmpfilt[2].data(), static_cast<int>(tmpfilt[2].size()));
+ splitter.applyAllpass(tmpfilt[2].data(), static_cast<int>(tmpfilt[2].size()));
std::reverse(tmpfilt[2].begin(), tmpfilt[2].end());
splitter.clear();
diff --git a/Alc/panning.cpp b/Alc/panning.cpp
index ab57ed45..87f8bf72 100644
--- a/Alc/panning.cpp
+++ b/Alc/panning.cpp
@@ -841,9 +841,6 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
stablizer->LFilter.init(scale);
stablizer->RFilter = stablizer->LFilter;
- /* Initialize an all-pass filter for the phase corrector. */
- stablizer->APFilter.init(scale);
-
device->Stablizer = std::move(stablizer);
/* NOTE: Don't know why this has to be "copied" into a local
* static constexpr variable to avoid a reference on