Sensor Signal Filtering
Design the signal chain from sensor output to reported value. Keep raw samples,
filtered values, timing, saturation, and fault flags observable; a filter must
not conceal a broken sensor or unsafe voltage.
Intake gate
Record or label unknowns before selecting a component or algorithm:
- exact board, MCU, core/framework, ADC channel, resolution, reference, input
range, acquisition time, and toolchain versions
- sensor part/module, output type and drive impedance, supply, cable length,
expected signal bandwidth, valid range, warm-up, and failure behavior
- sample period/jitter budget, acceptable latency, step-response requirement,
threshold policy, calibration model, and available measurement tools
Resolve the board with board-support before board-specific ADC advice. For
physical or multi-session work, load embedded-project-loop first and keep its
measurement gate open.
Workflow
- Capture raw samples at a stated, repeatable rate before filtering. Separate
sensor dynamics from spikes, aliasing, quantization, ADC settling, rail/
ground noise, EMI, and calibration error.
- Set the sampling rate from the signal bandwidth and latency budget. Check
Nyquist and alias attenuation; do not use a software filter to recover
information already aliased into the band.
- Choose one filter with an explicit window/alpha/model and calculate its
startup behavior, delay, memory, CPU cost, and effect on thresholds.
Common starting choices are moving-average for bounded windows, median for
isolated spikes, and EMA/IIR for low-cost smoothing; model-based filters
require a stated model and noise assumptions.
- Check the analog path: sensor loading, RC cutoff, ADC acquisition/settling,
reference and ground, cable/noise coupling, input protection, voltage
limits, decoupling, and motor/radio current return paths.
- Implement raw-plus-filtered telemetry and fault/saturation indicators.
Validate deterministic vectors on the host before target compilation.
- Change one causal variable per hardware iteration. Measure the ADC pin and
supply/ground with the same configuration used by the firmware.
Load on demand
- Read
references/filter-selection.md for
sampling math, algorithm tradeoffs, calibration order, and latency choices.
- Read
references/analog-front-end.md for
RC/input networks, ADC drive/settling, wiring, protection, and measurements.
- Read
references/verification-and-tdd.md
for host, simulation, build, target, and system gates.
- Use the diagnostic-only
examples/adc-filter-pipeline.ino
as a board-neutral fixed-rate EMA starting point; fill in board-specific ADC
assumptions before converting counts to volts. Reusable generated filtering
patterns remain owned by arduino-code-generator.
- Run the deterministic helper with
python3 scripts/filter_benchmark.py --help or a captured vector. It is a design/TDD
aid, not a replacement for target timing or electrical measurements.
The existing arduino-code-generator filtering pattern
owns reusable code snippets. This skill owns signal-chain diagnosis, filter
selection, hardware interaction, and evidence boundaries. Use
circuit-debugger for fault isolation, wiring-safety-check for logic and
rail limits, and sensor-calibration-workbench only after detection and signal
integrity are established.
Output contract
Use the shared Arduino skill contract:
state assumptions, required tools and versions, implementation steps,
tests/evidence, known limitations, and recovery/security notes.
- Build proof: host tests and an exact-board compile, if run.
- Upload proof: an uploader result for a named port/image, if run.
- Hardware proof: measured ADC pin, rail/ground, waveform, or wiring result.
- System proof: observed sensor behavior under the real load/environment.
- Deployment proof: field rollout, rollback, and maintenance evidence.
Never promote a passing host test, HTTP response, serial banner, or CI job to
hardware or system proof. If the board, sensor, circuit, or measurement is
unknown, stop at a bounded plan and name the next measurement.
1---2name: sensor-signal-filtering3description: Use when the main problem is a noisy or aliased analog/ADC signal and the task needs signal-chain diagnosis or filter-path selection across sampling, anti-aliasing, RC/input conditioning, ADC source impedance/settling, latency, startup, saturation, or raw/fault observability. Apply it when software filtering and hardware signal conditioning interact, even when the request only says that an analog sensor is unstable. Hand reusable Arduino snippets to arduino-code-generator, board facts to board-support, voltage/pin/rail safety to wiring-safety-check or circuit-debugger, and calibration after detection to sensor-calibration-workbench.4---5
6# Sensor Signal Filtering
7
8Design the signal chain from sensor output to reported value. Keep raw samples,
9filtered values, timing, saturation, and fault flags observable; a filter must
10not conceal a broken sensor or unsafe voltage.
11
12## Intake gate
13
14Record or label unknowns before selecting a component or algorithm:
15
16- exact board, MCU, core/framework, ADC channel, resolution, reference, input
17 range, acquisition time, and toolchain versions
18- sensor part/module, output type and drive impedance, supply, cable length,
19 expected signal bandwidth, valid range, warm-up, and failure behavior
20- sample period/jitter budget, acceptable latency, step-response requirement,
21 threshold policy, calibration model, and available measurement tools
22
23Resolve the board with `board-support` before board-specific ADC advice. For
24physical or multi-session work, load `embedded-project-loop` first and keep its
25measurement gate open.
26
27## Workflow
28
291. Capture raw samples at a stated, repeatable rate before filtering. Separate
30 sensor dynamics from spikes, aliasing, quantization, ADC settling, rail/
31 ground noise, EMI, and calibration error.
322. Set the sampling rate from the signal bandwidth and latency budget. Check
33 Nyquist and alias attenuation; do not use a software filter to recover
34 information already aliased into the band.
353. Choose one filter with an explicit window/alpha/model and calculate its
36 startup behavior, delay, memory, CPU cost, and effect on thresholds.
37 Common starting choices are moving-average for bounded windows, median for
38 isolated spikes, and EMA/IIR for low-cost smoothing; model-based filters
39 require a stated model and noise assumptions.
404. Check the analog path: sensor loading, RC cutoff, ADC acquisition/settling,
41 reference and ground, cable/noise coupling, input protection, voltage
42 limits, decoupling, and motor/radio current return paths.
435. Implement raw-plus-filtered telemetry and fault/saturation indicators.
44 Validate deterministic vectors on the host before target compilation.
456. Change one causal variable per hardware iteration. Measure the ADC pin and
46 supply/ground with the same configuration used by the firmware.
47
48## Load on demand
49
50- Read [`references/filter-selection.md`](references/filter-selection.md) for
51 sampling math, algorithm tradeoffs, calibration order, and latency choices.
52- Read [`references/analog-front-end.md`](references/analog-front-end.md) for
53 RC/input networks, ADC drive/settling, wiring, protection, and measurements.
54- Read [`references/verification-and-tdd.md`](references/verification-and-tdd.md)
55 for host, simulation, build, target, and system gates.
56- Use the diagnostic-only [`examples/adc-filter-pipeline.ino`](examples/adc-filter-pipeline.ino)
57 as a board-neutral fixed-rate EMA starting point; fill in board-specific ADC
58 assumptions before converting counts to volts. Reusable generated filtering
59 patterns remain owned by `arduino-code-generator`.
60- Run the deterministic helper with `python3
61 scripts/filter_benchmark.py --help` or a captured vector. It is a design/TDD
62 aid, not a replacement for target timing or electrical measurements.
63
64The existing [`arduino-code-generator` filtering pattern](../arduino-code-generator/references/patterns-filtering.md)
65owns reusable code snippets. This skill owns signal-chain diagnosis, filter
66selection, hardware interaction, and evidence boundaries. Use
67`circuit-debugger` for fault isolation, `wiring-safety-check` for logic and
68rail limits, and `sensor-calibration-workbench` only after detection and signal
69integrity are established.
70
71## Output contract
72
73Use the [shared Arduino skill contract](../../docs/arduino-skill-contract.md):
74state assumptions, required tools and versions, implementation steps,
75tests/evidence, known limitations, and recovery/security notes.
76
77- **Build proof:** host tests and an exact-board compile, if run.
78- **Upload proof:** an uploader result for a named port/image, if run.
79- **Hardware proof:** measured ADC pin, rail/ground, waveform, or wiring result.
80- **System proof:** observed sensor behavior under the real load/environment.
81- **Deployment proof:** field rollout, rollback, and maintenance evidence.
82
83Never promote a passing host test, HTTP response, serial banner, or CI job to
84hardware or system proof. If the board, sensor, circuit, or measurement is
85unknown, stop at a bounded plan and name the next measurement.