Difference between revisions of "SRS Tool — Shock Response Spectrum Analyser"

From OROS Wiki
Jump to navigation Jump to search
(Created page with "{{DISPLAYTITLE:SRS Tool — User Guide}} __TOC__ = SRS Tool — Shock Response Spectrum Analyser = '''SRS Tool''' is a professional Shock Response Spectrum (SRS) analysis application developed for structural dynamics engineers working with OROS NVGate acquisition systems. It reads recorded time signals directly from NVGate project folders, computes SRS using the Smallwood (1981) recursive digital filter, and injects results back into NVGate as live TCP result channels...")
 
Line 1: Line 1:
{{DISPLAYTITLE:SRS Tool — User Guide}}
{{DISPLAYTITLE:SRS Tool — Shock Response Spectrum Analyser}}
__TOC__
__TOC__
<!-- ═══════════════════════════════════════════════════════════════════
    INFOBOX  (top-right, like Wikipedia software articles)
    ═══════════════════════════════════════════════════════════════════ -->
{| class="wikitable" style="float:right; margin:0 0 16px 24px; width:290px; font-size:11px; border:1px solid #555; background:#1e1e1e; color:#dcdcdc;"
|+ style="font-weight:bold; font-size:13px; padding:6px 0; color:#9db8d2;" | SRS Tool
|-
| style="padding:6px 10px;" |
{| style="width:100%; font-size:11px;"
|-
| style="color:#888; width:40%;" | '''Developer''' || OROS / Gemini
|-
| style="color:#888;" | '''Platform''' || Windows 10 / 11
|-
| style="color:#888;" | '''Language''' || Python 3.9+
|-
| style="color:#888;" | '''UI framework''' || PySide2 (Qt 5.15)
|-
| style="color:#888;" | '''Algorithm''' || Smallwood 1981
|-
| style="color:#888;" | '''NVGate I/O''' || Native (.ors / .orm)
|-
| style="color:#888;" | '''Standards''' || 30+ built-in curves
|}
|}


= SRS Tool — Shock Response Spectrum Analyser =
= SRS Tool — Shock Response Spectrum Analyser =


'''SRS Tool''' is a professional Shock Response Spectrum (SRS) analysis application
'''SRS Tool''' is a professional [[Shock Response Spectrum]] (SRS) analysis application
developed for structural dynamics engineers working with OROS NVGate acquisition systems.
tightly integrated with the OROS [[NVGate]] measurement platform.
It reads recorded time signals directly from NVGate project folders, computes SRS using
It reads shock recordings directly from NVGate project folders, computes SRS using
the Smallwood (1981) recursive digital filter, and injects results back into NVGate as
the industry-standard [[Smallwood (1981)]] recursive digital filter, and pushes
live TCP result channels — all without leaving a single application.
results back into NVGate as live TCP result channels — all within a single dark-themed
desktop application.


[[File:screenshot_main_overview.png|thumb|800px|center|SRS Tool — main window overview. Left panel: tabbed controls. Right panel: time signal (top) and SRS plot (bottom).]]
[[File:01_main_tab_with_srs.png|thumb|800px|center|'''SRS Tool''' Main tab with a triaxial shock recording loaded (x, y, z channels). Time signal with auto-detected shock zone (top) and log-log SRS plot (bottom).]]


== Key Features ==
----


=== What makes SRS Tool unique ===
== What makes SRS Tool stand out ==


{| class="wikitable" style="width:100%"
Most SRS tools require manual import/export and provide no built-in normative database.
|-
SRS Tool is built differently:
! Feature !! SRS Tool !! Typical competitor tools
 
<div style="background:#1a2a3a; border-left:4px solid #4a9ee0; padding:12px 16px; margin:14px 0; border-radius:3px; color:#c8d8e8; font-size:12px;">
⭐ '''Key differentiators''' vs commercial alternatives (nCode GlyphWorks, LMS TecWare, Brüel & Kjær Pulse)
</div>
 
{| class="wikitable" style="width:100%; font-size:12px;"
! style="width:52%;" | Feature
! style="width:24%; text-align:center;" | SRS Tool
! style="width:24%; text-align:center;" | Typical tools
|-
|-
| '''Built-in normative limit curve library''' (30+ curves, MIL-STD-810H, ECSS, NASA, DEF-STAN…) || {{Yes}} — ready to use, no configuration || {{No}} — manual entry only, or sold as separate module
| '''30+ built-in normative limit curves''' (MIL-STD-810H, ECSS, NASA, DEF-STAN…) — no manual entry needed
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Included
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ Manual / paid add-on
|-
|-
| Multi-channel Pass/Fail with '''per-channel verdict''' in a single run || {{Yes}} || Rarely — usually one channel at a time
| '''Multi-channel Pass/Fail with per-channel verdict''' in one run
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Included
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ One channel at a time
|-
|-
| '''Automatic shock zone detection''' (envelope-based) || {{Yes}} || Rarely included
| '''Direct NVGate signal read''' (no DLL, no NVGate open)
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Native
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ Manual export required
|-
|-
| '''Primary + Residual SRS''' in one computation pass || {{Yes}} || Usually requires two separate analyses
| '''NVGate TCP result injection''' (log-log, autoscaled)
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Native
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ Not available
|-
|-
| '''SRSS''' (Square Root Sum of Squares, multi-axis resultant) || {{Yes}} || Optional paid add-on in most tools
| '''Automatic shock zone detection''' (envelope algorithm)
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Included
| style="background:#3a3a1e; color:#cfcf7e; text-align:center;" | ~ Optional / extra
|-
|-
| '''Worst-case envelope''' across axes || {{Yes}} || Rarely included
| '''Primary + Residual SRS''' in a single computation pass
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Included
| style="background:#3a3a1e; color:#cfcf7e; text-align:center;" | ~ Two separate analyses
|-
|-
| Direct '''NVGate TCP injection''' (read signal → compute → inject result) || {{Yes}} — native, zero configuration || {{No}} — requires manual export/import
| '''SRSS + Worst-case Envelope''' multi-axis combination
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Included
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ Paid add-on
|-
|-
| Interactive '''cursor with margin readout''' on Pass/Fail chart || {{Yes}} || Rarely
| '''Interactive dB cursor''' on Pass/Fail chart
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Included
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | Rarely available
|-
|-
| Open-source, no licence dongle || {{Yes}} || {{No}}
| No licence dongle / subscription
| style="background:#1e3d2a; color:#7ecf9a; text-align:center; font-weight:bold;" | ✔ Free
| style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ Licence required
|}
|}


=== Full feature list ===
----
 
= Quick Start =


* '''Signal acquisition:''' reads NVGate <code>.ors</code> / <code>.orm</code> files directly — no DLL, no NVGate open
<div style="background:#1a2a1a; border:1px solid #3a6a3a; padding:14px 18px; margin:12px 0; border-radius:4px; color:#c8e0c8; font-size:12px; line-height:1.8;">
* '''Multi-channel:''' up to 10+ simultaneous channels; channel labels read from NVGate recording metadata (e.g. x, y, z)
'''Five steps from measurement folder to Pass/Fail verdict:'''
* '''Smallwood recursive filter:''' vectorised NumPy implementation; all frequencies computed in a single forward pass
 
* '''Frequency axis:''' 1/3, 1/6, 1/12 or 1/24 octave resolution; user-defined f_min / f_max
# '''Main tab''' '''Select signal folder…''' → navigate to the NVGate Measurement folder
* '''SRS types:''' Maximax (absolute maximum), Positive, Negative
# Shock zone is '''auto-detected''' — yellow markers appear on the signal plot
* '''Physical quantities:''' Acceleration SRS + derived Pseudo-Velocity SRS + Pseudo-Displacement SRS
# Set Q = 10, range 1–10 000 Hz, resolution 1/12 oct → click '''Compute SRS'''
* '''Shock zone:''' auto-detection + manual override (drag on plot or type Start/End in seconds)
# '''Pass / Fail tab''' → limit curve is pre-set to MIL-STD-810H Mid-field → click '''▶ Run Pass / Fail'''
* '''Residual SRS:''' computes SRS on the signal segment after the shock ends
# Read the verdict, export CSV/PNG, or click '''Inject into NVGate'''
* '''Multi-axis combination:''' SRSS and/or Worst-case Envelope across all loaded channels
</div>
* '''Pass/Fail:''' 30+ built-in normative curves; user CSV; scale factor (dB); multi-channel worst-case
* '''CSV export:''' full table (per-channel SRS, SRSS, limit, per-channel margin, worst margin, status)
* '''PNG export:''' Pass/Fail chart at 150 dpi
* '''NVGate injection:''' injects all SRS curves into NVGate on log-log display, autoscaled
* '''Preprocessing:''' DC offset removal, noise floor suppression
* '''Dark theme:''' optimised for lab-room screen visibility


----
----
Line 63: Line 111:
== Requirements ==
== Requirements ==


