This is a very simple C++ implementation of a floating point FIR filter.
08 Aug 2022使用C++进的FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。因此,FIR滤波器在通信、图像处理、模式识别等领域 .
/*
This is a very simple C++ implementation of a floating point FIR filter.
*/
template <typename FloatType, int num_coeffs, const FloatType* coeffs>
class FirFilter {
public:
FirFilter():
current_index_(0) {
for(int i = 0; i < num_coeffs; ++i)
history_[i] = 0.0;
}
void put(FloatType value) {
history_[current_index_++] = value;
if(current_index_ == num_coeffs)
current_index_ = 0;
}
FloatType get() {
FloatType output = 0.0;
int index = current_index_;
for(int i = 0; i < num_coeffs; ++i) {
if(index != 0) {
--index;
} else {
index = num_coeffs - 1;
}
output += history_[index] * coeffs[i];
}
return output;
}
private:
FloatType history_[num_coeffs];
int current_index_;
};
/* This is a test program that shows how to use the FirFilter class. */
#include <iostream>
#include <assert.h>
#include <math.h>
#define FILTER1_LENGTH 4
float filter1_coeffs[FILTER1_LENGTH] = {
0.1,
0.2,
0.3,
0.4
};
bool approx_equal(float a, float b) {
return fabs(a-b) < 1e-6;
}
int main() {
FirFilter<float, FILTER1_LENGTH, filter1_coeffs> filter1;
filter1.put(10.0);
assert(approx_equal(filter1.get(), 1));
filter1.put(10.0);
assert(approx_equal(filter1.get(), 3));
filter1.put(10.0);
assert(approx_equal(filter1.get(), 6));
filter1.put(10.0);
assert(approx_equal(filter1.get(), 10));
filter1.put(0.0);
assert(approx_equal(filter1.get(), 9));
filter1.put(0.0);
assert(approx_equal(filter1.get(), 7));
filter1.put(0.0);
assert(approx_equal(filter1.get(), 4));
filter1.put(0.0);
assert(approx_equal(filter1.get(), 0));
std::cout << "Tests OK." << std::endl;
return 0;
}