made count of input and output samples independent

This commit is contained in:
Ahmet Inan 2020-02-16 22:26:38 +01:00
commit 65e24d421f

25
fdzp.hh
View file

@ -10,28 +10,29 @@ Copyright 2019 Ahmet Inan <inan@aicodix.de>
namespace DSP { namespace DSP {
template <int BINS, int FACT, typename CMPLX> template <int OUTPUT, int INPUT, typename CMPLX>
class FDZP class FDZP
{ {
typedef typename CMPLX::value_type VALUE; typedef typename CMPLX::value_type VALUE;
FastFourierTransform<BINS, CMPLX, -1> fwd; FastFourierTransform<INPUT, CMPLX, -1> fwd;
FastFourierTransform<BINS * FACT, CMPLX, 1> bwd; FastFourierTransform<OUTPUT, CMPLX, 1> bwd;
CMPLX tmp[BINS * FACT]; CMPLX tmp[OUTPUT];
static constexpr VALUE SCALE = VALUE(1) / VALUE(BINS); static constexpr VALUE SCALE = VALUE(1) / VALUE(INPUT);
static_assert(INPUT < OUTPUT, "OUTPUT must be larger than INPUT");
public: public:
void operator ()(CMPLX *output, const CMPLX *input) void operator ()(CMPLX *output, const CMPLX *input)
{ {
fwd(tmp, input); fwd(tmp, input);
if (!(BINS&1)) { if (!(INPUT&1)) {
tmp[BINS/2] *= VALUE(0.5); tmp[INPUT/2] *= VALUE(0.5);
tmp[BINS*FACT-BINS/2] = tmp[BINS/2]; tmp[OUTPUT-INPUT/2] = tmp[INPUT/2];
} }
for (int i = (BINS+1)/2+1; i < BINS; ++i) for (int i = (INPUT+1)/2+1; i < INPUT; ++i)
tmp[BINS*(FACT-1)+i] = tmp[i]; tmp[OUTPUT-INPUT+i] = tmp[i];
for (int i = (BINS+1)/2+1; i < BINS; ++i) for (int i = (INPUT+1)/2+1; i < INPUT; ++i)
tmp[i] = 0; tmp[i] = 0;
bwd(output, tmp); bwd(output, tmp);
for (int i = 0; i < BINS * FACT; ++i) for (int i = 0; i < OUTPUT; ++i)
output[i] *= SCALE; output[i] *= SCALE;
} }
}; };