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<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 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 T sinusoid_value(T const& amplitude, T const& phase, T const& d, Index i) { using sprout::sin; return amplitude * sin(d * T(i) + phase); }