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 a49db45bb3a3d70bfbd3f6f648206206315b66b1
parent 68c2f63a7dcf28f9148fa759cce6d5b4232c2833
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date:   Sun, 26 Nov 2023 10:53:00 +0000

lowhalf, highhalf

Diffstat:
Minclude/kfr/simd/shuffle.hpp | 24++++++++++++++++++++++++
1 file changed, 24 insertions(+), 0 deletions(-)

diff --git a/include/kfr/simd/shuffle.hpp b/include/kfr/simd/shuffle.hpp @@ -54,6 +54,18 @@ KFR_INTRINSIC vec_shape<T, Nout> low(vec_shape<T, N>) return {}; } +template <typename T, size_t N, size_t Nout = N / 2> +KFR_INTRINSIC vec<T, Nout> lowhalf(const vec<T, N>& x) +{ + return x.shuffle(csizeseq<Nout>); +} + +template <typename T, size_t N, size_t Nout = N / 2> +KFR_INTRINSIC vec_shape<T, Nout> lowhalf(vec_shape<T, N>) +{ + return {}; +} + template <typename T, size_t N, size_t Nout = N - prev_poweroftwo(N - 1)> KFR_INTRINSIC vec<T, Nout> high(const vec<T, N>& x) { @@ -66,6 +78,18 @@ KFR_INTRINSIC vec_shape<T, Nout> high(vec_shape<T, N>) return {}; } +template <typename T, size_t N, size_t Nout = N - N / 2> +KFR_INTRINSIC vec<T, Nout> highhalf(const vec<T, N>& x) +{ + return x.shuffle(csizeseq<Nout, N / 2>); +} + +template <typename T, size_t N, size_t Nout = N - N / 2> +KFR_INTRINSIC vec_shape<T, Nout> highhalf(vec_shape<T, N>) +{ + return {}; +} + template <typename T, size_t... Ns> KFR_INTRINSIC vec<T, csum<size_t, Ns...>()> concat(const vec<T, Ns>&... vs) CMT_NOEXCEPT {