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:
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;