A FreeRTOS-powered through-wall life detection radar with real-time vital sign extraction, distance estimation, and a tactical LAN dashboard.
- Overview
- Key Applications
- System Architecture
- Hardware Architecture
- FreeRTOS Task Architecture
- Signal Processing Pipeline
- Dynamic Auto-Calibration
- Distance Estimation
- Tactical LAN Dashboard
- Communication Protocol
- Screenshots & Visual Documentation
- Repository Structure
- Getting Started
- Development Tools
- License
Project H.A.W.K. is an RTOS-based embedded system engineered for non-line-of-sight (NLOS) human detection using microwave Doppler radar. The system penetrates solid obstacles — drywall, rubble, wood, and smoke — to detect physiological micro-movements: breathing (0.2–0.6 Hz) and heartbeat (1.0–2.5 Hz).
Built on an ESP32 dual-core processor running FreeRTOS, the architecture guarantees deterministic timing and real-time preemptive multitasking across four concurrent tasks. A 1024-point FFT pipeline with parabolic interpolation provides sub-bin frequency accuracy for vital sign extraction. A 15-second auto-calibration sequence dynamically learns the environmental noise floor on every boot using 75th-percentile statistical analysis for outlier resilience, and all telemetry is streamed over WebSocket to a tactical browser-based dashboard accessible from any device on the local network.
- Through-wall human detection via 10.525 GHz microwave Doppler radar
- Dual-band vital sign extraction — breathing rate (BPM) and heart rate (BPM)
- Distance estimation — estimates target range using empirical signal magnitude decay
- Dynamic auto-calibration — 75th-percentile noise floor analysis, resilient to boot-time interference
- Confidence-based detection — 5-step ramp-up with gentle decay (−1) for reliable slow-breather detection
- Fast re-acquisition — post-alert confidence starts at 3/5, requiring only ~8s to re-confirm
- Real-time tactical dashboard — WebSocket-based, military-themed, with live charts, BPM display, range estimation, and signal strength monitoring
| Domain | Use Case |
|---|---|
| Tactical & Defense | Urban warfare situational awareness — detect human presence behind walls before room entry, hostage rescue, and tactical reconnaissance. |
| Search & Rescue | Locate survivors trapped under earthquake debris or collapsed structures by detecting faint vital signs through rubble. |
| Advanced Security | Covert perimeter monitoring and intrusion detection in zero-visibility environments (smoke, darkness, fog). |
| Medical Monitoring | Non-contact vital sign monitoring in isolation wards or hazardous environments. |
+-----------------------------------------------------------------------------+
| PROJECT H.A.W.K. -- SYSTEM OVERVIEW |
+-----------------------------------------------------------------------------+
| |
| +--------------+ +--------------+ +----------------------------+ |
| | HB100/CDM324 | | Active BPF | | ESP32 (Dual-Core) | |
| | Doppler |--->| 0.1-3.0 Hz |--->| FreeRTOS Kernel | |
| | Radar | IF | Op-Amp | ADC| | |
| | 10.525 GHz | | Circuit | | +------------------------+ | |
| +--------------+ +--------------+ | | T1: Radar Sampling | | |
| | | 250 Hz (P4) | | |
| | +------------------------+ | |
| | | T2: 1024-pt FFT | | |
| +--------------------------------------+| | Pipeline (P3) | | |
| | TACTICAL LAN DASHBOARD || +------------------------+ | |
| | +--------+ +--------+ +------------+ || | T3: Detection & | | |
| | | Vital | | Range | | Event | |<-| Calibration (P2) | | |
| | | Charts | | & BPM | | Log | || +------------------------+ | |
| | +--------+ +--------+ +------------+ || | T4: WebSocket & | | |
| | WebSocket on ws://<ESP32_IP>:81 || | Alarms (P1) | | |
| +--------------------------------------+| +------------------------+ | |
| +----------------------------+ |
+-----------------------------------------------------------------------------+
| Component | Specification | Purpose |
|---|---|---|
| Microcontroller | ESP32 DevKit (32-bit, Dual-Core Xtensa LX6, 240 MHz) | FreeRTOS host, ADC sampling, WiFi/WebSocket server |
| Radar Sensor | HB100 (10.525 GHz) / CDM324 (24 GHz) Microwave Doppler | Emits CW microwave; IF output encodes target micro-motion |
| Signal Conditioning | Custom 2-stage Active Bandpass Filter (LM358 Op-Amp) | Passband: 0.1–3.0 Hz — isolates human vitals, rejects mechanical noise |
| ADC Interface | ESP32 12-bit SAR ADC (GPIO 34) | 0–4095 counts at 250 Hz deterministic sampling |
| Alert Output | Active Buzzer (GPIO 25) + LED Indicator (GPIO 2) | 1.5-second local hardware alarm on confirmed detection |
| Dashboard | Any browser on the LAN | Real-time tactical display via WebSocket (ws://<IP>:81) |
| Signal | GPIO | Direction |
|---|---|---|
| Radar ADC (Bandpass Filter Output) | 34 |
Input (Analog) |
| Active Buzzer | 25 |
Output (Digital) |
| Status LED | 2 |
Output (Digital) |
The system employs a preemptive priority-based RTOS scheduler with four concurrent tasks communicating through FreeRTOS Queues and Semaphores. The Arduino loop() is immediately deleted to free CPU cycles for the RTOS kernel.
| # | Task | Priority | Stack | Function | IPC Mechanism |
|---|---|---|---|---|---|
| T1 | Radar Acquisition | 4 (Highest) | 2 KB | 250 Hz deterministic ADC sampling via vTaskDelayUntil() |
Produces → rawDataQueue (2048 × uint16_t) |
| T2 | Signal Processing | 3 | 8 KB | 1024-point FFT (DC removal → Hamming window → FFT → Magnitude → Sub-band peak detection) | Consumes rawDataQueue → Produces → processedDataQueue (8 × VitalSignData) |
| T3 | Detection & Calibration | 2 | 4 KB | Auto-calibration (15 s, 75th-percentile) + confidence algorithm + distance estimation + BPM conversion | Consumes processedDataQueue → Produces → dashboardQueue + detectionSemaphore |
| T4 | Communications & UI | 1 (Lowest) | 8 KB | WebSocket broadcast at ~20 Hz loop, buzzer/LED alarm with 1.5s auto-reset | Consumes dashboardQueue / detectionSemaphore |
rawDataQueue processedDataQueue dashboardQueue
(2048 slots) (8 slots) (4 slots)
| | |
T1 --->|--> T2 ----------------->|--> T3 ------------------>|--> T4 --> WebSocket
(250 Hz) (1024-pt FFT) (Calibration + (Broadcast +
Confidence + Buzzer/LED)
Distance Est.)
|
v
detectionSemaphore
(Binary)
Each FFT cycle processes 1024 samples collected over ~4.1 seconds at 250 Hz, yielding a frequency resolution of 0.2441 Hz/bin.
- DC Removal — Strips the ADC bias offset to center the waveform at zero.
- Hamming Windowing — Reduces spectral leakage at bin boundaries.
- 1024-Point FFT — Full complex FFT using
float(notdouble) to leverage the ESP32's hardware single-precision FPU (~30 ms vs ~300 ms on double). - Magnitude Extraction —
complexToMagnitude()converts complex bins to real magnitudes. - Dual Sub-Band Peak Detection — Independent peak search with parabolic interpolation for sub-bin frequency accuracy:
| Vital Sign | Frequency Band | FFT Bin Range | Resolution |
|---|---|---|---|
| Breathing | 0.20 – 0.60 Hz | Bins 1–2 | ±0.12 Hz |
| Heartbeat | 1.00 – 2.50 Hz | Bins 4–10 | ±0.12 Hz |
- BPM Conversion — Detected frequencies are converted to beats/breaths per minute (
freq × 60).
floatoverdouble: The ESP32's FPU is single-precision only. Usingdoubleforces software emulation at ~10x the compute cost — unacceptable for a real-time system.staticarrays: The 8 KB FFT buffers (vReal[1024],vImag[1024]) are declaredstaticto place them in BSS rather than on the task stack, preventing stack overflow.- DC-safe bin clamping: Bin 0 (DC component) is always excluded from peak search, and parabolic interpolation results are clamped to the safe band range to prevent negative-frequency artifacts.
Instead of a hardcoded noise threshold, the system performs a 15-second environmental calibration on every boot using 75th-percentile statistical analysis for outlier resilience.
BOOT --> STATE_CALIBRATING (15s) --> STATE_ACTIVE
| |
| Record peak FFT magnitude | Use dynamic threshold:
| for each FFT cycle into | activeThreshold =
| a circular buffer | P75(noise) x 1.5
| |
| Compute 75th percentile | Confidence algorithm
| (resilient to outliers) | fully operational
| |
v v
Dashboard shows Dashboard shows
amber CALIBRATION full tactical view
overlay with with live charts,
progress bar BPM, and distance
| Parameter | Value | Purpose |
|---|---|---|
CALIBRATION_DURATION_MS |
15000 ms | Window for noise floor measurement |
SAFETY_MARGIN |
1.5x | Multiplier applied to 75th-percentile noise magnitude |
FALLBACK_THRESHOLD |
50.0 | Used if calibration sees zero signal (dead ADC) |
REQUIRED_CONFIDENCE |
5 | Consecutive positive readings needed for alert |
CONFIDENCE_DECAY |
1 | Per-cycle decay on negative readings (gentle — supports slow breathers) |
POST_ALERT_CONFIDENCE |
3 | Confidence level after alert (fast re-acquisition in ~8s) |
The calibration phase uses xTaskGetTickCount() comparisons — no delay() calls — so the Detection Task continues consuming the processedDataQueue and feeding telemetry to the dashboard throughout the entire calibration window.
The original design tracked the absolute peak noise magnitude during calibration. This was vulnerable to poisoning — if a person stood near the sensor during boot, their vital signs would inflate the peak, making the threshold unreachably high. The 75th percentile approach uses std::sort on a buffer of calibration samples and selects the value at the 75% mark. This rejects the top 25% of readings (likely outliers) while still capturing the true noise floor.
The HB100 is a CW (Continuous Wave) radar and cannot perform time-of-flight ranging like FMCW radar. However, empirical measurements show that FFT signal magnitude decays predictably with distance, following an inverse power law:
magnitude ≈ A / (distance ^ n)
By inverting this relationship:
distance ≈ (A / net_magnitude) ^ (1/n)
Where:
A = 0.55(amplitude coefficient, fitted from empirical data through drywall)n = 1.8(decay exponent)net_magnitude = measured_magnitude - noise_floor
| Distance (m) | Measured Magnitude | Detection Status |
|---|---|---|
| 0.5 | 0.97 | ✅ Strong |
| 1.0 | 0.68 | ✅ Strong |
| 1.5 | 0.33 | ✅ Moderate |
| 2.0 | 0.27 | ✅ Weak |
| 2.5 | 0.12 | ⚠ At noise floor |
| 3.0 | 0.05 | ❌ Below noise floor |
- Distance estimates are signal-strength-based approximations, not precise measurements
- Accuracy varies with barrier material (drywall vs. brick vs. plywood)
- The
Aandnconstants should be recalibrated for your specific environment - Reports
N/Awhen signal is too weak for meaningful estimation
A military-themed, browser-based monitoring console that connects to the ESP32 via WebSocket on port 81. No server, no cloud — just open index.html from any device on the same LAN.
| Feature | Description |
|---|---|
| Connection Overlay | Full-screen animated radar sweep with live reconnect countdown |
| IP Configuration | Setup screen to enter the ESP32's IP address before connecting |
| Calibration Overlay | Amber warning overlay with progress bar and countdown timer during the 15s noise floor analysis |
| Threat Assessment | Real-time status panel — transitions from green MONITORING to red-alert HUMAN DETECTED with flashing vignette |
| Confidence Gauge | 5-bar visual gauge (green to amber to red) with labels: NO SIGNAL, WEAK, TRACKING, ACQUIRING, LOCKED, CONFIRMED |
| Vital Sign Charts | Dual Chart.js line graphs — Breathing (0.2-0.6 Hz, cyan) and Heartbeat (1.0-2.5 Hz, magenta) — scrolling 30-point window |
| Vital Signs (BPM) | Real-time breathing rate and heart rate displayed in beats/breaths per minute |
| Estimated Range | Approximate distance to the detected human target (meters) |
| Noise Floor Monitor | Current noise floor magnitude for environmental diagnostics |
| Detection Duration | Timer showing how long a human has been continuously detected |
| Signal Strength | Raw FFT magnitude of the strongest vital-sign peak |
| System Metrics | Total alerts, current breathing Hz, current heartbeat Hz, last alert timestamp |
| Event Log | Scrolling console with timestamped telemetry, system events, and alerts (max 150 entries) |
| Audio Alert | Web Audio API tactical 3-tone square-wave alarm on human detection |
| Auto-Reconnect | Automatic WebSocket recovery with visual countdown on connection loss |
| Layer | Technology |
|---|---|
| Structure | Semantic HTML5 |
| Styling | Vanilla CSS — glassmorphism, CSS custom properties, CRT scan-line overlay |
| Typography | Orbitron (display) + JetBrains Mono (data) via Google Fonts |
| Charts | Chart.js 4.4.7 (CDN) |
| Data Transport | Native WebSocket API, ws://<ESP32_IP>:81 |
All telemetry is transmitted exclusively over WebSocket (Serial output is disabled in production firmware to eliminate UART jitter in the time-critical 250 Hz sampling loop).
| Message Type | Format | Direction |
|---|---|---|
| Handshake | $HAWK,STATUS,CONNECTED |
ESP32 to Dashboard |
| Telemetry | $HAWK,DATA,<breathFreq>,<heartFreq>,<breathMag>,<heartMag>,<confidence>,<maxConf>,<timestamp>,<state>,<breathBPM>,<heartBPM>,<estRange>,<noiseFloor>,<detectDur> |
ESP32 to Dashboard |
| Alert | $HAWK,ALERT,HUMAN_DETECTED,TIME:<ms_timestamp> |
ESP32 to Dashboard |
| Field | Type | Description |
|---|---|---|
breathFreq |
float |
Dominant frequency in breathing band (Hz) |
heartFreq |
float |
Dominant frequency in heartbeat band (Hz) |
breathMag |
float |
FFT magnitude of breathing peak (signal strength) |
heartMag |
float |
FFT magnitude of heartbeat peak (signal strength) |
confidence |
int |
Current detection confidence (0 to maxConf) |
maxConf |
int |
Required confidence threshold for alert trigger |
timestamp |
ulong |
ESP32 millis() uptime |
state |
string |
CALIBRATING or ACTIVE |
breathBPM |
float |
Breathing rate in breaths per minute |
heartBPM |
float |
Heart rate in beats per minute |
estRange |
float |
Estimated distance to target in meters (-1 = unknown) |
noiseFloor |
float |
Current noise floor magnitude |
detectDur |
ulong |
Duration of continuous detection (milliseconds) |
Hierarchical tree diagram showing the 5 major subsystems of H.A.W.K.: Target Environment (human subject behind non-metallic barrier), Microwave Doppler Radar (10.525 GHz CW transmission, phase-shifted reflections, raw IF signal), Analog Signal Conditioning Circuit (LM358 dual op-amp, active bandpass filter, amplification & 1.65V DC bias), Microcontroller Processing (ESP32 with FreeRTOS — ADC sampling, 1024-pt FFT, peak detection, confidence algorithm), and Output & Telemetry (local buzzer/LED alarms, WebSocket server, tactical dashboard).
Physical lab setup showing the complete H.A.W.K. system in operation. The ESP32 development board is visible on the breadboard (left), connected to the HB100 radar module (green PCB, right) through the op-amp signal conditioning circuit with jumper wires. The H.A.W.K. tactical dashboard is running live on the laptop in the background, displaying real-time breathing and heartbeat frequency charts, confidence gauge, and the scrolling event log.
Complete 2-stage active bandpass filter designed in LTspice using dual op-amps (U1, U2). Stage 1: C1 (150 µF) + R3 (10 kΩ) high-pass input → U1 with R4 (1 MΩ) ‖ C2 (0.047 µF) feedback. Stage 2: C3 (150 µF) + R5 (10 kΩ) → U2 with R6 (1 MΩ) ‖ C4 (0.047 µF) feedback. DC bias at 1.65V via R1/R2 (10 kΩ/10 kΩ) voltage divider from V3 (3.3V). Input source: SINE(0 100µ 0.3) simulating the HB100 IF signal. Output labeled "ESP32" connects to GPIO 34.
Bode magnitude plot from LTspice AC analysis (.ac dec 100 0.01 10) showing the dual-stage filter's frequency response. The shaded passband spans 0.1 Hz (HPF cutoff) to 3.0 Hz (LPF cutoff) with a peak gain of approximately 78 dB near 0.5 Hz. The response rolls off cleanly on both sides, confirming the filter correctly isolates the human vital-sign frequency range while rejecting DC drift and high-frequency mechanical noise.
Dual-panel MATLAB plot. Top: Live baseband signal in the time domain showing 10 seconds of raw ADC voltage centered at ~2.12V (DC bias from the op-amp circuit) with visible micro-amplitude modulations caused by human breathing. Bottom: Extracted vital signs via FFT in the frequency domain (0–3 Hz) with the breathing peak annotated at 0.20 Hz (red circle), confirming successful vital sign extraction from the radar signal.
MATLAB plot of inter-sample intervals across ~500 samples (sample indices ~25,385–25,434). The flat line at exactly 4.0 ms confirms the FreeRTOS vTaskDelayUntil() mechanism achieves perfect deterministic timing at 250 Hz with zero jitter — critical for accurate FFT frequency resolution.
MATLAB plot illustrating the full calibration-to-detection lifecycle. The shaded region (0–15 s) shows the calibration phase where peak noise magnitude is tracked (~18 units). At t = 15 s (dashed line), calibration ends and the dynamic threshold (θ_active = P75(noise) × 1.5 ≈ 27) is locked. Post-calibration, detected peak magnitudes jump to 70–90 units, clearly exceeding the threshold, demonstrating successful human detection. The label "ACTIVE (HUMAN DETECTED)" marks the operational phase.
MATLAB-generated dual-panel plot showing real-time vital sign extraction over a ~2-minute window. Top panel: Breathing frequency (0.2–0.5 Hz band) showing a characteristic baseline around 0.24 Hz with periodic spikes to ~0.49 Hz indicating active respiration cycles. Bottom panel: Heartbeat frequency (1.0–2.5 Hz band) showing oscillating peaks between 0.97 Hz and 2.44 Hz, demonstrating successful dual-band vital sign separation.
Empirical measurement of breathing signal FFT peak magnitude as a function of distance from the radar sensor (through 12.5 mm drywall). Signal decays from ~0.97 at 0.5 m to ~0.05 at 3.0 m. The mean noise floor (dashed line at ~0.15) intersects the signal curve at approximately 2.5 m (circled), defining the maximum practical detection range through drywall for breathing detection. This data is used to calibrate the power-law distance estimation model.
Bar chart comparing normalized FFT peak magnitudes across 4 barrier types: Line of Sight (0.98), Drywall / 12.5 mm (0.74), Plywood / 18 mm (0.49), and Brick / 15 cm (0.17). Error bars show measurement variance across multiple trials. Demonstrates the radar's through-wall capability with quantified signal attenuation per material type.
WaveDrom-generated timing diagram illustrating FreeRTOS task scheduling and IPC queue interactions. Shows T1 (Acquisition, P4) running ADC samples at highest priority, T2 (Processing, P3) running FFT batches, T3 (Detection, P2) evaluating confidence, and T4 (UI, P1) broadcasting WebSocket packets. Below, the IPC queues (rawQ, procQ, dashQ) show data flow pulses between tasks. Priority order: P4 > P3 > P2 > P1.
H.A.W.K/
|
+-- ESP32/ # Embedded firmware (Arduino/FreeRTOS)
| +-- ESP32.ino # Entry point -- Queue/Semaphore creation, WiFi init, task launch
| +-- globals.h # Pin definitions, SystemState enum, VitalSignData struct, RTOS handles
| +-- radar_sensor.cpp / .h # T1: 250 Hz deterministic ADC sampling task
| +-- signal_processing.cpp / .h # T2: 1024-pt FFT pipeline with dual sub-band peak detection
| +-- detection.cpp / .h # T3: Auto-calibration (75th percentile) + confidence + distance estimation + BPM
| +-- comms_ui.cpp / .h # T4: WiFi/WebSocket server, $HAWK protocol (v2), buzzer/LED alarms
|
+-- Dashboard/ # Browser-based tactical monitoring console
| +-- index.html # Semantic HTML5 structure with all overlay layers + extended metrics
| +-- styles.css # Full design system -- dark theme, glassmorphism, animations
| +-- app.js # WebSocket client, Chart.js graphs, v2 telemetry parser, BPM/range display
|
+-- LTspice/ # Analog circuit simulation files
| +-- HB100-ESP32.asc # LTspice schematic -- 2-stage active bandpass filter (LM358)
| +-- HB100-ESP32.raw / .log # Simulation output data
|
+-- Oscilloscope/ # Hardware debug utility
| +-- Oscilloscope.ino # ESP32 Serial Plotter sketch -- ADC signal, DC bias, min/max/mean stats
|
+-- Screenshots/ # Visual documentation
| +-- block.png # System block diagram
| +-- hardware.jpg # Hardware prototype photo
| +-- ltspice.png # LTspice amplifier circuit schematic
| +-- filter.png # Bandpass filter Bode plot
| +-- matlab.jpg # MATLAB time-domain + FFT analysis
| +-- adc_sampling.png # ADC sampling determinism verification
| +-- calib.png # Calibration & target acquisition graph
| +-- dash.png # Dashboard vital sign telemetry
| +-- magdis.png # Signal magnitude vs. distance plot
| +-- streng.png # Barrier material degradation chart
| +-- wavedrom.png # RTOS scheduling timeline
|
+-- LICENSE # MIT License
+-- README.md # This file
Hardware
| Component | Quantity | Notes |
|---|---|---|
| ESP32 Development Board | 1 | Any variant with ADC-capable GPIO 34 |
| HB100 or CDM324 Radar Module | 1 | 10.525 GHz or 24 GHz Doppler |
| Op-Amp (e.g., LM358 / MCP6002) | 1–2 | For active bandpass filter stages |
| Resistors & Capacitors | As per filter design | See LTspice schematic for values |
| Active Buzzer | 1 | 3.3V compatible |
| LED | 1 | With appropriate current-limiting resistor |
Software
| Tool | Version |
|---|---|
| Arduino IDE | 2.x+ (or PlatformIO) |
| ESP32 Board Package | Latest via Board Manager |
arduinoFFT library |
v2.0.0+ by Kosme |
WebSockets library |
By Markus Sattler (Links2004) |
git clone https://github.com/chandansaipavanpadala/H.A.W.K-HumanActivityDetectionThroughWallsUsingMicrowaveKinetics.git
cd H.A.W.K-HumanActivityDetectionThroughWallsUsingMicrowaveKinetics| Signal | Connect To | ESP32 GPIO |
|---|---|---|
| Bandpass Filter Output | RADAR_ADC_PIN |
34 |
| Active Buzzer (+) | BUZZER_PIN |
25 |
| Status LED (Anode) | LED_PIN |
2 |
Tip: Use the
LTspice/HB100-ESP32.ascschematic as a reference for the analog filter circuit design.
Open ESP32/comms_ui.h and update:
#define WIFI_SSID "YourNetworkName"
#define WIFI_PASSWORD "YourPassword"⚠ Security: Never commit real WiFi credentials to a public repository. Consider using environment variables or a
.gitignored config file.
- Open
ESP32/ESP32.inoin Arduino IDE. - Select your ESP32 board model and COM port.
- Install required libraries (
arduinoFFT,WebSockets) via Library Manager. - Compile and upload the firmware.
- After flashing, note the ESP32's IP address from your router's DHCP table.
- Open
Dashboard/index.htmlin any modern browser on the same LAN. - Enter the ESP32's IP address in the setup screen and click INITIALIZE UPLINK.
- On boot, the dashboard will show a cyan radar-sweep loading overlay while connecting.
- Once connected, the amber calibration overlay appears for 15 seconds — stand clear of the sensor.
- After calibration, the full tactical dashboard activates with live charts, BPM display, and range estimation.
- Introduce a target subject in front of the radar — monitor the confidence gauge ramp from
NO SIGNALtoCONFIRMED. - Upon confirmed detection: RED ALERT flashes, buzzer sounds, and the
$HAWK,ALERTpacket is broadcast. - Check the Extended Metrics row for real-time breathing BPM, heart BPM, estimated range, and detection duration.
The Oscilloscope/Oscilloscope.ino sketch streams raw ADC values at 250 Hz to the Arduino Serial Plotter for hardware debugging:
- Verify the DC bias from the op-amp circuit (expected ~1.65V from voltage divider; actual may vary)
- Confirm the ADC signal is centered and not clipping at 0V or 3.3V
- Validate the radar module is producing a clean IF signal
- Automatic voltage statistics every 5 seconds: DC bias (mean), min, max, peak-to-peak swing, and clipping warnings
Tools -> Serial Plotter -> 115200 baud
The LTspice/ directory contains the complete active bandpass filter schematic (HB100-ESP32.asc). Use LTspice to simulate and verify the filter response before building the physical circuit.
This project is licensed under the MIT License — see the LICENSE file for details.
Copyright 2026 Chandan Sai Pavan Padala
Built for the Real-Time Operating Systems course — Amrita Vishwa Vidyapeetham
Project H.A.W.K. — Because every second counts when lives are behind walls.










