1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

DSP: Added missing snapToZero in the StateVariableFilter

This commit is contained in:
hogliux 2017-09-06 16:22:03 +01:00
parent ede622c1ef
commit 11d031f9f0
4 changed files with 33 additions and 26 deletions

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

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"

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>

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;
}