{| class="wikitable"
{| class="wikitable" style="font-size:12px;"
|-
! Component !! Version !! Notes
! Component !! Version !! Notes
|-
|-
Line 73: Line 120:
| NumPy || ≥ 1.22 || Vectorised SRS engine
| NumPy || ≥ 1.22 || Vectorised SRS engine
|-
|-
| Matplotlib || ≥ 3.5 || Embedded plot canvases
| Matplotlib || ≥ 3.5 || Embedded canvases
|-
| Pillow || ≥ 9.0 || Optional — only for screenshot export
|-
|-
| pynvdrive || OROS Toolkit NVdrive || Required for NVGate injection only
| pynvdrive || OROS Toolkit NVdrive || Required for NVGate injection only
Line 87: Line 136:
Or use the provided <code>launch_srs.bat</code> shortcut.
Or use the provided <code>launch_srs.bat</code> shortcut.


{{Note|NVGate does '''not''' need to be running to compute SRS. It is only required for the '''Inject into NVGate''' function.}}
<div style="background:#2a2a1a; border-left:4px solid #ccaa00; padding:10px 14px; margin:10px 0; border-radius:3px; color:#e0d080; font-size:11px;">
💡 NVGate does '''not''' need to be running to load signals or compute SRS. It is only required for the '''Inject into NVGate''' function.
</div>


----
----


= User Interface Overview =
= User Interface =


The window is divided into two main areas:
The window has two zones:


* '''Left panel''' — tabbed control area (340 px fixed width): [[#Main Tab|Main]], [[#Advanced Tab|Advanced]], [[#Pass/Fail Tab|Pass / Fail]]
* '''Left panel''' (340 px) — tabbed controls: [[#Main Tab|Main]], [[#Advanced Tab|Advanced]], [[#Pass / Fail Tab|Pass / Fail]]
* '''Right panel''' — expandable visualisation area, showing either the SRS view or the Pass/Fail view depending on which tab is active
* '''Right panel''' (expandable) signal plot + SRS plot, or Pass/Fail chart depending on active tab


[[File:screenshot_ui_layout.png|thumb|700px|center|Window layout: left tab panel + right visualisation area.]]
The '''status bar''' at the bottom shows the current operation, computation result, and NVGate injection status.
 
A '''progress bar''' appears during SRS computation.
== Status bar ==
 
The status bar at the bottom of the window shows:
* Current operation (loading, computing, injecting…)
* After computation: number of frequency bands, Q factor, octave resolution, shock zone duration
* After Pass/Fail: global verdict, minimum margin in dB, number of exceedances
 
A '''progress bar''' appears in the bottom-right corner during SRS computation.


----
----
Line 113: Line 156:
= Main Tab =
= Main Tab =


[[File:screenshot_main_tab.png|thumb|400px|right|Main tab — from top to bottom: NVGate connection, Signal, Channels, Calculation parameters, Output.]]
[[File:04_left_panel_main.png|thumb|320px|right|Main tab controls — NVGate status, Signal folder, Channels, Calculation parameters, Output type, Compute and Inject buttons.]]


== NVGate connection indicator ==
== NVGate connection ==


A coloured dot shows the live connection status to NVGate:
A dot in the '''NVGate''' box shows live connection status, polled every 3 seconds:


* 🔴 '''Disconnected''' — NVGate is not running, or pynvdrive is not available. SRS computation still works; only injection is unavailable.
* 🟢 '''Connected''' — NVGate is reachable via pynvdrive. Injection is available.
* 🟢 '''Connected''' — NVGate is reachable. The indicator is polled every 3 seconds automatically.
* 🔴 '''Disconnected''' — NVGate is not running, or pynvdrive is not installed. SRS computation still works normally.


== Signal ==
== Signal ==
Selects the NVGate measurement folder to analyse.


; Select signal folder…
; Select signal folder…
: Opens a folder browser starting at <code>C:\OROS\NVGate data\Projects</code>.
: Opens a folder browser (default root: <code>C:\OROS\NVGate data\Projects</code>).
   Select the '''Measurement folder''' (e.g. <code>…\Projects\MyProject\Measurement3</code>).
   Select the '''Measurement''' subfolder (e.g. <code>…\MyProject\Measurement3</code>).
  The tool scans for <code>Record_*_1\Channel_*\</code> subfolders automatically.
   Channels are detected and the signal is loaded immediately.
   Channels are listed immediately and the signal is loaded.


The folder path is shown in grey below the button (truncated to 50 characters).
The folder path is shown in grey below the button (truncated to 50 characters for readability).


== Channels ==
== Channels ==


Lists all channels found in the measurement folder.
One checkbox per recorded channel:


[[File:screenshot_channels_box.png|thumb|400px|right|Channels box: one checkbox per recorded channel with its label, sampling rate, duration and unit.]]
<pre>☑  x  (25600 Hz  13.86 s  m/s²)
☑  y  (25600 Hz  13.86 s  m/s²)
☑  z  (25600 Hz  13.86 s  m/s²)</pre>


Each channel is shown as a checkbox:
Channel labels (x, y, z…) are read from the <code>Name</code> field in the NVGate <code>.orm</code> metadata file,
<pre>
set by the operator at recording time. If empty, falls back to the hardware source name ("Input 1", "Input 2"…).
☑  x  (51200 Hz  0.50 s  m/s²)
☑  y  (51200 Hz  0.50 s  m/s²)
☑  z  (51200 Hz  0.50 s  m/s²)
</pre>


Channel labels (x, y, z…) are read from the NVGate <code>Name</code> field in the <code>.orm</code> metadata file, set at recording time.
Uncheck a channel to exclude it from the computation.
Uncheck a channel to exclude it from computation.


; ↺ Reload channels
; ↺ Reload channels
: Re-reads the channel list from disk. Use this after a new NVGate recording in the same folder without re-browsing.
: Re-reads channel files from disk — useful after a new NVGate recording in the same folder without re-browsing.


== Calculation Parameters ==
== Calculation Parameters ==


{| class="wikitable"
{| class="wikitable" style="font-size:12px;"
|-
! Parameter !! Description !! Default
! Parameter !! Description !! Typical value
|-
|-
| '''Frequency''' (f_min to f_max) || Frequency range of the SRS output || 1 Hz to 10 000 Hz
| '''Frequency range''' || f_min and f_max for the SRS output || 1 Hz 10 000 Hz
|-
|-
| '''Type''' || Q factor or Damping ratio ζ || Q factor
| '''Q factor / Damping''' || Quality factor Q or damping ratio ζ (interchangeable) || Q = 10
|-
|-
| '''Value''' || Numerical value of Q or ζ || Q = 10  (ζ = 5 %)
| '''Resolution''' || Octave fraction: 1/3, 1/6, '''1/12''', 1/24 octave || 1/12 octave
|-
| '''Resolution''' || Octave fraction: 1/3, 1/6, 1/12, 1/24 || 1/12 octave
|}
|}


{{Note|f_max is automatically clamped to the Nyquist frequency (f_s / 2) of the loaded signal.}}
<div style="background:#1a1a2a; border-left:4px solid #7a7acf; padding:8px 12px; margin:8px 0; border-radius:3px; color:#b0b0e0; font-size:11px;">
 
f_max is automatically clamped to the Nyquist frequency (f_s / 2). '''Q = 10 (ζ = 5%)''' is the standard value for all major aerospace shock norms (MIL-STD-810H, ECSS, NASA-STD-7003A).
The relationship between Q factor and damping ratio is:
</div>
 
:<math>\zeta = \frac{1}{2Q}</math>
 
Q = 10 corresponds to ζ = 5 %, which is the standard value specified by MIL-STD-810, ECSS and most aerospace shock standards.


== Output ==
== Output ==
Selects which SRS curves to compute and display.


; Type
; Type
: '''Acc''' — Acceleration SRS (always available).
: '''Acc''' — Acceleration SRS (m/s² or g). Always available.
   '''Vel''' — Pseudo-Velocity SRS (only if input unit is acceleration).
   '''Vel''' — Pseudo-Velocity SRS. Available for acceleration inputs only.
   '''Disp''' — Pseudo-Displacement SRS (only if input unit is acceleration).
   '''Disp''' — Pseudo-Displacement SRS. Available for acceleration inputs only.


; Curve
; Curve
: '''Maximax''' — absolute maximum of positive and negative responses. The standard SRS curve required by most norms.
: '''Maximax''' — max(positive, |negative|). The standard SRS required by most norms.
   '''Positive''' — maximum positive SDOF response only.
   '''Positive''' — maximum positive SDOF response.
   '''Negative''' — maximum absolute negative SDOF response (plotted as a positive value).
   '''Negative''' — maximum absolute negative response (plotted as positive).


Multiple selections are displayed together on the SRS plot.
== Signal and SRS plots ==


== Compute SRS button ==
[[File:05_signal_plot.png|thumb|800px|center|Time signal with auto-detected shock zone (yellow dashed markers). The yellow-shaded area is the primary SRS window. Drag to refine.]]


Launches the SRS computation in a background thread. The progress bar updates in real time.
[[File:06_srs_plot.png|thumb|800px|center|SRS log-log plot — 3 channels (x blue, y orange, z green) computed on the shock zone. The legend identifies each curve.]]
A duplicate '''Compute SRS''' button is available in the Advanced tab.


== Inject into NVGate button ==
The right panel shows two stacked plots:


Sends all computed SRS curves to NVGate as TCP result channels displayed in log-log scale.
* '''Top — Time signal:''' all loaded channels overlaid. The yellow dashed vertical lines delimit the shock zone. Drag horizontally on the plot to redefine it. The zone can also be set precisely in the [[#Shock Zone|Advanced tab]].
Disabled if NVGate is not connected or if no SRS has been computed.
* '''Bottom — SRS (log-log):''' all computed curves with a legend. Draw order: real channels first, then Envelope (orange dash-dot), then SRSS (white dashed) on top.
A duplicate '''Inject into NVGate''' button is available in the Advanced tab.


----
----
Line 207: Line 233:
= Advanced Tab =
= Advanced Tab =


[[File:screenshot_advanced_tab.png|thumb|400px|right|Advanced tab — Shock zone, Residual SRS, Preprocessing, Multi-axis combination.]]
[[File:09_left_panel_adv.png|thumb|320px|right|Advanced tab — Shock zone (auto-detection + manual override), Residual SRS, Preprocessing, Multi-axis combination.]]


== Shock Zone ==
== Shock Zone ==


Defines the time window used for SRS computation.
<div style="background:#2a1a1a; border-left:4px solid #cf5050; padding:8px 12px; margin:8px 0; border-radius:3px; color:#e0b0b0; font-size:11px;">
⚡ The shock zone is '''auto-detected automatically''' every time a signal is loaded. You normally do not need to change anything here.
</div>


{{Note|The shock zone is '''auto-detected automatically''' each time a signal is loaded. You normally do not need to touch these settings.}}
=== Auto-detection algorithm ===
 
=== Auto-detection ===
 
The detection algorithm (Smallwood envelope method):


# Compute a smoothed envelope: rolling mean of |signal| over a 3 ms window
# Compute a smoothed envelope: rolling mean of |signal| over a 3 ms window
# Threshold = ''threshold_pct'' / 100 × max(envelope)
# Set trigger threshold = ''Threshold'' % of the peak envelope
# Shock zone = first … last sample where envelope ≥ threshold
# Shock zone = first … last sample above the threshold
# Expand by ''padding'' ms on each side (clamped to signal bounds)
# Expand by ''Padding'' ms on each side, clamped to signal bounds


{| class="wikitable"
{| class="wikitable" style="font-size:12px;"
! Parameter !! Effect !! Default
|-
|-
! Parameter !! Description !! Default
| '''Threshold (% of peak)''' || Lower → wider zone (catches low-level pre/post-shock). Higher → core impact only. || 5 %
|-
|-
| '''Threshold''' || Fraction of the peak envelope used as trigger (% of peak) || 5 %
| '''Padding (ms)''' || Extra margin added symmetrically on both sides of the detected shock. || 20 ms
|-
| '''Padding''' || Extra time margin added on both sides of the detected zone || 20 ms
|}
|}


'''Padding explained:''' if the shock is detected between 0.100 s and 0.150 s with a 20 ms padding, the zone becomes 0.080 s – 0.170 s. This ensures that the full transient and its ring-down tail are included.
'''Padding explained:''' if the shock is detected at 8.14 s – 9.98 s with 20 ms padding, the zone becomes 8.12 s – 10.00 s. This captures the full transient including ring-down.


; Auto-detect shock
=== Manual override ===
: Re-runs detection with the current Threshold and Padding values. The result is shown on the signal plot (yellow dashed markers) and updates the Start/End fields below.


=== Manual Override ===
Type '''Start''' and '''End''' in seconds (3-decimal precision). The yellow markers on the signal plot update instantly. Dragging on the signal plot synchronises back to these fields.
 
[[File:screenshot_shock_zone.png|thumb|400px|right|Signal plot with auto-detected shock zone (yellow dashed lines). The span selector can be dragged to refine.]]
 
; Start / End (seconds)
: Type the exact zone boundaries in seconds (3-decimal precision).
  Changing either value immediately moves the yellow zone markers on the signal plot.
  The '''Duration''' label updates in real time.
 
; Drag on the signal plot
: Click and drag horizontally on the time signal to draw a custom zone. The Start/End spinboxes synchronise automatically.
 
{{Warning|If no shock zone is defined (zone cleared), the SRS is computed over the '''entire signal'''. This is valid but will include pre-shock noise.}}


=== Residual SRS ===
=== Residual SRS ===


; Also compute residual SRS
When '''Also compute residual SRS''' is checked, a second computation runs on the signal segment after the shock zone end. This captures the free vibration decay required by:
: When checked, a second SRS computation is run on the signal '''after''' the shock zone end.
* MIL-STD-810H Method 517.2 § 2.1.3
  This captures the free vibration decay following the shock, and is required by MIL-STD-810H Method 517 and ECSS-E-ST-10-03.
* ECSS-E-ST-10-03C clause 8.4.3


The residual SRS is displayed as a separate set of curves on the SRS plot (labelled "(residual)").
The residual curves appear on the SRS plot labelled "(residual)".


=== Advanced Preprocessing ===
== Advanced Preprocessing ==


Applied to the signal before SRS computation.
Applied to the signal before the SRS filter:


{| class="wikitable"
{| class="wikitable" style="font-size:12px;"
|-
! Option !! Effect !! Typical use
! Option !! Effect !! Typical use
|-
|-
| '''Remove DC offset''' (N ms) || Subtracts the mean of the first N ms from the entire signal || Sensor with bias or slow drift
| '''Remove DC offset''' (N ms) || Subtracts the mean of the first N ms from the entire signal || Sensor bias, slow drift
|-
|-
| '''Noise floor''' (N ms) || Zeroes out the first N ms of the signal || Pre-trigger noise before the shock event
| '''Noise floor''' (N ms) || Zeroes out the first N ms || Pre-trigger noise before the shock event
|}
|}


=== Multi-axis Combination ===
== Multi-axis Combination ==


Available when '''2 or more acceleration channels''' are loaded.
Available when '''2 or more acceleration channels''' are loaded (e.g. triaxial x/y/z accelerometer).


; SRSS — √(SRS₁² + SRS₂² + …)
; SRSS — √(SRS₁² + SRS₂² + …)
: Computes the Square Root Sum of Squares of all selected channels (Maximax only).
: Square Root Sum of Squares of all channels Maximax only. Shown as a '''white dashed curve'''.
  Result shown as a '''white dashed curve''' on the SRS plot.


; Worst-case envelope — max(SRS₁, SRS₂, …)
; Worst-case envelope — max(SRS₁, SRS₂, …)
: Computes the point-by-point maximum across all channels (all curve types).
: Point-by-point maximum across all channels all curve types. Shown as an '''orange dash-dot curve'''.
  Result shown as an '''orange dash-dot curve''' on the SRS plot.


See [[#Multi-Axis Combination|the calculation section]] for the mathematical definitions.
See [[#Multi-Axis Combination - Calculation|the calculation section]] for the mathematical definitions.


----
----
Line 291: Line 298:
= Pass / Fail Tab =
= Pass / Fail Tab =


[[File:screenshot_passfail_tab.png|thumb|400px|right|Pass/Fail tab — limit curve selector, channel selector, curve type, Run button.]]
[[File:07_left_panel_pf.png|thumb|320px|right|Pass/Fail controls — limit curve selector with built-in library, scale factor, channel selector, Run button and export buttons.]]


The Pass/Fail tab compares the computed SRS against a normative or user-defined limit curve.
The Pass/Fail tab compares the computed SRS against any normative or user-defined limit curve.


== Limit Curve ==
== Limit Curve Library ==


=== Built-in library ===
<div style="background:#1a2a3a; border-left:4px solid #4a9ee0; padding:10px 14px; margin:10px 0; border-radius:3px; color:#b0c8e0; font-size:11px;">
📚 SRS Tool includes '''30+ pre-programmed normative limit curves''' — no other standalone SRS tool provides this ready-to-use library. Select a standard from the dropdown and run immediately.
</div>


SRS Tool includes '''30+ pre-programmed limit curves''' from the major international standards. No other standalone SRS tool provides this library out-of-the-box.
{| class="wikitable" style="font-size:12px;"
 
! Standard !! Curves
The curves are organised by standard family in a grouped drop-down list:
 
{| class="wikitable" style="width:100%"
|-
! Standard family !! Curves included
|-
| '''MIL-STD-810H Method 517''' || Near-field (< 0.3 m), Mid-field (0.5–1.5 m), Far-field (> 1.5 m), Gunfire, Tall vehicles
|-
|-
| '''ECSS-E-ST-10-03C''' || Equipment level protoflight, proto+, acceptance; System level qualification, protoqualification
| MIL-STD-810H Method 517 || Near-field, Mid-field ★, Far-field, Gunfire, Tall vehicles
|-
|-
| '''NASA-STD-7003A''' || Payload near-field, payload far-field, structure-borne near/far
| ECSS-E-ST-10-03C || Protoflight, Proto+, Acceptance, Qualification, Protoqualification
|-
|-
| '''DEF-STAN 00-35''' || Land vehicle, Ship (deck), Airborne external/internal
| NASA-STD-7003A || Payload near/far-field, structure-borne near/far
|-
|-
| '''MIL-S-901D''' || High-Impact shock (Grade A / Grade B)
| DEF-STAN 00-35 || Land vehicle, Ship (deck), Airborne external/internal
|-
|-
| '''IEST-RP-DTE032''' || Component test levels (light / medium / heavy equipment)
| MIL-S-901D || High-impact shock Grade A / Grade B
|-
|-
| '''RTCA DO-160G''' || Avionics (Cat. A / B / C)
| IEST-RP-DTE032 || Light / medium / heavy equipment
|-
|-
| '''Tailored''' || Custom envelope / composite curves
| RTCA DO-160G || Avionics Cat. A / B / C
|}
|}


Each curve displays:
★ MIL-STD-810H Mid-field is set as the default — the most common specification in equipment qualification programmes.
* '''Reference''' — standard document number and clause
 
* '''Description''' — English plain-text explanation of the applicability (normative, indicative, etc.)
Each curve shows its normative reference and a plain-English description of applicability.


=== User-defined CSV ===
=== User-defined CSV ===


Select '''← User-defined (CSV)''' at the top of the list, then click '''Load CSV limit curve…'''.
Select '''← User-defined (CSV)''' and click '''Load CSV limit curve…'''. Format: two columns (Hz, g), no header needed:


The CSV must contain two columns: frequency (Hz) and level (g), no header required:
<pre>10, 5
<pre>
100, 50
10,5
2000, 50
100,50
10000, 50</pre>
2000,50
10000,50
</pre>


The tool interpolates linearly between breakpoints (log-log space).
Interpolation is linear in log-log space between breakpoints.


=== Scale factor (dB) ===
=== Scale factor (dB) ===


Shifts the entire limit curve up or down in dB before comparison:
Shifts the limit curve uniformly before comparison:


:<math>L_{\text{scaled}}(f) = L_{\text{nominal}}(f) \times 10^{dB/20}</math>
:<code>L_scaled(f) = L_nominal(f) × 10^(dB/20)</code>


{| class="wikitable"
{| class="wikitable" style="font-size:12px;"
! dB !! Multiplier !! Effect
|-
|-
! Scale factor !! Multiplier !! Effect
| +6 dB || ×2.00 || Tighter / more conservative limit
|-
|-
| +6 dB || ×2.0 || Tighter / more conservative limit
| +3 dB || ×1.41 || Standard qualification margin check
|-
|-
| +3 dB || ×1.41 || Standard margin check (+3 dB test level)
| 0 dB || ×1.00 || Nominal — no change
|-
|-
| 0 dB || ×1.0 || Nominal limit
| −6 dB || ×0.50 || Relaxed limit
|-
| −6 dB || ×0.5 || Relaxed limit (adds safety margin to measured SRS)
|}
|}


== Compare With ==
== Running Pass/Fail ==


; Channel
[[File:08_passfail_chart.png|thumb|800px|center|Pass/Fail result — 3 channels (x/y/z) vs MIL-STD-810H Mid-field limit (red dashed). All channels well within spec: margin subplot shows 30–60 dB margin across the full frequency range (green fill).]]
: Select which SRS curve to compare. Options:
:* Individual channels (Ch 1 — x, Ch 2 — y, …)
:* '''★ SRSS (…)''' — the multi-axis resultant (if computed)
:* '''◆ Envelope (…)''' — the worst-case envelope (if computed)
:* '''All channels — worst case''' — shown when ≥ 2 channels are loaded; displays all channels simultaneously and uses the worst-case margin for the verdict


; Curve
Click '''▶  Run Pass / Fail'''. The right panel shows:
: Maximax, Positive or Negative SRS type to compare.


== Run Pass / Fail ==
=== Top chart — SRS vs Limit ===


[[File:screenshot_passfail_chart.png|thumb|700px|center|Pass/Fail chart: SRS curves (coloured) vs limit (red dashed), exceedance fill (red), caution zone (orange), margin subplot (bottom).]]
* Each channel plotted in a distinct colour
 
Clicking '''▶  Run Pass / Fail''' produces:
 
=== Chart (top panel) ===
 
* Each channel SRS plotted in a distinct colour
* Limit curve: red dashed line
* Limit curve: red dashed line
* '''Red fill''' between SRS and limit where SRS > limit (exceedance)
* '''Red fill''' where SRS > limit (exceedance)
* '''Orange fill''' where 0 ≤ margin < 3 dB (caution zone)
* '''Orange fill''' where 0 ≤ margin < 3 dB (caution)


=== Margin chart (bottom panel) ===
=== Bottom chart — Margin (dB) ===


Displays the margin in dB at each frequency:
Margin at each frequency: <code>M(f) = 20 × log10( Limit(f) / SRS(f) )</code>


:<math>M(f) = 20 \log_{10}\!\left(\frac{L(f)}{SRS(f)}\right)</math>
{| class="wikitable" style="font-size:12px;"
 
! Fill colour !! Meaning
* '''Green fill''' for M ≥ 3 dB — well within spec
|-
* '''Orange fill''' for 0 ≤ M < 3 dB — caution, less than 3 dB margin
| style="background:#1e3d2a; color:#7ecf9a;" | Green || M ≥ 3 dB — well within spec
* '''Red fill''' for M < 0 dB — '''FAIL'''
|-
* Dashed horizontal reference at +3 dB
| style="background:#3a3a1e; color:#cfcf7e;" | Orange || 0 ≤ M < 3 dB — caution, low margin
|-
| style="background:#3a1e1e; color:#cf7e7e;" | Red || M < 0 dB — FAIL, exceedance
|}


=== Interactive cursor ===
=== Interactive cursor ===


Move the mouse over either panel to see a floating readout:
Move the mouse over either chart panel to see a live floating readout snapped to the nearest frequency band:


<pre>
<pre> f        342.2 Hz
f        342.2 Hz
  SRS      18.45 g
  SRS      18.45 g
  Lim      50.00 g
  Lim      50.00 g
  dB        +8.7
  dB        +8.7
             PASS
             PASS</pre>
</pre>


The readout colour changes: green (PASS), orange (< 3 dB), red (FAIL).
The readout border turns green (PASS), orange (< 3 dB), or red (FAIL).


=== Text verdict ===
=== Verdict text ===


The result box below the chart shows:
The result box below the chart shows the global verdict, per-channel minimum margin, and a table of the 10 worst exceedances. Example:
* Global verdict: '''PASS''' or '''FAIL'''
* Limit curve name
* Per-channel result: individual minimum margin and worst frequency
* Worst margin across all channels
* Table of the 10 most severe exceedances (frequency, SRS, limit, margin)


Example (multi-channel):
<pre>PASS  —  Maximax SRS
<pre>
PASS  —  Maximax SRS
Limit: MIL-STD-810H Meth.517 — Mid-field (0.5–1.5 m)
Limit: MIL-STD-810H Meth.517 — Mid-field (0.5–1.5 m)


Per-channel result:
Per-channel result:
   PASS  x                               min +12.3 dB @ 500 Hz
   PASS  x     min +42.1 dB @ 500 Hz
   PASS  y                               min +8.7 dB @ 342 Hz
   PASS  y     min +38.7 dB @ 342 Hz
   PASS  z                               min +15.1 dB @ 1000 Hz
   PASS  z     min +45.3 dB @ 1000 Hz


Worst margin (all channels): +8.7 dB  @  342.0 Hz
Worst margin (all channels): +38.7 dB  @  342.0 Hz
No exceedance detected over the computed frequency range.
No exceedance detected over the computed frequency range.</pre>
</pre>


== Export ==
== Export ==


=== Export CSV ===
; Export CSV…
 
: Full comparison table. Multi-channel output includes one SRS column per channel, Worst SRS, Limit, per-channel margin, Worst margin and Status. The CSV header block records the curve name and scale factor for traceability.
Exports the full comparison table. For a multi-channel run the file contains:
 
{| class="wikitable"
|-
! Column !! Content
|-
| Frequency (Hz) || SRS frequency axis
|-
| SRS_x (g), SRS_y (g), SRS_z (g) || Per-channel SRS value
|-
| Worst SRS (g) || Point-by-point maximum across channels
|-
| Limit (g) || Limit curve value
|-
| Margin_x (dB), Margin_y (dB), Margin_z (dB) || Per-channel margin
|-
| Worst Margin (dB) || Minimum margin across channels
|-
| Status || PASS / PASS < 3dB / FAIL
|}


The header block includes the limit curve name and scale factor for traceability:
; Export graph PNG…
<pre>
: Both chart panels saved as a PNG at 150 dpi (PDF also available).
# SRS Pass/Fail Report
# Limit curve:  MIL-STD-810H Meth.517 — Mid-field (0.5–1.5 m)
# SRS type:    Maximax
# Channels:    x, y, z
# Unit:        g
</pre>
 
=== Export graph PNG ===
 
Saves the Pass/Fail chart (both panels) as a PNG image at 150 dpi. PDF is also available via the file type filter.


----
----
Line 478: Line 427:
== Reading signals ==
== Reading signals ==


SRS Tool reads NVGate measurement data '''without NVGate running''' and '''without any DLL'''.
SRS Tool reads NVGate data '''without NVGate open''' and without any additional DLL.


The file layout inside a NVGate measurement folder is:
File layout inside a Measurement folder:


<pre>
<pre>Measurement8/
Measurement3/
   Record_1.oxf
   Record_1.oxf                   ← RIFF header (ignored)
   Record_1_1/
   Record_1_1/
     Channel_1_0_XXXXXXXX/
     Channel_1_0_XXXXXXXX/
       Channel_1.orm               ← JSON metadata (sampling rate, unit, name…)
       Channel_1.orm   ← JSON metadata (fs, unit, Name…)
       Part_0.ors                 ← raw float32 little-endian samples (SI units)
       Part_0.ors       ← raw float32 little-endian samples (SI)
     Channel_2_0_XXXXXXXX/
     Channel_2_0_XXXXXXXX/
       Channel_2.orm
       </pre>
      Part_0.ors
</pre>


The <code>.ors</code> file contains 32-bit IEEE 754 float samples in SI units (m/s², m/s, Pa, …) at the native sampling rate. No conversion is applied before the SRS engine.
The <code>.ors</code> file contains 32-bit IEEE 754 float samples in SI units at the native sampling rate.
 
The channel label is read from the <code>Name</code> field of <code>.orm</code> (set by the operator in NVGate).
The channel name displayed in the tool is taken from the <code>Name</code> field in the <code>.orm</code> JSON file (set by the operator in NVGate at recording time). If <code>Name</code> is empty, the tool falls back to the <code>SourceName</code> field ("Input 1", "Input 2", …).


== Injecting results ==
== Injecting results ==


Results are injected via the NVDrive TCP protocol using the '''NVD REAL SPECTRUM''' (FFT-type) result format:
Results are sent to NVGate via the NVDrive TCP protocol as '''NVD REAL SPECTRUM''' channels:


* Each SRS curve becomes one TCP result channel in NVGate
* Each SRS curve one TCP result channel in NVGate
* Axes are set to log scale automatically (X and Y)
* X and Y axes automatically set to log scale
* Y axis is autoscaled
* Y axis autoscaled
* All curves for a measurement are displayed in the <code>SRS_Results</code> window in <code>Layout1</code>
* All curves displayed in window <code>SRS_Results</code> of <code>Layout1</code>


The channel naming convention in NVGate is:
NVGate channel naming:
<pre>
<pre>SRS Acc Shock AbsMax: x
SRS Acc Shock AbsMax: x
SRS Acc Shock AbsMax: y
SRS Acc Shock Max: y
SRS Acc Shock AbsMax: z
SRS Acc AfterShock AbsMax: z
SRS Acc Shock AbsMax: SRSS  (x + y + z)</pre>
SRS Acc Shock AbsMax: SRSS  (x + y + z)
</pre>


----
----
Line 521: Line 464:
== Shock Response Spectrum — Definition ==
== Shock Response Spectrum — Definition ==


The Shock Response Spectrum (SRS) is a function that describes the '''peak response''' of a bank of undamped Single Degree Of Freedom (SDOF) oscillators, each tuned to a different natural frequency f_n, when subjected to a common base excitation signal.
The SRS is defined as the peak absolute acceleration response of a bank of Single Degree Of Freedom (SDOF) oscillators, each tuned to a different natural frequency f_n, driven by a common base acceleration signal.


[[File:diagram_sdof_bank.png|thumb|500px|center|Conceptual diagram: the input acceleration signal drives N parallel SDOF oscillators. The SRS is the envelope of their peak responses.]]
For a SDOF oscillator at frequency f_n with damping ratio ζ:


For each oscillator of natural frequency f_n and damping ratio ζ:
:<code>z''(t) + 2ζωn·z'(t) + ωn²·z(t) = −x''(t)</code>


:<math>\ddot{z}(t) + 2\zeta\omega_n\dot{z}(t) + \omega_n^2 z(t) = -\ddot{x}(t)</math>
where x''(t) is the base acceleration and z(t) the relative displacement.


where:
The three SRS values at frequency f_n:
* <math>\ddot{x}(t)</math> is the base (input) acceleration
* <math>z(t) = y(t) - x(t)</math> is the relative displacement of the mass
* <math>\omega_n = 2\pi f_n</math> is the natural angular frequency


The SRS values at frequency f_n are:
{| class="wikitable" style="font-size:12px;"
 
! Curve !! Definition !! Label in tool
:<math>SRS^{+}(f_n) = \max_{t}\, \omega_n^2 \, z(t)</math>
|-
:<math>SRS^{-}(f_n) = \max_{t}\, \left[-\omega_n^2 \, z(t)\right]</math>
| Positive SRS || max over time of [ωn² · z(t)] || Positive
:<math>SRS^{\max}(f_n) = \max\!\left(SRS^{+},\, SRS^{-}\right)</math>
|-
 
| Negative SRS || max over time of [−ωn² · z(t)] || Negative
where SRS⁺ is the '''Positive''' SRS, SRS⁻ is the '''Negative''' SRS, and SRS^max is the '''Maximax''' (absolute maximum), which is the standard curve required by most aerospace norms.
|-
| Maximax SRS || max(Positive, Negative) || '''Maximax''' standard
|}


== Smallwood Recursive Digital Filter (1981) ==
== Smallwood Recursive Digital Filter (1981) ==


The Runge–Kutta integration of the SDOF equation is computationally intensive. D.O. Smallwood (Sandia National Laboratories, 1981) derived an equivalent '''recursive digital filter''' whose coefficients depend only on f_n, ζ and the sampling interval Δt:
Direct numerical integration of the SDOF equation is slow. D.O. Smallwood (Sandia National Laboratories, 1981) derived an exact '''recursive digital filter''' whose coefficients depend only on f_n, ζ and the time step Δt:


Let:
Let:
:<math>\omega_d = \omega_n\sqrt{1-\zeta^2}</math>  (damped natural frequency)
* <code>ωd = ωn · √(1−ζ²)</code>  (damped natural frequency)
:<math>E = e^{-\zeta\omega_n\Delta t}</math>
* <code>E = exp(−ζ·ωn·Δt)</code>
:<math>K = \omega_d\,\Delta t</math>
* <code>K = ωd·Δt</code>


Filter coefficients:
Filter coefficients:
:<math>b_0 = 1 - \frac{E\sin K}{K}</math>
:<math>b_1 = 2\!\left(\frac{E\sin K}{K} - E\cos K\right)</math>
:<math>b_2 = E^2 - \frac{E\sin K}{K}</math>
:<math>a_1 = 2E\cos K</math>
:<math>a_2 = -E^2</math>


The recursive equation applied at each time step k:
{| class="wikitable" style="font-size:12px; font-family:monospace;"
| b₀ = 1 − E·sin(K)/K
| b₁ = 2·(E·sin(K)/K − E·cos(K))
|-
| b₂ = E² − E·sin(K)/K
| a₁ = 2·E·cos(K)
|-
| a₂ = −E²
|
|}


:<math>y_k = b_0\,x_k + b_1\,x_{k-1} + b_2\,x_{k-2} + a_1\,y_{k-1} + a_2\,y_{k-2}</math>
Recursive equation at each time step k:


where x_k is the input acceleration sample and y_k is the absolute acceleration response of the SDOF mass.
:<code>y[k] = b₀·x[k] + b₁·x[k-1] + b₂·x[k-2] + a₁·y[k-1] + a₂·y[k-2]</code>


=== Vectorised implementation ===
=== Vectorised implementation ===


SRS Tool computes all N natural frequencies in a '''single forward pass''' through the signal using NumPy broadcasting. The coefficients b₀…a₂ are computed as length-N arrays before the loop, and each time-step update is a single vectorised operation on all N oscillators simultaneously. This is typically 50–100× faster than a naive frequency-by-frequency loop.
SRS Tool computes all N natural frequencies in a '''single forward pass''' through the signal.
Coefficient arrays (b₀ … a₂) have shape (N,) and the update at each time step is one NumPy broadcast operation across all oscillators simultaneously. This is typically 50–100× faster than a frequency-by-frequency loop.


== Frequency Axis ==
== Frequency Axis ==


The SRS frequency axis uses a '''logarithmic (octave-fraction) spacing''':
Logarithmic spacing at 1/n octave resolution:
 
:<math>f_k = f_{\min} \times 2^{k/n}, \quad k = 0, 1, \ldots, N-1</math>
 
where n is the octave fraction denominator (3, 6, 12 or 24).
 
Number of bands:


:<math>N = \left\lfloor n \log_2\!\frac{f_{\max}}{f_{\min}} \right\rfloor + 1</math>
:<code>f_k = f_min × 2^(k/n),  k = 0, 1, …, N−1</code>


{| class="wikitable"
{| class="wikitable" style="font-size:12px;"
|-
! Resolution !! Bands/octave !! Bands over 1–10 000 Hz
! Resolution !! Bands per octave !! Bands over 1–10 000 Hz
|-
|-
| 1/3 octave || 3 || 40
| 1/3 octave || 3 || 40
Line 588: Line 528:
| 1/6 octave || 6 || 80
| 1/6 octave || 6 || 80
|-
|-
| 1/12 octave || 12 || 160
| '''1/12 octave''' || 12 || '''160''' ← default
|-
|-
| 1/24 octave || 24 || 320
| 1/24 octave || 24 || 320
Line 595: Line 535:
== Quality Factor and Damping ==
== Quality Factor and Damping ==


The Q factor and damping ratio ζ are interchangeable:
:<code>Q = 1 / (2ζ)  ↔  ζ = 1 / (2Q)</code>


:<math>Q = \frac{1}{2\zeta} \qquad\Leftrightarrow\qquad \zeta = \frac{1}{2Q}</math>
{| class="wikitable" style="font-size:12px;"
 
{| class="wikitable"
|-
! Q factor !! Damping ζ !! Typical application
! Q factor !! Damping ζ !! Typical application
|-
|-
| 10 || 5 % || Standard aerospace (MIL-STD-810, ECSS)
| '''10''' || '''5 %''' || '''Standard aerospace MIL-STD-810, ECSS, NASA'''
|-
|-
| 50 || 1 % || Very lightly damped structures
| 50 || 1 % || Very lightly damped structures
Line 612: Line 549:
== Primary and Residual SRS ==
== Primary and Residual SRS ==


Given a shock zone [t_start, t_end]:
Given shock zone [t_start, t_end]:


* '''Primary SRS''' — computed on the signal segment [t_start, t_end]. Captures the shock transient itself.
{| class="wikitable" style="font-size:12px;"
* '''Residual SRS''' — computed on the signal segment [t_end, end_of_signal]. Captures the free vibration decay after the shock.
! Zone !! Signal segment !! Physical meaning
|-
| '''Primary SRS''' || [t_start, t_end] || Response during the shock transient
|-
| '''Residual SRS''' || [t_end, end] || Free vibration decay after the shock
|}


The residual SRS is required by:
The residual SRS is mandatory for MIL-STD-810H Method 517 and ECSS-E-ST-10-03C fragility assessments.
* MIL-STD-810H Method 517.2, paragraph 2.1.3
A structure failing on residual SRS continues to be excited by stored elastic energy after the shock passes.
* ECSS-E-ST-10-03C, clause 8.4.3
 
A structure that fails on the residual SRS (after the shock has passed) is still being excited by the stored elastic energy — this can be critical for fragility assessment of sensitive electronics.


== Pseudo-Velocity and Pseudo-Displacement SRS ==
== Pseudo-Velocity and Pseudo-Displacement SRS ==


From the acceleration SRS, pseudo-velocity and pseudo-displacement are derived analytically:
Derived analytically from the acceleration SRS (valid under the harmonic motion assumption):


:<math>SV(f_n) = \frac{SA(f_n)}{\omega_n} = \frac{SA(f_n)}{2\pi f_n}</math>
{| class="wikitable" style="font-size:12px; font-family:monospace;"
 
! Quantity !! Formula !! Unit (if SA in m/s²)
:<math>SD(f_n) = \frac{SA(f_n)}{\omega_n^2} = \frac{SA(f_n)}{(2\pi f_n)^2}</math>
|-
 
| Pseudo-Velocity || SV(fn) = SA(fn) / (2π·fn) || m/s
These are '''pseudo''' values because they assume harmonic motion (valid at high frequencies where the peak response occurs near resonance).
|-
 
| Pseudo-Displacement || SD(fn) = SA(fn) / (2π·fn)² || m
Units:
|}
* SA in m/s² → SV in m/s, SD in m
* SA in g → SV in g/Hz (convert to m/s by multiplying by g/2π f_n)


== Multi-Axis Combination ==
== Multi-Axis Combination ==
Line 641: Line 578:
=== SRSS — Square Root Sum of Squares ===
=== SRSS — Square Root Sum of Squares ===


For a triaxial measurement with channels x, y, z:
For triaxial channels x, y, z — applied to Maximax only:
 
:<math>SRSS(f_n) = \sqrt{SA_x(f_n)^2 + SA_y(f_n)^2 + SA_z(f_n)^2}</math>


Applied to the '''Maximax''' SRS only (combining signed positive/negative peaks from different axes is physically undefined).
:<code>SRSS(fn) = √( SA_x(fn)² + SA_y(fn)² + SA_z(fn)² )</code>


Interpretation: SRSS is the Euclidean norm of the response vector, representing the worst-case resultant regardless of the direction of the applied shock.
Represents the Euclidean norm of the response vector worst-case resultant regardless of shock direction.


=== Worst-Case Envelope ===
=== Worst-Case Envelope ===


:<math>ENV(f_n) = \max\!\left(SA_x(f_n),\, SA_y(f_n),\, SA_z(f_n)\right)</math>
:<code>ENV(fn) = max( SA_x(fn), SA_y(fn), SA_z(fn) )</code>


The point-by-point maximum at each frequency. Applied to all curve types (Maximax, Positive, Negative).
Point-by-point maximum at each frequency band. Applied to all curve types (Maximax, Positive, Negative).
 
Required by ECSS-E-ST-10-03C Appendix H when the governing axis can change with frequency.
Interpretation: the governing axis may change with frequency. The envelope captures the most severe response at each frequency band independently, which is the conservative approach required by some space programmes (ECSS-E-ST-10-03C Appendix H).


== Pass/Fail Margin ==
== Pass/Fail Margin ==


The margin in dB at frequency f is:
:<code>M(f) = 20 · log10( Limit(f) / SRS(f) )</code>
 
:<math>M(f) = 20\log_{10}\!\left(\frac{L(f)}{SRS(f)}\right)</math>
 
where L(f) is the limit curve value (after scale factor) and SRS(f) is the measured SRS.
 
{| class="wikitable"
|-
! Margin !! Status !! Colour
|-
| M ≥ 3 dB || PASS || Green
|-
| 0 ≤ M < 3 dB || PASS (caution) || Orange
|-
| M < 0 dB || FAIL || Red
|}


The 3 dB threshold corresponds to a factor of √2 ≈ 1.41 between the SRS and the limit — the standard minimum acceptable margin in most aerospace shock specifications.
The 3 dB threshold (factor √2 ≈ 1.41) is the standard minimum acceptable margin in most aerospace shock specifications.


----
----


= Built-in Limit Curves Reference =
= Supported Units =


== MIL-STD-810H Method 517 — Pyroshock ==
{| class="wikitable" style="font-size:12px;"
 
! Input unit !! Physical quantity !! Vel / Disp SRS
Method 517 covers pyroshock environments generated by explosive devices (separation bolts, pyrocutters, pin pullers, etc.).
|-
 
| m/s², g || Acceleration || style="background:#1e3d2a; color:#7ecf9a; text-align:center;" | ✔ Available
{| class="wikitable" style="width:100%"
|-
|-
! Curve name !! Distance from source !! SRS plateau (200–10 000 Hz)
| m/s, mm/s || Velocity || style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ No
|-
|-
| Near-field || < 0.3 m || 10 000 g
| m, mm, µm || Displacement || style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ No
|-
|-
| Mid-field || 0.5 – 1.5 m || 1 000 g
| N, kN || Force || style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ No
|-
|-
| Far-field || > 1.5 m || 300 g
| V, mV || Voltage || style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ No
|-
|-
| Gunfire || || Mission-specific
| Pa, N/m², bar || Pressure || style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ No
|-
|-
| Tall vehicles || || Reduced far-field per §517.2.4.4
| rad/s, RPM || Angular velocity || style="background:#3a1e1e; color:#cf7e7e; text-align:center;" | ✘ No
|}
|}
The standard SRS shape is a straight line rising at +9 dB/octave from 100 Hz to a plateau, held constant to 10 000 Hz.
The Mid-field curve is set as the '''default''' in SRS Tool, as it is the most frequently encountered specification in equipment qualification programmes.
== ECSS-E-ST-10-03C — Space Engineering Shock ==
The European Cooperation for Space Standardization (ECSS) shock standard covers equipment mounted on spacecraft structures.
Typical levels are specified at the equipment interface. The standard distinguishes:
* '''Acceptance''' level — flight article testing, 1 run per axis
* '''Qualification''' level — +3 dB relative to acceptance, 2 runs per axis
* '''Protoflight''' — qualification level, 1 run per axis (used when only one hardware unit is available)
== NASA-STD-7003A — Pyroshock Test Criteria ==
NASA standard covering payload and structure shock environments. Curves are defined for:
* Payload near-field and far-field
* Structure-borne propagation paths
== DEF-STAN 00-35 — UK Defence Standard ==
Covers equipment for land vehicles, ships and aircraft (both external and internal mounting).
----
= Workflow — Step by Step =
[[File:diagram_workflow.png|thumb|600px|center|Recommended workflow from signal loading to Pass/Fail verdict.]]
== Standard workflow ==
# '''Record''' the shock event in NVGate with appropriate channel labels (x, y, z for triaxial)
# Open SRS Tool → '''Main tab''' → '''Select signal folder…''' → navigate to the Measurement folder
# Channels are listed and the signal is displayed automatically
# The shock zone is '''auto-detected''' (yellow markers on the signal plot)
# Refine the shock zone if needed: drag on the plot, or go to '''Advanced tab''' → Manual override
# Set '''Q = 10''', frequency range '''1–10 000 Hz''', resolution '''1/12 octave'''
# If triaxial, go to '''Advanced tab''' → check '''SRSS''' and/or '''Worst-case envelope'''
# Click '''Compute SRS''' → wait for the progress bar to complete
# Review the SRS plot (log-log, all channels)
# Go to '''Pass / Fail tab''' → select the applicable limit curve (default: MIL-STD-810H Mid-field)
# Click '''▶  Run Pass / Fail''' → review the chart and verdict text
# If needed, export CSV and PNG for the test report
# If NVGate is running, click '''Inject into NVGate''' to add results to the project
== Multi-axis workflow (triaxial accelerometer) ==
# Record all three axes in the same NVGate measurement, labelled x, y, z
# Load the measurement — SRS Tool detects 3 channels automatically
# Advanced tab → enable '''SRSS''' (for resultant) and/or '''Worst-case envelope'''
# Compute SRS
# Pass/Fail → channel selector → choose:
#* '''All channels — worst case''' to see all three curves simultaneously
#* '''★ SRSS''' to test the vector resultant against the limit
== Residual SRS workflow ==
# Load signal and set shock zone
# Advanced tab → check '''Also compute residual SRS'''
# Compute SRS
# Both Primary (during shock) and Residual (after shock) curves appear on the SRS plot
# Pass/Fail can compare either zone against the limit curve


----
----
Line 768: Line 623:
= Glossary =
= Glossary =


{| class="wikitable" style="width:100%"
{| class="wikitable" style="font-size:12px; width:100%;"
! style="width:22%;" | Term !! Definition
|-
|-
! Term !! Definition
| '''SRS''' || Shock Response Spectrum — peak SDOF response as a function of natural frequency.
|-
|-
| '''SRS''' || Shock Response Spectrum. Peak response of a bank of SDOF oscillators as a function of natural frequency.
| '''Maximax''' || max(Positive SRS, Negative SRS) — the absolute maximum, required by most norms.
|-
|-
| '''Maximax''' || max(SRS⁺, SRS⁻). The absolute maximum response, positive or negative.
| '''SDOF''' || Single Degree Of Freedom — a mass-spring-damper system with one resonance frequency.
|-
|-
| '''SDOF''' || Single Degree Of Freedom. A mass–spring–damper system with one resonance frequency.
| '''Q factor''' || Quality factor. Q = 1/(2ζ). Sharpness of resonance. Q = 10 is standard.
|-
| '''Q factor''' || Quality factor. Q = 1 / (2ζ). Measures the sharpness of resonance. Q = 10 is standard for SRS.
|-
|-
| '''ζ (zeta)''' || Damping ratio. Fraction of critical damping. ζ = 5 % for Q = 10.
| '''ζ (zeta)''' || Damping ratio. Fraction of critical damping. ζ = 5 % for Q = 10.
|-
|-
| '''Primary SRS''' || SRS computed on the shock transient segment [t_start, t_end].
| '''Primary SRS''' || SRS computed on the shock segment [t_start, t_end].
|-
|-
| '''Residual SRS''' || SRS computed on the post-shock segment [t_end, end]. Captures ring-down.
| '''Residual SRS''' || SRS computed on the post-shock segment [t_end, end]. Captures ring-down.
|-
|-
| '''SRSS''' || Square Root Sum of Squares. Multi-axis resultant: √(SRS_x² + SRS_y² + SRS_z²).
| '''SRSS''' || Square Root Sum of Squares: √(SRS_x² + SRS_y² + SRS_z²).
|-
| '''Envelope''' || Point-by-point maximum across channels: max(SRS_x, SRS_y, SRS_z) at each frequency.
|-
| '''Pseudo-velocity''' || SV = SA / ωn. Derived from acceleration SRS assuming harmonic motion.
|-
| '''Pseudo-displacement''' || SD = SA / ωn². Derived from acceleration SRS assuming harmonic motion.
|-
| '''Margin (dB)''' || M = 20·log₁₀(Limit / SRS). Positive = PASS, negative = FAIL.
|-
| '''Padding''' || Extra time margin added symmetrically to both sides of the detected shock zone.
|-
| '''Pyroshock''' || Shock produced by explosive or pyrotechnic devices (separation bolts, pin pullers…).
|-
| '''NVDrive''' || OROS TCP protocol for communicating with NVGate programmatically.
|-
| '''.orm''' || NVGate JSON metadata file for one channel (sampling rate, unit, channel name…).
|-
| '''.ors''' || NVGate binary signal file (raw float32 samples, SI units, little-endian).
|}
 
----
 
= Appendix A — Supported Units =
 
{| class="wikitable"
|-
|-
! Input unit !! Physical quantity !! Vel/Disp SRS available
| '''Envelope''' || Point-by-point max across channels: max(SRS_x, SRS_y, SRS_z).
|-
|-
| m/s², g || Acceleration || Yes
| '''Pseudo-velocity''' || SV = SA / ωn. Derived from acceleration SRS.
|-
|-
| m/s, mm/s || Velocity || No
| '''Pseudo-displacement''' || SD = SA / ωn². Derived from acceleration SRS.
|-
|-
| m, mm, µm || Displacement / Length || No
| '''Margin (dB)''' || 20·log10(Limit / SRS). Positive = PASS, negative = FAIL.
|-
|-
| N, kN || Force || No
| '''Padding''' || Extra time added symmetrically around the auto-detected shock zone.
|-
|-
| V, mV || Voltage || No
| '''Pyroshock''' || Shock from explosive devices (separation bolts, pyrocutters, pin pullers…).
|-
|-
| Pa, N/m², bar || Pressure || No
| '''.orm''' || NVGate JSON metadata file — sampling rate, unit, channel name.
|-
|-
| rad/s, RPM || Angular velocity || No
| '''.ors''' || NVGate binary signal — raw float32 samples in SI units, little-endian.
|-
|-
| rad/s² || Angular acceleration || No
| '''NVDrive''' || OROS TCP protocol for programmatic communication with NVGate.
|}
|}
Velocity and Displacement SRS derivation is only physically meaningful when the input signal is an acceleration. For other unit types, only the acceleration SRS (in the native unit) is computed.
----
= Appendix B — CSV Limit Curve Format =
User-defined limit curves must be provided as plain CSV with two columns:
# Frequency in Hz
# Level in g
Rules:
* At least 2 breakpoints required
* Frequency must be strictly increasing
* No header row needed (automatically detected and skipped if non-numeric)
* Separator: comma or semicolon (auto-detected)
Example:
<pre>
10, 5
100, 50
2000, 50
10000, 50
</pre>
Interpolation between breakpoints is linear in log-log space (the natural space for SRS).
Extrapolation beyond the defined range uses the nearest endpoint value.


----
----


''Documentation generated for SRS Tool — OROS / Gemini project.''
<div style="font-size:10px; color:#666; text-align:center; margin-top:24px; border-top:1px solid #444; padding-top:10px;">
''Algorithm reference: D.O. Smallwood, "An Improved Recursive Formula for Calculating Shock Response Spectra", Shock and Vibration Bulletin, 1981.''
Algorithm reference: D.O. Smallwood, ''An Improved Recursive Formula for Calculating Shock Response Spectra'', Shock and Vibration Bulletin, 1981.
Standards: MIL-STD-810H (2019), ECSS-E-ST-10-03C (2012), NASA-STD-7003A (2011), DEF-STAN 00-35 Part 3 (2021).
</div>

Revision as of 15:46, 17 April 2026

SRS Tool
Developer OROS / Gemini
Platform Windows 10 / 11
Language Python 3.9+
UI framework PySide2 (Qt 5.15)
Algorithm Smallwood 1981
NVGate I/O Native (.ors / .orm)
Standards 30+ built-in curves

SRS Tool — Shock Response Spectrum Analyser

SRS Tool is a professional Shock Response Spectrum (SRS) analysis application tightly integrated with the OROS NVGate measurement platform. It reads shock recordings directly from NVGate project folders, computes SRS using the industry-standard Smallwood (1981) recursive digital filter, and pushes results back into NVGate as live TCP result channels — all within a single dark-themed desktop application.

SRS Tool — Main tab with a triaxial shock recording loaded (x, y, z channels). Time signal with auto-detected shock zone (top) and log-log SRS plot (bottom).

What makes SRS Tool stand out

Most SRS tools require manual import/export and provide no built-in normative database. SRS Tool is built differently:

Key differentiators vs commercial alternatives (nCode GlyphWorks, LMS TecWare, Brüel & Kjær Pulse)

Feature SRS Tool Typical tools
30+ built-in normative limit curves (MIL-STD-810H, ECSS, NASA, DEF-STAN…) — no manual entry needed ✔ Included ✘ Manual / paid add-on
Multi-channel Pass/Fail with per-channel verdict in one run ✔ Included ✘ One channel at a time
Direct NVGate signal read (no DLL, no NVGate open) ✔ Native ✘ Manual export required
NVGate TCP result injection (log-log, autoscaled) ✔ Native ✘ Not available
Automatic shock zone detection (envelope algorithm) ✔ Included ~ Optional / extra
Primary + Residual SRS in a single computation pass ✔ Included ~ Two separate analyses
SRSS + Worst-case Envelope multi-axis combination ✔ Included ✘ Paid add-on
Interactive dB cursor on Pass/Fail chart ✔ Included ✘ Rarely available
No licence dongle / subscription ✔ Free ✘ Licence required

Quick Start

Five steps from measurement folder to Pass/Fail verdict:

  1. Main tabSelect signal folder… → navigate to the NVGate Measurement folder
  2. Shock zone is auto-detected — yellow markers appear on the signal plot
  3. Set Q = 10, range 1–10 000 Hz, resolution 1/12 oct → click Compute SRS
  4. Pass / Fail tab → limit curve is pre-set to MIL-STD-810H Mid-field → click ▶ Run Pass / Fail
  5. Read the verdict, export CSV/PNG, or click Inject into NVGate

Installation

Requirements

Component Version Notes
Python 3.9 – 3.11 3.12 not yet tested
PySide2 5.15.x Qt5 binding
NumPy ≥ 1.22 Vectorised SRS engine
Matplotlib ≥ 3.5 Embedded canvases
Pillow ≥ 9.0 Optional — only for screenshot export
pynvdrive OROS Toolkit NVdrive Required for NVGate injection only

Launch

<syntaxhighlight lang="bash"> cd C:\OROS\Gemini\SRS python -m src.main </syntaxhighlight>

Or use the provided launch_srs.bat shortcut.

💡 NVGate does not need to be running to load signals or compute SRS. It is only required for the Inject into NVGate function.


User Interface

The window has two zones:

  • Left panel (340 px) — tabbed controls: Main, Advanced, Pass / Fail
  • Right panel (expandable) — signal plot + SRS plot, or Pass/Fail chart depending on active tab

The status bar at the bottom shows the current operation, computation result, and NVGate injection status. A progress bar appears during SRS computation.


Main Tab

Main tab controls — NVGate status, Signal folder, Channels, Calculation parameters, Output type, Compute and Inject buttons.

NVGate connection

A dot in the NVGate box shows live connection status, polled every 3 seconds:

  • 🟢 Connected — NVGate is reachable via pynvdrive. Injection is available.
  • 🔴 Disconnected — NVGate is not running, or pynvdrive is not installed. SRS computation still works normally.

Signal

Select signal folder…
Opens a folder browser (default root: C:\OROS\NVGate data\Projects).
 Select the Measurement subfolder (e.g. …\MyProject\Measurement3).
 Channels are detected and the signal is loaded immediately.

The folder path is shown in grey below the button (truncated to 50 characters for readability).

Channels

One checkbox per recorded channel:

☑  x   (25600 Hz   13.86 s   m/s²)
☑  y   (25600 Hz   13.86 s   m/s²)
☑  z   (25600 Hz   13.86 s   m/s²)

Channel labels (x, y, z…) are read from the Name field in the NVGate .orm metadata file, set by the operator at recording time. If empty, falls back to the hardware source name ("Input 1", "Input 2"…).

Uncheck a channel to exclude it from the computation.

↺ Reload channels
Re-reads channel files from disk — useful after a new NVGate recording in the same folder without re-browsing.

Calculation Parameters

Parameter Description Default
Frequency range f_min and f_max for the SRS output 1 Hz → 10 000 Hz
Q factor / Damping Quality factor Q or damping ratio ζ (interchangeable) Q = 10
Resolution Octave fraction: 1/3, 1/6, 1/12, 1/24 octave 1/12 octave

ℹ f_max is automatically clamped to the Nyquist frequency (f_s / 2). Q = 10 (ζ = 5%) is the standard value for all major aerospace shock norms (MIL-STD-810H, ECSS, NASA-STD-7003A).

Output

Type
Acc — Acceleration SRS (m/s² or g). Always available.
 Vel — Pseudo-Velocity SRS. Available for acceleration inputs only.
 Disp — Pseudo-Displacement SRS. Available for acceleration inputs only.
Curve
Maximax — max(positive, |negative|). The standard SRS required by most norms.
 Positive — maximum positive SDOF response.
 Negative — maximum absolute negative response (plotted as positive).

Signal and SRS plots

Time signal with auto-detected shock zone (yellow dashed markers). The yellow-shaded area is the primary SRS window. Drag to refine.
SRS log-log plot — 3 channels (x blue, y orange, z green) computed on the shock zone. The legend identifies each curve.

The right panel shows two stacked plots:

  • Top — Time signal: all loaded channels overlaid. The yellow dashed vertical lines delimit the shock zone. Drag horizontally on the plot to redefine it. The zone can also be set precisely in the Advanced tab.
  • Bottom — SRS (log-log): all computed curves with a legend. Draw order: real channels first, then Envelope (orange dash-dot), then SRSS (white dashed) on top.

Advanced Tab

Advanced tab — Shock zone (auto-detection + manual override), Residual SRS, Preprocessing, Multi-axis combination.

Shock Zone

⚡ The shock zone is auto-detected automatically every time a signal is loaded. You normally do not need to change anything here.

Auto-detection algorithm

  1. Compute a smoothed envelope: rolling mean of |signal| over a 3 ms window
  2. Set trigger threshold = Threshold % of the peak envelope
  3. Shock zone = first … last sample above the threshold
  4. Expand by Padding ms on each side, clamped to signal bounds
Parameter Effect Default
Threshold (% of peak) Lower → wider zone (catches low-level pre/post-shock). Higher → core impact only. 5 %
Padding (ms) Extra margin added symmetrically on both sides of the detected shock. 20 ms

Padding explained: if the shock is detected at 8.14 s – 9.98 s with 20 ms padding, the zone becomes 8.12 s – 10.00 s. This captures the full transient including ring-down.

Manual override

Type Start and End in seconds (3-decimal precision). The yellow markers on the signal plot update instantly. Dragging on the signal plot synchronises back to these fields.

Residual SRS

When Also compute residual SRS is checked, a second computation runs on the signal segment after the shock zone end. This captures the free vibration decay required by:

  • MIL-STD-810H Method 517.2 § 2.1.3
  • ECSS-E-ST-10-03C clause 8.4.3

The residual curves appear on the SRS plot labelled "(residual)".

Advanced Preprocessing

Applied to the signal before the SRS filter:

Option Effect Typical use
Remove DC offset (N ms) Subtracts the mean of the first N ms from the entire signal Sensor bias, slow drift
Noise floor (N ms) Zeroes out the first N ms Pre-trigger noise before the shock event

Multi-axis Combination

Available when 2 or more acceleration channels are loaded (e.g. triaxial x/y/z accelerometer).

SRSS — √(SRS₁² + SRS₂² + …)
Square Root Sum of Squares of all channels — Maximax only. Shown as a white dashed curve.
Worst-case envelope — max(SRS₁, SRS₂, …)
Point-by-point maximum across all channels — all curve types. Shown as an orange dash-dot curve.

See the calculation section for the mathematical definitions.


Pass / Fail Tab

Pass/Fail controls — limit curve selector with built-in library, scale factor, channel selector, Run button and export buttons.

The Pass/Fail tab compares the computed SRS against any normative or user-defined limit curve.

Limit Curve Library

📚 SRS Tool includes 30+ pre-programmed normative limit curves — no other standalone SRS tool provides this ready-to-use library. Select a standard from the dropdown and run immediately.

Standard Curves
MIL-STD-810H Method 517 Near-field, Mid-field ★, Far-field, Gunfire, Tall vehicles
ECSS-E-ST-10-03C Protoflight, Proto+, Acceptance, Qualification, Protoqualification
NASA-STD-7003A Payload near/far-field, structure-borne near/far
DEF-STAN 00-35 Land vehicle, Ship (deck), Airborne external/internal
MIL-S-901D High-impact shock Grade A / Grade B
IEST-RP-DTE032 Light / medium / heavy equipment
RTCA DO-160G Avionics Cat. A / B / C

★ MIL-STD-810H Mid-field is set as the default — the most common specification in equipment qualification programmes.

Each curve shows its normative reference and a plain-English description of applicability.

User-defined CSV

Select ← User-defined (CSV) and click Load CSV limit curve…. Format: two columns (Hz, g), no header needed:

10, 5
100, 50
2000, 50
10000, 50

Interpolation is linear in log-log space between breakpoints.

Scale factor (dB)

Shifts the limit curve uniformly before comparison:

L_scaled(f) = L_nominal(f) × 10^(dB/20)
dB Multiplier Effect
+6 dB ×2.00 Tighter / more conservative limit
+3 dB ×1.41 Standard qualification margin check
0 dB ×1.00 Nominal — no change
−6 dB ×0.50 Relaxed limit

Running Pass/Fail

Pass/Fail result — 3 channels (x/y/z) vs MIL-STD-810H Mid-field limit (red dashed). All channels well within spec: margin subplot shows 30–60 dB margin across the full frequency range (green fill).

Click ▶ Run Pass / Fail. The right panel shows:

Top chart — SRS vs Limit

  • Each channel plotted in a distinct colour
  • Limit curve: red dashed line
  • Red fill where SRS > limit (exceedance)
  • Orange fill where 0 ≤ margin < 3 dB (caution)

Bottom chart — Margin (dB)

Margin at each frequency: M(f) = 20 × log10( Limit(f) / SRS(f) )

Fill colour Meaning
Green M ≥ 3 dB — well within spec
Orange 0 ≤ M < 3 dB — caution, low margin
Red M < 0 dB — FAIL, exceedance

Interactive cursor

Move the mouse over either chart panel to see a live floating readout snapped to the nearest frequency band:

 f        342.2 Hz
 SRS       18.45 g
 Lim       50.00 g
 dB        +8.7
             PASS

The readout border turns green (PASS), orange (< 3 dB), or red (FAIL).

Verdict text

The result box below the chart shows the global verdict, per-channel minimum margin, and a table of the 10 worst exceedances. Example:

PASS   —   Maximax SRS
Limit: MIL-STD-810H Meth.517 — Mid-field (0.5–1.5 m)

Per-channel result:
  PASS  x     min +42.1 dB @ 500 Hz
  PASS  y     min +38.7 dB @ 342 Hz
  PASS  z     min +45.3 dB @ 1000 Hz

Worst margin (all channels): +38.7 dB  @  342.0 Hz
No exceedance detected over the computed frequency range.

Export

Export CSV…
Full comparison table. Multi-channel output includes one SRS column per channel, Worst SRS, Limit, per-channel margin, Worst margin and Status. The CSV header block records the curve name and scale factor for traceability.
Export graph PNG…
Both chart panels saved as a PNG at 150 dpi (PDF also available).

NVGate Integration

Reading signals

SRS Tool reads NVGate data without NVGate open and without any additional DLL.

File layout inside a Measurement folder:

Measurement8/
  Record_1.oxf
  Record_1_1/
    Channel_1_0_XXXXXXXX/
      Channel_1.orm    ← JSON metadata (fs, unit, Name…)
      Part_0.ors       ← raw float32 little-endian samples (SI)
    Channel_2_0_XXXXXXXX/
      …

The .ors file contains 32-bit IEEE 754 float samples in SI units at the native sampling rate. The channel label is read from the Name field of .orm (set by the operator in NVGate).

Injecting results

Results are sent to NVGate via the NVDrive TCP protocol as NVD REAL SPECTRUM channels:

  • Each SRS curve → one TCP result channel in NVGate
  • X and Y axes automatically set to log scale
  • Y axis autoscaled
  • All curves displayed in window SRS_Results of Layout1

NVGate channel naming:

SRS Acc Shock AbsMax: x
SRS Acc Shock AbsMax: y
SRS Acc Shock AbsMax: z
SRS Acc Shock AbsMax: SRSS  (x + y + z)

Mathematical Background

Shock Response Spectrum — Definition

The SRS is defined as the peak absolute acceleration response of a bank of Single Degree Of Freedom (SDOF) oscillators, each tuned to a different natural frequency f_n, driven by a common base acceleration signal.

For a SDOF oscillator at frequency f_n with damping ratio ζ:

z(t) + 2ζωn·z'(t) + ωn²·z(t) = −x(t)

where x(t) is the base acceleration and z(t) the relative displacement.

The three SRS values at frequency f_n:

Curve Definition Label in tool
Positive SRS max over time of [ωn² · z(t)] Positive
Negative SRS max over time of [−ωn² · z(t)] Negative
Maximax SRS max(Positive, Negative) Maximax ← standard

Smallwood Recursive Digital Filter (1981)

Direct numerical integration of the SDOF equation is slow. D.O. Smallwood (Sandia National Laboratories, 1981) derived an exact recursive digital filter whose coefficients depend only on f_n, ζ and the time step Δt:

Let:

  • ωd = ωn · √(1−ζ²) (damped natural frequency)
  • E = exp(−ζ·ωn·Δt)
  • K = ωd·Δt

Filter coefficients:

b₀ = 1 − E·sin(K)/K b₁ = 2·(E·sin(K)/K − E·cos(K))
b₂ = E² − E·sin(K)/K a₁ = 2·E·cos(K)
a₂ = −E²

Recursive equation at each time step k:

y[k] = b₀·x[k] + b₁·x[k-1] + b₂·x[k-2] + a₁·y[k-1] + a₂·y[k-2]

Vectorised implementation

SRS Tool computes all N natural frequencies in a single forward pass through the signal. Coefficient arrays (b₀ … a₂) have shape (N,) and the update at each time step is one NumPy broadcast operation across all oscillators simultaneously. This is typically 50–100× faster than a frequency-by-frequency loop.

Frequency Axis

Logarithmic spacing at 1/n octave resolution:

f_k = f_min × 2^(k/n), k = 0, 1, …, N−1
Resolution Bands/octave Bands over 1–10 000 Hz
1/3 octave 3 40
1/6 octave 6 80
1/12 octave 12 160 ← default
1/24 octave 24 320

Quality Factor and Damping

Q = 1 / (2ζ) ↔ ζ = 1 / (2Q)
Q factor Damping ζ Typical application
10 5 % Standard aerospace — MIL-STD-810, ECSS, NASA
50 1 % Very lightly damped structures
5 10 % Heavily damped, rubber-mounted equipment

Primary and Residual SRS

Given shock zone [t_start, t_end]:

Zone Signal segment Physical meaning
Primary SRS [t_start, t_end] Response during the shock transient
Residual SRS [t_end, end] Free vibration decay after the shock

The residual SRS is mandatory for MIL-STD-810H Method 517 and ECSS-E-ST-10-03C fragility assessments. A structure failing on residual SRS continues to be excited by stored elastic energy after the shock passes.

Pseudo-Velocity and Pseudo-Displacement SRS

Derived analytically from the acceleration SRS (valid under the harmonic motion assumption):

Quantity Formula Unit (if SA in m/s²)
Pseudo-Velocity SV(fn) = SA(fn) / (2π·fn) m/s
Pseudo-Displacement SD(fn) = SA(fn) / (2π·fn)² m

Multi-Axis Combination

SRSS — Square Root Sum of Squares

For triaxial channels x, y, z — applied to Maximax only:

SRSS(fn) = √( SA_x(fn)² + SA_y(fn)² + SA_z(fn)² )

Represents the Euclidean norm of the response vector — worst-case resultant regardless of shock direction.

Worst-Case Envelope

ENV(fn) = max( SA_x(fn), SA_y(fn), SA_z(fn) )

Point-by-point maximum at each frequency band. Applied to all curve types (Maximax, Positive, Negative). Required by ECSS-E-ST-10-03C Appendix H when the governing axis can change with frequency.

Pass/Fail Margin

M(f) = 20 · log10( Limit(f) / SRS(f) )

The 3 dB threshold (factor √2 ≈ 1.41) is the standard minimum acceptable margin in most aerospace shock specifications.


Supported Units

Input unit Physical quantity Vel / Disp SRS
m/s², g Acceleration ✔ Available
m/s, mm/s Velocity ✘ No
m, mm, µm Displacement ✘ No
N, kN Force ✘ No
V, mV Voltage ✘ No
Pa, N/m², bar Pressure ✘ No
rad/s, RPM Angular velocity ✘ No

Glossary

Term Definition
SRS Shock Response Spectrum — peak SDOF response as a function of natural frequency.
Maximax max(Positive SRS, Negative SRS) — the absolute maximum, required by most norms.
SDOF Single Degree Of Freedom — a mass-spring-damper system with one resonance frequency.
Q factor Quality factor. Q = 1/(2ζ). Sharpness of resonance. Q = 10 is standard.
ζ (zeta) Damping ratio. Fraction of critical damping. ζ = 5 % for Q = 10.
Primary SRS SRS computed on the shock segment [t_start, t_end].
Residual SRS SRS computed on the post-shock segment [t_end, end]. Captures ring-down.
SRSS Square Root Sum of Squares: √(SRS_x² + SRS_y² + SRS_z²).
Envelope Point-by-point max across channels: max(SRS_x, SRS_y, SRS_z).
Pseudo-velocity SV = SA / ωn. Derived from acceleration SRS.
Pseudo-displacement SD = SA / ωn². Derived from acceleration SRS.
Margin (dB) 20·log10(Limit / SRS). Positive = PASS, negative = FAIL.
Padding Extra time added symmetrically around the auto-detected shock zone.
Pyroshock Shock from explosive devices (separation bolts, pyrocutters, pin pullers…).
.orm NVGate JSON metadata file — sampling rate, unit, channel name.
.ors NVGate binary signal — raw float32 samples in SI units, little-endian.
NVDrive OROS TCP protocol for programmatic communication with NVGate.

Algorithm reference: D.O. Smallwood, An Improved Recursive Formula for Calculating Shock Response Spectra, Shock and Vibration Bulletin, 1981. — Standards: MIL-STD-810H (2019), ECSS-E-ST-10-03C (2012), NASA-STD-7003A (2011), DEF-STAN 00-35 Part 3 (2021).