Browse Source

DSP: Added missing snapToZero in the StateVariableFilter

tags/2021-05-28
hogliux 7 years ago
parent
commit
11d031f9f0
4 changed files with 33 additions and 26 deletions
  1. +8
    -0
      modules/juce_dsp/containers/juce_SIMDRegister.h
  2. +15
    -0
      modules/juce_dsp/juce_dsp.h
  3. +7
    -26
      modules/juce_dsp/processors/juce_IIRFilter_Impl.h
  4. +3
    -0
      modules/juce_dsp/processors/juce_StateVariableFilter.h

+ 8
- 0
modules/juce_dsp/containers/juce_SIMDRegister.h View File

@@ -386,6 +386,14 @@ struct CmplxSIMDOps<std::complex<Scalar> >
}
};
//==============================================================================
#ifndef DOXYGEN
namespace util
{
template <typename Type>
inline void snapToZero (SIMDRegister<Type>&) noexcept {}
}
#endif
//==============================================================================
// Extend some common used global functions to SIMDRegister types


+ 15
- 0
modules/juce_dsp/juce_dsp.h View File

@@ -177,6 +177,21 @@ namespace juce
template <typename Type>
using Complex = ::std::complex<Type>;
//==============================================================================
namespace util
{
/** Use this function to prevent denormals on intel CPUs.
This function will work with both primitives and simple containers.
*/
inline void snapToZero (float& x) noexcept { JUCE_SNAP_TO_ZERO (x); }
#ifndef DOXYGEN
inline void snapToZero (double& x) noexcept { JUCE_SNAP_TO_ZERO (x); }
inline void snapToZero (long double& x) noexcept { JUCE_SNAP_TO_ZERO (x); }
#endif
}
//==============================================================================
#if JUCE_USE_SIMD
#include "native/juce_fallback_SIMDNativeOps.h"


+ 7
- 26
modules/juce_dsp/processors/juce_IIRFilter_Impl.h View File

@@ -26,25 +26,6 @@
#ifndef DOXYGEN
template <typename Type>
struct SnapToZeroHelper
{
static void snap (Type& x) noexcept
{
for (size_t i = 0; i < Type::size(); ++i)
JUCE_SNAP_TO_ZERO (x[i]);
}
};
template <> struct SnapToZeroHelper<float> { static void snap (float& x) noexcept { JUCE_SNAP_TO_ZERO (x); } };
template <> struct SnapToZeroHelper<double> { static void snap (double& x) noexcept { JUCE_SNAP_TO_ZERO (x); } };
template <> struct SnapToZeroHelper<long double> { static void snap (long double& x) noexcept { JUCE_SNAP_TO_ZERO (x); } };
#if JUCE_USE_SIMD
template <typename Type>
struct SnapToZeroHelper<SIMDRegister<Type>> { static void snap (SIMDRegister<Type>&) noexcept {} };
#endif
//==============================================================================
template <typename SampleType>
Filter<SampleType>::Filter()
@@ -120,7 +101,7 @@ void Filter<SampleType>::process (const ProcessContext& context) noexcept
lv1 = (in * b1) - (out * a1);
}
SnapToZeroHelper<SampleType>::snap (lv1); state[0] = lv1;
util::snapToZero (lv1); state[0] = lv1;
}
break;
@@ -145,8 +126,8 @@ void Filter<SampleType>::process (const ProcessContext& context) noexcept
lv2 = (in * b2) - (out * a2);
}
SnapToZeroHelper<SampleType>::snap (lv1); state[0] = lv1;
SnapToZeroHelper<SampleType>::snap (lv2); state[1] = lv2;
util::snapToZero (lv1); state[0] = lv1;
util::snapToZero (lv2); state[1] = lv2;
}
break;
@@ -175,9 +156,9 @@ void Filter<SampleType>::process (const ProcessContext& context) noexcept
lv3 = (in * b3) - (out * a3);
}
SnapToZeroHelper<SampleType>::snap (lv1); state[0] = lv1;
SnapToZeroHelper<SampleType>::snap (lv2); state[1] = lv2;
SnapToZeroHelper<SampleType>::snap (lv3); state[2] = lv3;
util::snapToZero (lv1); state[0] = lv1;
util::snapToZero (lv2); state[1] = lv2;
util::snapToZero (lv3); state[2] = lv3;
}
break;
@@ -220,7 +201,7 @@ template <typename SampleType>
void Filter<SampleType>::snapToZero() noexcept
{
for (size_t i = 0; i < order; ++i)
SnapToZeroHelper<SampleType>::snap (state[i]);
util::snapToZero (state[i]);
}
template <typename SampleType>


+ 3
- 0
modules/juce_dsp/processors/juce_StateVariableFilter.h View File

@@ -141,6 +141,9 @@ namespace StateVariableFilter
for (size_t i = 0 ; i < n; ++i)
output[i] = processLoop<type> (input[i], state);
util::snapToZero (s1);
util::snapToZero (s2);
*parameters = state;
}


Loading…
Cancel
Save