simple crude fir filter
This commit is contained in:
parent
c91a78a91d
commit
c33d644fb0
@ -3,6 +3,25 @@
|
|||||||
add_executable(testtests experiments/example-test.cpp)
|
add_executable(testtests experiments/example-test.cpp)
|
||||||
target_link_libraries(testtests PRIVATE Catch2::Catch2WithMain)
|
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
|
# General catch configuration
|
||||||
include(CTest)
|
include(CTest)
|
||||||
include(Catch)
|
include(Catch)
|
||||||
|
18
Tests/modules.cpp
Normal file
18
Tests/modules.cpp
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
30
floatpump/Modules/filter_fir_crude.cpp
Normal file
30
floatpump/Modules/filter_fir_crude.cpp
Normal 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;
|
||||||
|
}
|
||||||
|
|
19
floatpump/Modules/filter_fir_crude.h
Normal file
19
floatpump/Modules/filter_fir_crude.h
Normal 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;
|
||||||
|
};
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user