Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
72713fa
feat(example): add Eye Diagram Chart drawExample with NRZ signal gene…
chule Apr 22, 2026
9f37e7f
fix(example): correct raised-cosine transition range to exact 20-samp…
chule Apr 22, 2026
123b4c6
fix(example): add cleanup fn, remove dead stats vars in EyeDiagramChart
chule Apr 22, 2026
6e23926
feat(example): add EyeDiagramChart React wrapper component
chule Apr 22, 2026
5456c71
feat(example): add Eye Diagram Chart exampleInfo metadata file
chule Apr 22, 2026
3aff794
feat(examples): add vanilla and angular entry points for eye diagram …
chule Apr 22, 2026
ff86636
feat(EyeDiagramChart): register eye diagram demo in routing and menu
chule Apr 22, 2026
cdf7085
chore(example): add placeholder thumbnail for EyeDiagramChart
chule Apr 22, 2026
5164434
fix(example): increase trace resolution to 400 samples, add README, r…
chule Apr 22, 2026
1fda411
docs(example): add markdownContent overview for all frameworks in Eye…
chule Apr 22, 2026
b121745
fix(example): reduce axis title font size to 11px in EyeDiagramChart
chule Apr 22, 2026
0403536
fix(example): reduce axis label font size to 10px in EyeDiagramChart
chule Apr 22, 2026
bd5d9b7
fix(example): switch to oscilloscope thermal colormap, widen transiti…
chule Apr 22, 2026
bb44a36
feat(example): add 3-crossing eye diagram model for authentic oscillo…
chule Apr 23, 2026
9ab9fb1
feat(example): switch signal model to MLT-3 (three-level, two stacked…
chule Apr 23, 2026
11280f4
fix(example): widen transitions to 35% UI, tighten Y range to match M…
chule Apr 23, 2026
e25c9b4
docs(example): update eye diagram descriptions and signal realism
chule Apr 23, 2026
fcc983c
feat(example): add live waveform panel above eye diagram heatmap
chule Apr 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Examples/src/components/AppRouter/examplePaths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export default [
"../Examples/FeaturedApps/ScientificCharts/InteractiveWaterfallChart",
"../Examples/FeaturedApps/ScientificCharts/LiDAR3DPointCloudDemo",
"../Examples/FeaturedApps/ScientificCharts/PhasorDiagramChart",
"../Examples/FeaturedApps/ScientificCharts/EyeDiagramChart",
"../Examples/FeaturedApps/ScientificCharts/Semiconductors",
"../Examples/FeaturedApps/ScientificCharts/TenorCurves3D",
"../Examples/FeaturedApps/ScientificCharts/WaferAnalysis",
Expand Down
1 change: 1 addition & 0 deletions Examples/src/components/AppRouter/examples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export const MENU_ITEMS_FEATURED_APPS: TMenuItem[] = [
EXAMPLES_PAGES.featuredApps_scientificCharts_AudioAnalyzerBarsDemo,
EXAMPLES_PAGES.featuredApps_scientificCharts_WaterfallChartDemo,
EXAMPLES_PAGES.featuredApps_scientificCharts_PhasorDiagramChart,
EXAMPLES_PAGES.featuredApps_scientificCharts_EyeDiagramChart,
EXAMPLES_PAGES.featuredApps_scientificCharts_CorrelationPlot,
EXAMPLES_PAGES.featuredApps_scientificCharts_Semiconductors,
EXAMPLES_PAGES.featuredApps_scientificCharts_WaferAnalysis,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
## Real-time Eye Diagram (Persistence Display)

### Overview

An **eye diagram** is the standard oscilloscope tool for evaluating signal integrity in high-speed serial data links. It is produced by overlaying thousands of short waveform segments — each one a 2-UI (two bit-period) window sliced from a continuous data stream — on a single time axis. When many traces accumulate, the open central regions (the "eye openings") become visible, along with the smearing caused by inter-symbol interference (ISI), timing jitter, and noise.

This demo simulates an **MLT-3 (Multi-Level Transmit 3)** serial data signal — the line code used in 100BASE-TX Ethernet — entirely in the browser and renders two panels in a single SciChart surface:

- **Top panel** — a live `FastLineRenderableSeries` waveform showing the most recently generated trace
- **Bottom panel** — the accumulating `UniformHeatmapRenderableSeries` eye diagram, with an oscilloscope-style persistence display (red/yellow = frequently traversed, blue = rarely visited)

MLT-3 cycles through three voltage levels (+1 V, 0 V, −1 V) via a four-state machine, producing **two stacked eye openings** per display window.

### Technical Implementation

**Two-panel layout** — Both panels live inside a single `SciChartSurface.createSingle` surface. Sub-charts are created with `SciChartSubSurface.createSubSurface`, positioned using `Rect` with `ESubSurfacePositionCoordinateMode.Relative`: the line chart occupies the top 28% (`Rect(0, 0, 1, 0.28)`) and the heatmap the bottom 72% (`Rect(0, 0.28, 1, 0.72)`). All axes, series, and data objects share the single `wasmContext` returned by `createSingle`.

**Signal generation** — Each trace is built from a random MLT-3 state sequence (pprev, prev, curr, next) to capture both transitions in the 2-UI window:

- Voltage levels: +1 V, 0 V, −1 V (four states: [+1, 0, −1, 0])
- Per-trace **amplitude scaling** (σ = 2.5%) and **DC offset** (σ = 15 mV) for realistic trace-to-trace variation
- **Raised-cosine transitions** spanning ~35% of one UI — matching real 100BASE-TX rise time
- Independent per-edge **rise time variation** (σ = 2.8 samples) for realistic fuzz at crossings
- Three crossing edges at t = 0, t = 1 UI, t = 2 UI with independent per-edge **timing jitter** (Gaussian, σ = 4.0 samples ≈ 2% of UI)
- **Amplitude noise** (Gaussian, σ = 0.010 V) added to each sample

**Heatmap accumulation** — Each trace's 400 samples are binned into a **400 × 200 accumulation grid** (time × voltage). Grid counts are log-scaled (`log1p`) before being passed to `UniformHeatmapDataSeries.setZValues()` each frame. The log scale keeps early traces visible while the hot centre saturates gracefully.

**Colormap** — A custom `HeatmapColorMap` maps density to an oscilloscope thermal palette: black → dark blue → cyan → green → yellow → red.

**Performance** — 50 traces (20,000 samples) are generated and binned per animation frame. The heatmap is updated via a single `setZValues()` call per frame — one GPU texture upload regardless of how many traces have accumulated. A stats overlay shows live FPS, traces/second, and total accumulated traces.

### Features

- **Two-panel layout** using SciChart SubCharts API — live waveform on top, persistence heatmap on bottom
- Real-time MLT-3 eye diagram with two stacked eye openings, ISI, jitter, and noise
- Per-trace realism: amplitude variation, DC offset, independent per-edge rise time variation
- Oscilloscope thermal persistence display aesthetic (black → blue → cyan → yellow → red)
- 50 traces × 60 FPS = ~3,000 traces/second accumulation
- Stats overlay: FPS, Traces/s, Total traces
- No controls — pure performance display
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { Component } from "@angular/core";
import { ScichartAngularComponent } from "scichart-angular";
import { drawExample } from "./drawExample";

@Component({
standalone: true,
imports: [ScichartAngularComponent],
selector: "app-eye-diagram-chart",
template: `
<div style="width: 100%; height: 100%;">
<scichart-angular
[initChart]="initChart"
(onInit)="onInit($event)"
(onDelete)="onDelete($event)"
style="width: 100%; height: 100%;"
></scichart-angular>
</div>
`,
})
export class AppComponent {
initChart = drawExample;
private controls?: { startAnimation: () => void; stopAnimation: () => void; cleanup: () => void };

onInit(initResult: Awaited<ReturnType<typeof drawExample>>) {
this.controls = initResult.controls;
this.controls.startAnimation();
}

onDelete(initResult: Awaited<ReturnType<typeof drawExample>>) {
this.controls?.cleanup();
}
}
Loading