2022-07-04 17:03:07 -04:00
|
|
|
// Copyright 2015-2020 modemm17 LLC.
|
2022-06-06 21:22:18 -04:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Filter.h"
|
|
|
|
|
|
|
|
#include <array>
|
|
|
|
#include <cstddef>
|
|
|
|
|
2022-07-04 17:03:07 -04:00
|
|
|
namespace modemm17
|
2022-06-06 21:22:18 -04:00
|
|
|
{
|
|
|
|
|
2022-06-09 14:12:35 -04:00
|
|
|
template <size_t N>
|
|
|
|
struct BaseFirFilter : FilterBase<float>
|
2022-06-06 21:22:18 -04:00
|
|
|
{
|
2022-06-09 14:12:35 -04:00
|
|
|
using array_t = std::array<float, N>;
|
2022-06-06 21:22:18 -04:00
|
|
|
|
|
|
|
const array_t& taps_;
|
|
|
|
array_t history_;
|
|
|
|
size_t pos_ = 0;
|
2022-06-09 14:12:35 -04:00
|
|
|
|
2022-06-06 21:22:18 -04:00
|
|
|
BaseFirFilter(const array_t& taps)
|
|
|
|
: taps_(taps)
|
|
|
|
{
|
|
|
|
history_.fill(0.0);
|
|
|
|
}
|
2022-06-09 14:12:35 -04:00
|
|
|
|
|
|
|
float operator()(float input) override
|
2022-06-06 21:22:18 -04:00
|
|
|
{
|
|
|
|
history_[pos_++] = input;
|
|
|
|
if (pos_ == N) pos_ = 0;
|
|
|
|
|
2022-06-09 14:12:35 -04:00
|
|
|
float result = 0.0;
|
2022-06-06 21:22:18 -04:00
|
|
|
size_t index = pos_;
|
|
|
|
|
|
|
|
for (size_t i = 0; i != N; ++i)
|
|
|
|
{
|
|
|
|
index = (index != 0 ? index - 1 : N - 1);
|
|
|
|
result += history_.at(index) * taps_.at(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void reset()
|
|
|
|
{
|
|
|
|
history_.fill(0.0);
|
|
|
|
pos_ = 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2022-06-09 14:12:35 -04:00
|
|
|
template <size_t N>
|
|
|
|
BaseFirFilter<N> makeFirFilter(const std::array<float, N>& taps)
|
2022-06-06 21:22:18 -04:00
|
|
|
{
|
2022-06-09 14:12:35 -04:00
|
|
|
return std::move(BaseFirFilter<N>(taps));
|
2022-06-06 21:22:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-07-04 17:03:07 -04:00
|
|
|
} // modemm17
|