inline SPROUT_CONSTEXPR T triangle_value_impl(T const& t) { typedef double elem_type; using sprout::sin; using sprout::asin; return T(sprout::math::two_div_pi<elem_type>()) * asin(sin(T(sprout::math::two_pi<elem_type>()) * t)); }
inline SPROUT_CONSTEXPR typename std::iterator_traits<RandomAccessIterator>::value_type dft_element_gen_impl_ra( RandomAccessIterator first, RandomAccessIterator last, typename std::iterator_traits<RandomAccessIterator>::value_type::value_type arg, typename std::iterator_traits<RandomAccessIterator>::difference_type pivot, typename std::iterator_traits<RandomAccessIterator>::difference_type k = 0 ) { typedef typename std::iterator_traits<RandomAccessIterator>::value_type value_type; using sprout::cos; using sprout::sin; return pivot == 0 ? *first * value_type(cos(arg * k), sin(arg * k)) : sprout::detail::dft_element_gen_impl_ra( first, sprout::next(first, pivot), arg, pivot / 2, k ) + sprout::detail::dft_element_gen_impl_ra( sprout::next(first, pivot), last, arg, (sprout::distance(first, last) - pivot) / 2, k + pivot ) ; }
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type phase_spectrum_impl( InputIterator first, InputIterator last, Result const& result, sprout::index_tuple<Indexes...>, typename sprout::container_traits<Result>::difference_type offset, typename sprout::container_traits<Result>::size_type size, typename sprout::container_traits<Result>::size_type input_size ) { using sprout::real; using sprout::imag; return sprout::remake<Result>( result, size, (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size ? sprout::atan2( sprout::llround(imag(*sprout::next(first, Indexes))), sprout::llround(real(*sprout::next(first, Indexes))) ) : *sprout::next(sprout::internal_begin(result), Indexes) )... ); }
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::value_type dft_element_gen_impl_1( InputIterator first, InputIterator last, typename std::iterator_traits<InputIterator>::value_type::value_type arg, typename std::iterator_traits<InputIterator>::difference_type k = 0, typename std::iterator_traits<InputIterator>::value_type value = typename std::iterator_traits<InputIterator>::value_type(), typename std::iterator_traits<InputIterator>::value_type::value_type theta = typename std::iterator_traits<InputIterator>::value_type::value_type() ) { typedef typename std::iterator_traits<InputIterator>::value_type value_type; using sprout::cos; using sprout::sin; return first == last ? value : value + sprout::detail::dft_element_gen_impl_1( sprout::next(first), last, arg, k + 1, *first * value_type(cos(theta), sin(theta)), arg * (k + 1) ) ; }
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Container>::type sinusoid_impl( Container const& cont, typename sprout::container_traits<Container>::value_type const& d, typename sprout::container_traits<Container>::value_type const& amplitude, typename sprout::container_traits<Container>::value_type const& phase, sprout::index_tuple<Indexes...>, typename sprout::container_traits<Container>::difference_type offset, typename sprout::container_traits<Container>::size_type size ) { typedef typename sprout::container_traits<Container>::value_type value_type; using sprout::sin; return sprout::remake<Container>( cont, size, (Indexes >= offset && Indexes < offset + size ? amplitude * sin(d * value_type(Indexes) + phase) : *sprout::next(sprout::internal_begin(cont), Indexes) )... ); }
inline SPROUT_CONSTEXPR typename T::value_type phase_spectrum_value(T const& x) { using sprout::real; using sprout::imag; return sprout::atan2(sprout::llround(imag(x)), sprout::llround(real(x))); }
inline SPROUT_CONSTEXPR typename T::value_type amplitude_spectrum_value(T const& x) { using sprout::real; using sprout::imag; return sprout::sqrt(real(x) * real(x) + imag(x) * imag(x)); }
inline SPROUT_CONSTEXPR std::size_t to_hash(T&& v) { using sprout::hash_value; using sprout_adl::hash_value; return hash_value(SPROUT_FORWARD(T, v)); }
inline SPROUT_CONSTEXPR T sinusoid_value(T const& amplitude, T const& phase, T const& d, Index i) { using sprout::sin; return amplitude * sin(d * T(i) + phase); }
SPROUT_CONSTEXPR typename sprout::float_promote<ArithmeticType1, ArithmeticType2>::type equal_temperament_value(ArithmeticType1 i, ArithmeticType2 div) { typedef typename sprout::float_promote<ArithmeticType1, ArithmeticType2>::type type; using sprout::pow; return pow(type(2), type(i) / type(div)); }
inline SPROUT_CONSTEXPR std::size_t to_hash(T&& v) { using sprout::hash_value; using sprout_adl::hash_value; return hash_value(sprout::forward<T>(v)); }
inline SPROUT_CONSTEXPR std::size_t call_hash_value(T const& v) { using sprout::hash_value; using sprout_adl::hash_value; return hash_value(v); }
inline SPROUT_CONSTEXPR T sawtooth_value_impl(T const& t) { using sprout::floor; return 2 * (t - floor(t + T(0.5))); }