/** * @file LPF.h * @brief implements four FIR low-pass filters * @details Finite length LPF
1) Size is the depth 2 to 16
2) y(n) = (sum(x(n)+x(n-1)+...+x(n-size-1))/size
3) To use a filter
a) initialize it once
b) call the filter at the sampling rate
* @version from TI-RSLK MAX v1.1 * @author Daniel Valvano and Jonathan Valvano * @copyright Copyright 2020 by Jonathan W. Valvano, valvano@mail.utexas.edu, * @warning AS-IS * @note For more information see http://users.ece.utexas.edu/~valvano/ * @date January 15, 2020 ******************************************************************************/ /* This example accompanies the books "Embedded Systems: Introduction to ARM Cortex M Microcontrollers", ISBN: 978-1469998749, Jonathan Valvano, copyright (c) 2020 "Embedded Systems: Real Time Interfacing to ARM Cortex M Microcontrollers", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2020 "Embedded Systems: Real-Time Operating Systems for ARM Cortex-M Microcontrollers", ISBN: 978-1466468863, Jonathan Valvano, copyright (c) 2020 Copyright 2020 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ #include /** * Newton's method sqrt * @param s is an integer * @return sqrt(s) is an integer * @brief square root */ uint32_t sqrt2(uint32_t s); /** * Initialize first LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize first LPF */ void LPF_Init(int32_t initial, int32_t size); /** * First LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc(int32_t newdata); int32_t Noise1(void); /** * Initialize second LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize second LPF */ void LPF_Init2(int32_t initial, int32_t size); /** * Second LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc2(int32_t newdata); int32_t Noise2(void); /** * Initialize third LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize third LPF */ void LPF_Init3(int32_t initial, int32_t size); /** * Third LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc3(int32_t newdata); int32_t Noise3(void); /** * Initialize fourth LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize third LPF */ void LPF_Init4(int32_t initial, int32_t size); /** * Fourth LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc4(int32_t newdata); int32_t Noise4(void); /** * Initialize fifth LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize fifth LPF */ void LPF_Init5(int32_t initial, int32_t size); /** * fifth LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc5(int32_t newdata); int32_t Noise5(void); /** * Initialize Sixth LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize Sixth LPF */ void LPF_Init6(int32_t initial, int32_t size); /** * Sixth LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc6(int32_t newdata); int32_t Noise6(void); /** * Initialize Seventh LPF
* Set all data to an initial value
* @param initial value to preload into MACQ * @param size depth of the filter, 2 to 16 * @return none * @brief Initialize Seventh LPF */ void LPF_Init7(int32_t initial, int32_t size); /** * Seventh LPF, calculate one filter output
* Called at sampling rate * @param newdata new ADC data * @return result filter output * @brief FIR low pass filter */ int32_t LPF_Calc7(int32_t newdata); int32_t Noise7(void); /** * 3-wide non recursive Median filter
* Called with new data at sampling rate * @param newdata new ADC data * @return result filter output * @brief Median filter */ int32_t Median(int32_t newdata); /** * 5-wide non recursive Median filter
* Called with new data at sampling rate * @param newdata new ADC data * @return result filter output * @brief Median filter */ int32_t Median5(int32_t newdata); /** * 5-wide non recursive Median filter, second independent instance
* Uses separate internal arrays from Median5 — safe to call simultaneously. * @param newdata new ADC data * @return result filter output * @brief Median filter (second instance) */ int32_t Median5_2(int32_t newdata); /** * 7-wide non recursive Median filter
* Called with new data at sampling rate * @param newdata new ADC data * @return result filter output * @brief Median filter */ int32_t Median7(int32_t newdata); /** * 60-Hz notch high-Q, alpha=0.99, IIR filter, assuming fs=1000 Hz.
* y(n) = (256x(n) -503x(n-1) + 256x(n-2) + 498y(n-1)-251y(n-2))/256 (2k sampling)
* y(n) = (256x(n) -476x(n-1) + 256x(n-2) + 471y(n-1)-251y(n-2))/256 (1k sampling) * @param data new ADC data * @return result filter output * @brief 60-Hz notch high-Q, IIR filter */ int32_t Filter(int32_t data); /** * Independent second instance of the 60-Hz notch IIR filter
* Identical coefficients to Filter(), but separate internal state.
* Use for a second simultaneous signal (e.g. left IR sensor). * @param data new ADC data * @return result filter output * @brief 60-Hz notch high-Q, IIR filter (second instance) */ int32_t Filter2(int32_t data);