Browse Source

airspeed: Prevent the filter from overshooting into the negative airspeed range

sbg
Lorenz Meier 11 years ago
parent
commit
fc39af08a1
  1. 6
      src/drivers/meas_airspeed/meas_airspeed.cpp
  2. 7
      src/lib/mathlib/math/filter/LowPassFilter2p.cpp
  3. 20
      src/lib/mathlib/math/filter/LowPassFilter2p.hpp

6
src/drivers/meas_airspeed/meas_airspeed.cpp

@ -258,6 +258,12 @@ MEASAirspeed::collect() @@ -258,6 +258,12 @@ MEASAirspeed::collect()
report.temperature = temperature;
report.differential_pressure_pa = diff_press_pa;
report.differential_pressure_filtered_pa = _filter.apply(diff_press_pa);
/* the dynamics of the filter can make it overshoot into the negative range */
if (report.differential_pressure_filtered_pa < 0.0f) {
report.differential_pressure_filtered_pa = _filter.reset(diff_press_pa);
}
report.differential_pressure_raw_pa = diff_press_pa_raw;
report.voltage = 0;
report.max_differential_pressure_pa = _max_differential_pressure_pa;

7
src/lib/mathlib/math/filter/LowPassFilter2p.cpp

@ -69,7 +69,7 @@ float LowPassFilter2p::apply(float sample) @@ -69,7 +69,7 @@ float LowPassFilter2p::apply(float sample)
// do the filtering
float delay_element_0 = sample - _delay_element_1 * _a1 - _delay_element_2 * _a2;
if (isnan(delay_element_0) || isinf(delay_element_0)) {
// don't allow bad values to propogate via the filter
// don't allow bad values to propagate via the filter
delay_element_0 = sample;
}
float output = delay_element_0 * _b0 + _delay_element_1 * _b1 + _delay_element_2 * _b2;
@ -81,5 +81,10 @@ float LowPassFilter2p::apply(float sample) @@ -81,5 +81,10 @@ float LowPassFilter2p::apply(float sample)
return output;
}
float LowPassFilter2p::reset(float sample) {
_delay_element_1 = _delay_element_2 = sample;
return apply(sample);
}
} // namespace math

20
src/lib/mathlib/math/filter/LowPassFilter2p.hpp

@ -52,18 +52,30 @@ public: @@ -52,18 +52,30 @@ public:
_delay_element_1 = _delay_element_2 = 0;
}
// change parameters
/**
* Change filter parameters
*/
void set_cutoff_frequency(float sample_freq, float cutoff_freq);
// apply - Add a new raw value to the filter
// and retrieve the filtered result
/**
* Add a new raw value to the filter
*
* @return retrieve the filtered result
*/
float apply(float sample);
// return the cutoff frequency
/**
* Return the cutoff frequency
*/
float get_cutoff_freq(void) const {
return _cutoff_freq;
}
/**
* Reset the filter state to this value
*/
float reset(float sample);
private:
float _cutoff_freq;
float _a1;

Loading…
Cancel
Save