Unrolled FIR filters for more flexible baseband filtering (using IFIR technique).

This commit is contained in:
Jared Boone 2015-12-29 10:48:29 -08:00
parent 87c9772128
commit 549e5b9ddc
2 changed files with 338 additions and 0 deletions

View file

@ -31,6 +31,8 @@
#include "dsp_types.hpp"
#include "simd.hpp"
namespace dsp {
namespace decimate {
@ -90,6 +92,64 @@ private:
const std::array<int16_t, taps_count>& taps;
};
class FIRC8xR16x24FS4Decim8 {
public:
static constexpr size_t taps_count = 24;
static constexpr size_t decimation_factor = 8;
using sample_t = complex8_t;
using tap_t = int16_t;
enum class Shift : bool {
Down = true,
Up = false
};
FIRC8xR16x24FS4Decim8();
void configure(
const std::array<tap_t, taps_count>& taps,
const int32_t scale,
const Shift shift = Shift::Down
);
buffer_c16_t execute(
buffer_c8_t src,
buffer_c16_t dst
);
private:
std::array<vec2_s16, taps_count - decimation_factor> z_;
std::array<tap_t, taps_count> taps_;
int32_t output_scale = 0;
};
class FIRC16xR16x32Decim8 {
public:
static constexpr size_t taps_count = 32;
static constexpr size_t decimation_factor = 8;
using sample_t = complex16_t;
using tap_t = int16_t;
FIRC16xR16x32Decim8();
void configure(
const std::array<tap_t, taps_count>& taps,
const int32_t scale
);
buffer_c16_t execute(
buffer_c16_t src,
buffer_c16_t dst
);
private:
std::array<vec2_s16, taps_count - decimation_factor> z_;
std::array<tap_t, taps_count> taps_;
int32_t output_scale = 0;
};
class FIRAndDecimateComplex {
public:
using sample_t = complex16_t;