A high-performance, dark-mode real-time Dual-Channel Multi-Regime Oscilloscope, Audio Spectrum Analyzer, Acoustic Analytics Engine, and Hardware-Accelerated Frequency Filter / IFFT Instrument running natively on PYNQ Linux platforms.
Features true simultaneous dual-ADC parallel sampling (AudioDashboard), Hilbert analytic envelopes, STFT waterfall spectrograms, real-time frequency-domain spectral filtering (HardwareFilter) with Hermitian symmetry ($k_{\text{eff}} = \min(k, N-k)$), calibrated 1:1 hardware IFFT reconstruction (ol.play_audio()).
This repository adopts the canonical PYNQ Custom Overlay pattern (OscilloscopeOverlay). It automatically pulls its compiled hardware bitstream and metadata from GitHub Releases (or loads local custom .bit builds) and encapsulates the 3-DMA stream receivers, AXI-Lite trigger registers, sequencer controls, dynamic decimators, spectral masking registers, and dual-wavegen into a unified Python object.
[ Analog Discovery 3 ] ββ(W1: Yellow)ββββββ> [ PYNQ-Z2 Pin A0 (Vaux1) ]
[ Wavegen ] ββ(W2: Yellow/White)β> [ PYNQ-Z2 Pin A1 (Vaux9) ]
[ OR ] β
[ MAX4466 Mics A0/A1 ] (XADC Dual Continuous Sequencer)
β β (1 MSPS Interleaved Stream, 0.00 Β΅s Skew)
(pydwf SDK) βΌ
β [ axis_trigger_unit IP ]
βΌ (Selectable Trigger Source: A0 / A1)
[ AD3SignalGenerator ] β (Gated Stream)
(Concurrent W1 & W2) βΌ
[ axis_decimator IP ]
(Programmable M = 1, 10, 20, 50 in PL)
β (Decimated Stream)
βΌ
[ tlast_generator (Programmable N) ]
β (w/ TLAST)
[ axis_broadcaster_0 ]
ββββββββββββββββ΄βββββββββββββββ
βΌ (Decimated Time Stream) βΌ (Interleaved Stream w/ TLAST)
[ AXI DMA 0 (Time) ] [ axis_channel_demux ]
β β (Clean A0 vs A1 Routing)
β βΌ
β [ xfft_0 Core (Forward FFT) ]
β β (Complex Re + j*Im)
β βΌ
β [ axis_spectral_mask ]
β (Hermitian Masking: k_eff = min(k, N-k))
β β
β [ axis_broadcaster_1 ]
β βββββββ΄ββββββ
β βΌ βΌ
β [ cordic_0 ] [ xfft_1 (IFFT) ]
β (Mag Engine) (Filtered Time)
β β β
βΌ βΌ βΌ
[ AXI DMA 0 (Time) ] [ AXI DMA 1 ] [ AXI DMA 2 ]
β β β
βββββββββββββββββββββββββΌββββββββββββ
βΌ (AXI SmartConnect HP0)
[ Processing System DDR ]
The system seamlessly reconfigures sampling rate, packet duration, and FFT resolution on the fly via ol.set_profile():
| Profile Name | Decimator ( |
Transform ( |
Sampling Rate ( |
Nyquist Bandwidth | Time Window ( |
Resolution ( |
Best Used For |
|---|---|---|---|---|---|---|---|
oscilloscope |
|
Function generators, high-speed pulses, logic edges | |||||
audio |
Full-spectrum music, instruments, acoustic speech | ||||||
speech |
Vocal formants, acoustic resonance | ||||||
bass_zoom |
Deep sub-bass ( |
Live 4-trace multi-domain instrument providing real-time hardware frequency filtering and IFFT reconstruction directly on the FPGA fabric:
- Interactive Frequency Cutoff Sliders: Real-time Lowpass, Highpass, Bandpass, and Notch cutoff tuning.
-
Quick Presets: Instant configuration for Sub-Bass (
$20-120,\text{Hz}$ ), Full Bass ($20-250,\text{Hz}$ ), Vocals ($300-3.4,\text{kHz}$ ), Highpass ($>1,\text{kHz}$ ), and$60,\text{Hz}$ Mains Hum Notch. -
Hermitian Symmetry ($k_{\text{eff}} = \min(k, N-k)$): Eliminates complex leakage and ensures
$< 1%$ amplitude reconstruction error ($0.08%$ ).
| Quad Filter View (Raw, IFFT & Masked Spectrum) | Time Domain Superimposed Overlay |
|---|---|
![]() |
![]() |
Full-featured oscilloscope with live Analog Discovery 3 signal generation (
| Dual Time-Domain Scope (A0 & A1) | Dual FFT Spectrum Analyzer (0 to 250 kHz) |
|---|---|
![]() |
![]() |
| Dedicated Channel 1 View (A0) | Dedicated Channel 2 View (A1) |
|---|---|
![]() |
![]() |
Designed specifically for passive MAX4466 electret microphones (or any analog audio sensor on pins A0 and A1), running completely independently without requiring an Analog Discovery 3:
-
$20.48,\text{ms} - 102.4,\text{ms}$ Audio Timebase: Displays multi-cycle acoustic waveforms for speech, musical instruments, and bass frequencies ($20,\text{Hz} - 250,\text{Hz}$ ). -
Live VU Meters & Clipping Alerts: Status bar indicators that flash red if either microphone saturates (
$V < 0.10,\text{V}$ or$V > 3.10,\text{V}$ ). -
Sub-Bin Quadratic Peak Pitch Tracking: Extracts the dominant acoustic fundamental (
$f_0$ ) with$\pm 0.5,\text{Hz}$ accuracy.
| Dual Audio Waveforms (Mic 1 & Mic 2) | Dual Audio Spectrum (0 to 25 kHz) |
|---|---|
![]() |
![]() |
Advanced diagnostic instrument providing instantaneous mathematical decomposition of stereo sound fields:
-
3-Strip Stacked Amplitude: Instantaneous physical Hilbert analytic envelopes (
$A(t) = \sqrt{x^2 + \hat{x}^2}$ ) and Inter-aural Level Differences ($\Delta L(t)$ in dB). - Rolling STFT Waterfall Spectrogram: 2D time-frequency heatmaps with Blackman-Harris windowing.
-
Continuous Phase Tracking ($\Delta \phi(t)$): Instantaneous inter-channel phase alignment enabled by true simultaneous dual-ADC sampling (
$0.00,\mu\text{s}$ skew).
| 3-Strip Stacked Amplitude & ILD Balance | STFT Waterfall Spectrogram & Phase Tracking |
|---|---|
![]() |
![]() |
| MAX4466 Pin | PYNQ-Z2 Connection | Description |
|---|---|---|
VCC |
3.3V (Power Header) |
Supply rail ( |
GND |
GND (Power Header) |
Common analog ground |
OUT (Mic 1) |
Header J1 Pin A0 |
Channel 1 Audio Input ( |
OUT (Mic 2) |
Header J1 Pin A1 |
Channel 2 Audio Input ( |
| AD3 Wire | Wire Color | PYNQ-Z2 Analog Pin | Signal Description |
|---|---|---|---|
| Wavegen 1 (W1) | Solid Yellow | Header J1 Pin A0 (Pin 6 - Bottom) |
Channel 1 Analog Input (Vaux1) |
| Wavegen 2 (W2) | Yellow / White Stripe | Header J1 Pin A1 (Pin 5 - 2nd from Bottom) |
Channel 2 Analog Input (Vaux9) |
| GND | Solid Black | PYNQ-Z2 GND | Common Analog Reference |
Note: Connect the AD3 USB cable to the large rectangular USB HOST port on the PYNQ-Z2 board. Use an external 5V auxiliary power supply for the AD3 to ensure voltage rail stability under dual-channel generation.
pip install --upgrade pynq-oscilloscopepynq-oscilloscope-get-notebooksfrom pynq_oscilloscope import install_ad3_drivers
install_ad3_drivers()from pynq_oscilloscope import check_usb_permissions, OscilloscopeOverlay
check_usb_permissions()
# Load hardware overlay (auto-fetches v1.6.0 bitstream)
ol = OscilloscopeOverlay()
ol.set_profile("audio")
# Engage hardware Lowpass filter at 250 Hz
ol.filter.set_lowpass(cutoff_hz=250.0)
# Capture Raw Time (DMA 0), Filtered Time (DMA 2), and FFT Spectrum (DMA 1) in <2 ms
v_a0, v_a1, v_filt, freqs, mags = ol.capture_all()# Record and listen to raw vs. FPGA-filtered audio directly in Jupyter Notebook
ol.set_profile("audio")
# 1. Listen to raw input
ol.play_audio(duration_sec=3.0, filtered=False)
# 2. Listen to real-time FPGA-filtered bass
ol.play_audio(duration_sec=3.0, filtered=True)# Launch 4-Trace Hardware Filter Dashboard:
app = ol.filter_dashboard()
# Launch Academic Lab Scope & AD3 Aliasing Explorer:
app = ol.ad3_dashboard()
# Launch dedicated passive Microphone Instrument:
app = ol.audio_dashboard()
# Launch Multi-Domain Acoustic Analytics Engine:
app = ol.analytic_dashboard()| Notebook | Focus Area | Key Modules Used |
|---|---|---|
01_ad3_getting_started.ipynb |
Digilent drivers, USB permissions, and dual non-blocking signal generator. |
AD3SignalGenerator, check_usb_permissions
|
02_xadc_getting_started.ipynb |
Low-level 1 MSPS DMA stream capture, hardware trigger comparator, and DDR transfer. |
OscilloscopeOverlay, HardwareTrigger
|
03_ad3_oscilloscope_dashboard.ipynb |
Academic Lab Scope: Dual-trace scope, |
OscilloscopeOverlay, OscilloscopeDashboard
|
04_audio_dashboard.ipynb |
Audio Instrument: Dedicated passive microphone analyzer with VU meters & overtone pitch tracking. |
OscilloscopeOverlay, AudioDashboard
|
05_acoustic_analytic_curves.ipynb |
Analytics Engine: Zero-skew splitter test, Hilbert envelopes, ILD balance, and STFT waterfall spectrograms. |
OscilloscopeOverlay, AcousticAnalyticDashboard
|
06_audio_recording_and_playback.ipynb |
Audio Recording: Multi-second microphone recording, frame-boundary continuity, and WAV audio playback. |
OscilloscopeOverlay, audio_utils
|
07_pl_hardware_filter_test.ipynb |
FPGA Filter & IFFT: Real-time frequency masking, 1:1 amplitude fidelity verification, stopband rejection, and AudioFilterDashboard. |
OscilloscopeOverlay, HardwareFilter, AudioFilterDashboard
|
This project is licensed under the MIT License - see the LICENSE file for details.









