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 51224a28e62a1a098600f2926e832204e53860fd
parent b9e8a9e33bfdfaf5e15ea82db78db41a388978a1
Author: [email protected] <[email protected]>
Date:   Tue,  6 Sep 2016 16:19:09 +0300

Add reference_fft for real FFT

Diffstat:
Minclude/kfr/dft/reference_dft.hpp | 35+++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+), 0 deletions(-)

diff --git a/include/kfr/dft/reference_dft.hpp b/include/kfr/dft/reference_dft.hpp @@ -94,6 +94,41 @@ void reference_fft(complex<T>* out, const complex<T>* in, size_t size, bool inve } template <typename Tnumber = long double, typename T> +void reference_fft(complex<T>* out, const T* in, size_t size) +{ + constexpr bool inversion = false; + using Tcmplx = Tnumber(*)[2]; + if (size < 2) + return; + std::vector<complex<Tnumber>> datain(size); + std::vector<complex<Tnumber>> dataout(size); + std::vector<complex<Tnumber>> temp(size); + std::copy(in, in + size, datain.begin()); + const Tnumber pi2 = c_pi<Tnumber, 2, 1>; + reference_fft_pass<Tnumber>(pi2, size, 0, 1, inversion ? -1 : +1, Tcmplx(datain.data()), + Tcmplx(dataout.data()), Tcmplx(temp.data())); + std::copy(dataout.begin(), dataout.end(), out); +} + +template <typename Tnumber = long double, typename T> +void reference_fft(T* out, const complex<T>* in, size_t size) +{ + constexpr bool inversion = true; + using Tcmplx = Tnumber(*)[2]; + if (size < 2) + return; + std::vector<complex<Tnumber>> datain(size); + std::vector<complex<Tnumber>> dataout(size); + std::vector<complex<Tnumber>> temp(size); + std::copy(in, in + size, datain.begin()); + const Tnumber pi2 = c_pi<Tnumber, 2, 1>; + reference_fft_pass<Tnumber>(pi2, size, 0, 1, inversion ? -1 : +1, Tcmplx(datain.data()), + Tcmplx(dataout.data()), Tcmplx(temp.data())); + for(size_t i = 0; i < size; i++) + out[i] = dataout[i].real(); +} + +template <typename Tnumber = long double, typename T> void reference_dft(complex<T>* out, const complex<T>* in, size_t size, bool inversion = false) { using std::sin;