simple crude fir filter

This commit is contained in:
Robin Dietzel 2025-06-18 13:51:40 +02:00
parent c91a78a91d
commit c33d644fb0
4 changed files with 86 additions and 0 deletions

View File

@ -3,6 +3,25 @@
add_executable(testtests experiments/example-test.cpp)
target_link_libraries(testtests PRIVATE Catch2::Catch2WithMain)
# Firmware modules tests
file(GLOB_RECURSE FWMODULES_SOURCES
"${CMAKE_SOURCE_DIR}/floatpump/Modules/*.cpp"
)
add_executable(fwmodules
${FWMODULES_SOURCES}
modules.cpp
)
target_include_directories(fwmodules PUBLIC
${CMAKE_SOURCE_DIR}/floatpump/Modules
)
target_link_libraries(fwmodules PRIVATE Catch2::Catch2WithMain)
# General catch configuration
include(CTest)
include(Catch)

18
Tests/modules.cpp Normal file
View File

@ -0,0 +1,18 @@
#include <catch2/catch_test_macros.hpp>
#include "filter_fir_crude.h"
TEST_CASE("Filter Modules", "[filter]")
{
SECTION("FIR Filter Crude Implementation")
{
float coeffs[] = {1,1,1};
FilterFIRCrude filter1(coeffs, 3);
filter1.process(10);
filter1.process(10);
auto res = filter1.process(10);
REQUIRE(res == 10);
}
}

View File

@ -0,0 +1,30 @@
#include "filter_fir_crude.h"
FilterFIRCrude::FilterFIRCrude(const float* coeffs, size_t numTaps) :
_coeffs(coeffs), _histsize(numTaps), _index(0)
{
_history = new float[_histsize];
std::memset(_history, 0 , numTaps*sizeof(float));
}
float FilterFIRCrude::process(float input)
{
_history[_index] = input;
float result = 0.0f;
size_t idx = _index;
for (size_t i = 0; i < _histsize; ++i)
{
result += _coeffs[i] * _history[idx];
if (idx == 0)
{
idx = _histsize - 1;
} else
{
--idx;
}
_index = (_index + 1) % _histsize;
}
return result;
}

View File

@ -0,0 +1,19 @@
#pragma once
#include <cstdint>
#include <cstring>
#include <cstddef>
class FilterFIRCrude
{
public:
FilterFIRCrude(const float* coeffs, size_t numTaps);
float process(float input);
private:
const float* _coeffs;
size_t _histsize;
float* _history;
size_t _index;
};