Small cleanup of IIR filter code.

m17
Rob Riggs 2021-07-24 17:30:21 -05:00
rodzic ba8c0edc8c
commit 139b05205d
1 zmienionych plików z 7 dodań i 8 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
// Copyright 2015-2020 Rob Riggs <rob@mobilinkd.com>
// Copyright 2015-2021 Rob Riggs <rob@mobilinkd.com>
// All rights reserved.
#pragma once
@ -15,31 +15,32 @@ struct IirFilter {
const std::array<float, N>& numerator_;
const std::array<float, N>& denominator_;
std::array<float, N> history_;
size_t size_;
IirFilter(const std::array<float, N>& b,
const std::array<float, N>& a)
: numerator_(b), denominator_(a)
, history_(), size_(N)
, history_()
{
history_.fill(0.0f);
}
~IirFilter() {}
static constexpr size_t size() { return N; }
float operator()(float input)
{
for(size_t i = size_ - 1; i != 0; i--) history_[i] = history_[i - 1];
for (size_t i = N - 1; i != 0; i--) history_[i] = history_[i - 1];
history_[0] = input;
for (size_t i = 1; i != size_; i++) {
for (size_t i = 1; i != N; i++) {
history_[0] -= denominator_[i] * history_[i];
}
float result = 0;
for (size_t i = 0; i != size_; i++) {
for (size_t i = 0; i != N; i++) {
result += numerator_[i] * history_[i];
}
@ -48,5 +49,3 @@ struct IirFilter {
};
}} // mobilinkd::tnc