1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-26 17:58:43 -05:00
sdrangel/modemm17/FirFilter.h

59 lines
892 B
C
Raw Normal View History

2022-07-20 03:07:00 -04:00
// Copyright 2015-2020 Mobilinkd LLC.
#pragma once
#include "Filter.h"
#include <array>
#include <cstddef>
2022-07-04 17:03:07 -04:00
namespace modemm17
{
template <size_t N>
struct BaseFirFilter : FilterBase<float>
{
2022-07-27 13:02:23 -04:00
BaseFirFilter(const std::array<float, N>& taps)
: taps_(taps)
{
history_.fill(0.0);
}
float operator()(float input) override
{
history_[pos_++] = input;
if (pos_ == N) pos_ = 0;
float result = 0.0;
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-07-27 13:02:23 -04:00
private:
const std::array<float, N>& taps_;
std::array<float, N> history_;
size_t pos_ = 0;
};
template <size_t N>
BaseFirFilter<N> makeFirFilter(const std::array<float, N>& taps)
{
return std::move(BaseFirFilter<N>(taps));
}
2022-07-04 17:03:07 -04:00
} // modemm17