|
@@ -0,0 +1,37 @@
|
|
|
+/**
|
|
|
+ * Quick and simple digital filters for smoothing and DC removal
|
|
|
+ * https://kleinembedded.com/quick-and-simple-digital-filters-for-smoothing-and-dc-removal/
|
|
|
+ */
|
|
|
+#ifndef KLEINLIBC_DC_BLOCKER_H
|
|
|
+#define KLEINLIBC_DC_BLOCKER_H
|
|
|
+
|
|
|
+typedef struct
|
|
|
+{
|
|
|
+ float blocking_factor;
|
|
|
+ float gain;
|
|
|
+ float prev_input;
|
|
|
+ float prev_output;
|
|
|
+} dc_blocker_t;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Initialize the DC blocker.
|
|
|
+ *
|
|
|
+ * @param handle Pointer to an instance of `dc_blocker_t`.
|
|
|
+ * @param blocking_factor A floating point number between 0 and 1 that
|
|
|
+ * determines how close to DC the cutoff frequency should be. A value close to (but less than)
|
|
|
+ * 1 will result in a cutoff frequency very close to DC but with a slow response.
|
|
|
+ * Setting the blocking factor lower will result in a faster response but will attenuate more
|
|
|
+ * low frequency content. A value between 0.9 and 1 is reasonably in most cases.
|
|
|
+ */
|
|
|
+void dc_blocker_init(dc_blocker_t *handle, float blocking_factor);
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Process the next input value.
|
|
|
+ *
|
|
|
+ * @param handle Pointer to an instance of `dc_blocker_t`.
|
|
|
+ * @param current_input The input value to process.
|
|
|
+ * @return float The filtered output value.
|
|
|
+ */
|
|
|
+float dc_blocker_process(dc_blocker_t *handle, float current_input);
|
|
|
+
|
|
|
+#endif
|