From 6fda5c31da75bc6d0e38d5a8d25bce1205bc35d8 Mon Sep 17 00:00:00 2001
From: Clyne Sullivan <clyne@bitgloo.com>
Date: Wed, 18 Nov 2020 12:43:21 -0500
Subject: gui: fix buffer size; add differentiator template

---
 gui/templates/5_iir_differentiator.cpp | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 gui/templates/5_iir_differentiator.cpp

(limited to 'gui/templates')

diff --git a/gui/templates/5_iir_differentiator.cpp b/gui/templates/5_iir_differentiator.cpp
new file mode 100644
index 0000000..f63bba9
--- /dev/null
+++ b/gui/templates/5_iir_differentiator.cpp
@@ -0,0 +1,28 @@
+/**
+ * 5_iir_differentiator.cpp
+ * Written by Clyne Sullivan.
+ *
+ * Does an IIR differentiation on the incoming signal, so that the output is representative of the
+ * rate of change of the input.
+ * A scaling factor is applied so that the output's form is more clearly visible.
+ */
+
+adcsample_t *process_data(adcsample_t *samples, unsigned int size)
+{
+    constexpr int scaling_factor = 4;
+    static adcsample_t prev = 2048;
+
+    // Compute the first output value using the saved sample.
+    samples[0] = 2048 + ((samples[0] - prev) * scaling_factor;
+    // Save the last sample for the next iteration.
+    prev = samples[size - 1];
+
+	for (unsigned int i = 1; i < size; i++) {
+        // Take the rate of change and scale it.
+        // 2048 is added as the output should be centered in the voltage range.
+		samples[i] = 2048 + ((samples[i] - samples[i - 1]) * scaling_factor);
+    }
+
+    return samples;
+}
+
-- 
cgit v1.2.3