/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#pragma once
#include
#include
#include
#include "NotchFilter.h"
/*
a filter that manages a set of notch filters targetted at a fundamental center frequency
and multiples of that fundamental frequency
*/
template
class HarmonicNotchFilter {
public:
~HarmonicNotchFilter();
// allocate a bank of notch filters for this harmonic notch filter
void allocate_filters(uint8_t harmonics);
// initialize the underlying filters using the provided filter parameters
void init(float sample_freq_hz, float center_freq_hz, float bandwidth_hz, float attenuation_dB);
// update the underlying filters' center frequencies using center_freq_hz as the fundamental
void update(float center_freq_hz);
// apply a sample to each of the underlying filters in turn
T apply(const T &sample);
// reset each of the underlying filters
void reset();
private:
// underlying bank of notch filters
NotchFilter* _filters;
// sample frequency for each filter
float _sample_freq_hz;
// attenuation for each filter
float _A;
// quality factor of each filter
float _Q;
// a bitmask of the harmonics to use
uint8_t _harmonics;
// number of allocated filters
uint8_t _num_filters;
// number of enabled filters
uint8_t _num_enabled_filters;
bool _initialised;
};
/*
harmonic notch filter configuration parameters
*/
class HarmonicNotchFilterParams : public NotchFilterParams {
public:
HarmonicNotchFilterParams(void);
// set the fundamental center frequency of the harmonic notch
void set_center_freq_hz(float center_freq) { _center_freq_hz.set(center_freq); }
// harmonics enabled on the harmonic notch
uint8_t harmonics(void) const { return _harmonics; }
// reference value of the harmonic notch
float reference(void) const { return _reference; }
static const struct AP_Param::GroupInfo var_info[];
private:
// notch harmonics
AP_Int8 _harmonics;
// notch reference value
AP_Float _reference;
};
typedef HarmonicNotchFilter HarmonicNotchFilterVector3f;