use UnitCircle to get constants

This commit is contained in:
Ahmet Inan 2019-01-18 17:20:13 +01:00
commit 692bfa4d31

25
fft.hh
View file

@ -7,33 +7,28 @@ Copyright 2018 Ahmet Inan <inan@aicodix.de>
#ifndef FFT_HH #ifndef FFT_HH
#define FFT_HH #define FFT_HH
#include "unit_circle.hh"
#include "const.hh" #include "const.hh"
namespace DSP { namespace DSP {
namespace FFT { namespace FFT {
template <typename TYPE> template <typename TYPE>
static inline TYPE rsqrt2(TYPE a) static constexpr TYPE rsqrt2(TYPE a)
{ {
return Const<TYPE>::InvSqrtTwo() * a; return Const<TYPE>::InvSqrtTwo() * a;
} }
template <typename TYPE> template <int n, int N, typename TYPE>
static inline TYPE twopi(TYPE n, TYPE N) static constexpr TYPE cx(TYPE a)
{ {
return Const<TYPE>::TwoPi() * n / N; return UnitCircle<typename TYPE::value_type>::cos(n, N) * a;
} }
template <int n, int N, typename TYPE> template <int n, int N, typename TYPE>
static inline TYPE cx(TYPE a) static constexpr TYPE sx(TYPE a)
{ {
return std::cos(twopi<typename TYPE::value_type>(n, N)) * a; return UnitCircle<typename TYPE::value_type>::sin(n, N) * a;
}
template <int n, int N, typename TYPE>
static inline TYPE sx(TYPE a)
{
return std::sin(twopi<typename TYPE::value_type>(n, N)) * a;
} }
template <typename TYPE> template <typename TYPE>
@ -1122,10 +1117,8 @@ public:
typedef typename TYPE::value_type value_type; typedef typename TYPE::value_type value_type;
FastFourierTransform() FastFourierTransform()
{ {
for (int n = 0; n < BINS; ++n) { for (int n = 0; n < BINS; ++n)
value_type a = SIGN * FFT::twopi<value_type>(n, BINS); factors[n] = TYPE(UnitCircle<value_type>::cos(n, BINS), SIGN * UnitCircle<value_type>::sin(n, BINS));
factors[n] = TYPE(std::cos(a), std::sin(a));
}
} }
inline void operator ()(TYPE *out, const TYPE *in) inline void operator ()(TYPE *out, const TYPE *in)
{ {