kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

commit 26999ea8acf56f43000a29cbb5f27ae766ba604a
parent 164f87e3d2c6be895735db543b39976fde6874cd
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date:   Fri,  1 Jul 2016 15:58:52 +0300

kfr::broadcast now takes the width of the result vector

Diffstat:
Minclude/kfr/base/operators.hpp | 4++--
Minclude/kfr/base/shuffle.hpp | 6+++---
Minclude/kfr/base/vec.hpp | 2+-
Minclude/kfr/dft/fft.hpp | 4++--
Minclude/kfr/dft/ft.hpp | 10+++++-----
5 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/include/kfr/base/operators.hpp b/include/kfr/base/operators.hpp @@ -653,11 +653,11 @@ KFR_FN(addsub) template <typename T, size_t N> KFR_INLINE vec<T, N> negeven(const vec<T, N>& x) { - return x ^ broadcast<N / 2>(-T(), T()); + return x ^ broadcast<N>(-T(), T()); } template <typename T, size_t N> KFR_INLINE vec<T, N> negodd(const vec<T, N>& x) { - return x ^ broadcast<N / 2>(T(), -T()); + return x ^ broadcast<N>(T(), -T()); } } diff --git a/include/kfr/base/shuffle.hpp b/include/kfr/base/shuffle.hpp @@ -55,7 +55,7 @@ KFR_INLINE constexpr vec<T, Nout> broadcast_helper(csizes_t<indices...>, T x, Ts } } -template <size_t N, typename T, typename... Ts, size_t Nout = N*(2 + sizeof...(Ts))> +template <size_t Nout, typename T, typename... Ts> constexpr KFR_INLINE vec<T, Nout> broadcast(T x, T y, Ts... rest) { return internal::broadcast_helper(csizeseq<Nout>, x, y, rest...); @@ -289,12 +289,12 @@ namespace internal template <typename T, size_t N, typename = u8[N > 1]> constexpr KFR_INLINE mask<T, N> evenmask() { - return broadcast<N / 2, T>(maskbits<T>(true), maskbits<T>(false)); + return broadcast<N, T>(maskbits<T>(true), maskbits<T>(false)); } template <typename T, size_t N, typename = u8[N > 1]> constexpr KFR_INLINE mask<T, N> oddmask() { - return broadcast<N / 2, T>(maskbits<T>(false), maskbits<T>(true)); + return broadcast<N, T>(maskbits<T>(false), maskbits<T>(true)); } } diff --git a/include/kfr/base/vec.hpp b/include/kfr/base/vec.hpp @@ -1234,7 +1234,7 @@ struct expression_lambda : input_expression { KFR_INLINE expression_lambda(Fn&& fn) : fn(std::move(fn)) {} - template <typename T, size_t N, KFR_ENABLE_IF(is_callable<Fn, cinput_t, size_t, vec_t<T, N>>::value)> + template <typename T, size_t N, KFR_ENABLE_IF(N&& is_callable<Fn, cinput_t, size_t, vec_t<T, N>>::value)> KFR_INLINE vec<T, N> operator()(cinput_t, size_t index, vec_t<T, N> y) const { return fn(cinput, index, y); diff --git a/include/kfr/dft/fft.hpp b/include/kfr/dft/fft.hpp @@ -113,13 +113,13 @@ KFR_INTRIN void radix4_body(size_t N, csize_t<width>, cfalse_t, cfalse_t, cfalse diff13 = a1 - a3; if (inverse) { - diff13 = (diff13 ^ broadcast<width, T>(T(), -T())); + diff13 = (diff13 ^ broadcast<width * 2, T>(T(), -T())); diff13 = swap<2>(diff13); } else { diff13 = swap<2>(diff13); - diff13 = (diff13 ^ broadcast<width, T>(T(), -T())); + diff13 = (diff13 ^ broadcast<width * 2, T>(T(), -T())); } w1 = diff02 + diff13; diff --git a/include/kfr/dft/ft.hpp b/include/kfr/dft/ft.hpp @@ -474,7 +474,7 @@ constexpr cvec<T, N> fixed_twiddle = get_fixed_twiddle<T, N, size, start, step, template <typename T, size_t N, bool inverse> constexpr cvec<T, N> twiddleimagmask() { - return inverse ? broadcast<N, T>(-1, +1) : broadcast<N, T>(+1, -1); + return inverse ? broadcast<N * 2, T>(-1, +1) : broadcast<N * 2, T>(+1, -1); } #pragma clang diagnostic push @@ -564,13 +564,13 @@ KFR_INTRIN void butterfly4(cfalse_t /*split_format*/, cvec<T, N> a0, cvec<T, N> w2 = sum02 - sum13; if (inverse) { - diff13 = (diff13 ^ broadcast<N, T>(T(), -T())); + diff13 = (diff13 ^ broadcast<N * 2, T>(T(), -T())); diff13 = swap<2>(diff13); } else { diff13 = swap<2>(diff13); - diff13 = (diff13 ^ broadcast<N, T>(T(), -T())); + diff13 = (diff13 ^ broadcast<N * 2, T>(T(), -T())); } w1 = diff02 + diff13; @@ -1436,10 +1436,10 @@ KFR_INTRIN void generic_butterfly(size_t radix, cbool_t<inverse>, complex<T>* ou } template <typename T, size_t N> -constexpr cvec<T, N> cmask08 = broadcast<N, T>(T(), -T()); +constexpr cvec<T, N> cmask08 = broadcast<N * 2, T>(T(), -T()); template <typename T, size_t N> -constexpr cvec<T, N> cmask0088 = broadcast<N, T>(T(), T(), -T(), -T()); +constexpr cvec<T, N> cmask0088 = broadcast<N * 4, T>(T(), T(), -T(), -T()); template <bool A = false, typename T, size_t N> KFR_INTRIN void cbitreverse_write(complex<T>* dest, vec<T, N> x)