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:
parent
ede622c1ef
commit
11d031f9f0
4 changed files with 33 additions and 26 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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…
Add table
Add a link
Reference in a new issue