Hippony Cutoff by Hippony LabResearch prototype · Methods appendix · reviewed 11 October 2026
Theory, implementation and interpretation

How a cutoff becomes a provisional choice

This appendix explains the actual C3D app: what it computes, why each check matters, and how to read a result. A frequency pair can pass the declared rules without being the true optimal pair for human joint moments.

Choose your scope: marker-only analysis provides a marker diagnostic. Marker + force analysis checks a matched starting pair against recorded force features. Joint moments are an optional additional assessment requiring supported participant calibration; loading a capable recording does not enable them automatically.
Published basis and app choices: Live uploads compute both Winter’s displacement residual-tail method and an adaptation of residual autocorrelation described by Challis on the same selected marker coordinates. Mai and Willwacher studied filter combinations in distance running; their results do not establish a universal matched pair. The top-three shortlist, matched force convention, force/moment limits and eligibility gates are this app’s engineering choices, rather than paper-validated acceptance rules.
The central distinction: sensitivity is a change between processing choices; accuracy is agreement with a defensible independent truth or reference. This app measures the former and applies provisional eligibility rules. It does not establish the latter for its human model.
Start here

1. Practical walkthrough

  1. Prepare an unfiltered continuous recording. Upload a dynamic C3D with physical marker coordinates. Confirm length units, native sampling rates, preprocessing history and, when using force, calibration, platform, vertical axis, sign and synchronization. Signal screening accepts walking or running; landing is not supported in this release.
  2. Decide which output you need. Marker and force diagnostics can be available even when a compatible moment model is unavailable. Experimental joint moments additionally require a supported physical protocol, same-participant static calibration, measured mass and height, and reviewed load assignment. Public examples use their recorded calibration metadata.
  3. Run the checks for your chosen scope. Both residual methods propose marker starting settings. ACF ranks residual autocorrelation; Winter fits displacement residual tails and aggregates coordinate crossings. With force enabled, the app inspects a small matched-cutoff pool and changes in recorded peaks and impulse. Explicitly enable optional moments to compare calculated outputs on identical contacts. Force matching is a processing convention, not an independent force-noise estimate.
  4. Read both method recommendations before the curves. Compare their frequencies and assumptions. Agreement does not establish accuracy; disagreement describes method sensitivity. Joint moments are optional. Without their required inputs, or when calculation is skipped or fails, the app retains an available marker-and-GRF provisional pair; with insufficient force support it reports only marker diagnostics. It explicitly states that moment sensitivity was not assessed. When moments are calculated, A provisional three-measure pair is issued only if all required evidence is complete and at least one candidate is eligible. A diagnostic starting pair may be retained even when it fails a force limit. A calculated moment plot does not promote that starting pair to a passed recommendation.
  5. Investigate deficits and export the evidence. Review excluded markers, contacts, reconstruction checks, tested cutoffs and failed limits. Save the report, decision JSON, tables and moment provenance. Changing a tolerance changes the question; it does not improve the underlying measurement.

Winter residual construction and uncertainty

For each complete marker coordinate, compute R(fc)=1N∑i(xi−x^i(fc))2. Fit a line R=afc+b to the designated high-frequency tail, then find the residual-curve crossing R(fc)=b. This follows Winter (2009), Eq. 3.9 and §3.4.4.3, printed pp. 70–73. The live implementation aggregates coordinate crossings by their median. [2]

The live grid uses 1 Hz steps from 2 Hz to 90% of the recording’s native marker Nyquist. The primary tail is 50–70% of native Nyquist; 40–60% and 60–80% tails test sensitivity. The same 1 s interior trimming and selected coordinates as ACF are used; temporal halves test window sensitivity. Failed coordinate fits and crossings are reported. The live estimate keeps its numerical crossing frequency, and force features are checked at that exact matched frequency. These tail bands, trimming and aggregation are engineering choices, not validated automatic rules from Winter. Position and acceleration tests with known synthetic signals showed different best cutoffs; no method was universally preferable. A residual-based displacement choice cannot establish the optimal cutoff for joint moments.

Public-data example · separate from your file

Saved Winter example

Separate saved Winter experiment: markers 21 Hz, forces 21 Hz

The separately reviewed Winter residual experiment for Fukuchi RBDS001runT35 (participant 001, 3.5 m/s) provides a 21 Hz marker / 21 Hz force provisional starting pair. The marker choice rounds the median coordinate residual estimate of 21.47 Hz. Changing the prespecified residual-tail fitting interval gives medians from 19.37 to 22.05 Hz; this is method sensitivity, not a confidence interval. The force cutoff matches the marker cutoff as an explicit processing choice, not a cutoff independently derived by Winter's marker method.

At this pair, worst force-peak change is 2.618% and impulse change 0.057% relative to the unfiltered recording. Across 76 retained moment contacts, changing from 20/20 to 21/21 Hz gives a maximum contact–joint–axis RMS difference of 0.0233 Nm/kg and maximum absolute signed-extrema difference of 0.0800 Nm/kg. These changes quantify sensitivity, not error. Force screening and moment calculations use their separately documented contact cohorts.

The saved panel is a reviewed experiment on nine identified running recordings; it is not an automatic Winter calculation for a new upload. The existing strict three-check rule remains available separately and can still report that no pair passes its engineering limits. Such a result does not invalidate a transparently labeled starting candidate, nor does the candidate establish accuracy. The one-contact recording RBDS002runT45 has illustrative waveforms only and no supported moment recommendation.

Saved-experiment provenance: output/winter_residual_comparison/results.json, moment_evidence.json and protocol.txt. The saved demonstration is shown only in its own section; it never supplies a current-upload result.

Published motivation

2. Why filtering affects joint moments

Position and orientation must be differentiated to estimate velocities and accelerations. For a sinusoidal position component of frequency f, taking two derivatives multiplies its amplitude by (2πf)². Thus small high-frequency fluctuations can become prominent in acceleration. Filtering attenuates those fluctuations, but can also remove genuine movement. The basic signal-processing and mechanics background is covered by Winter and by Robertson and colleagues; the cited publisher contents identify relevant chapters. [2] [3]

x(t)=Asin(2πft)⇒x¨(t)=−(2πf)2Asin(2πft)
(1)

Differentiation amplifies high-frequency components

In words: acceleration amplitude equals position amplitude multiplied by the square of angular frequency. This mathematical example explains noise amplification; it does not identify which measured frequencies are noise.

Inverse dynamics balances inertial terms against external forces and moments. Filtering movement and force differently can disturb that balance, particularly around impact. Bisseling and Hof investigated impact handling; Kristianslund and colleagues showed filter-dependent moments and participant rankings in sidestep cutting. These studies motivate outcome-specific sensitivity checks. They do not establish universal thresholds for this app. [4] [5]

What the supplied Journal of Biomechanics paper actually tested

Mai and Willwacher studied 94 rearfoot runners at approximately 3.5 m/s. They compared six kinematic/force combinations: 10/10, 10/50, 10/100, 20/20, 20/50 and 20/100 Hz, using a recursive fourth-order Butterworth filter and a lower-limb rigid-body model. Their internal moments were mass-normalized and interpolated to 201 stance points. Filter choices altered moment waveforms, participant ranking and estimated footwear effects. [1]

They proposed matched or similar cutoffs near 20 Hz for their traditional running analysis, balancing impact-feature retention and moment fluctuations. Their discussion explicitly notes rigid-shell tracking clusters and the need for replication with skin-mounted tracking markers. This app uses a different model, dataset and precisely declared cutoff convention; the supplied paper does not validate its anatomy, 5%/2% force limits, 0.02/0.05 Nm/kg moment limits, or automatic rule. Its six-pair experiment is scientific motivation, not the app's current adaptive selector. [1]

Meaning of “optimal”. A true error-minimizing cutoff would require a defined outcome and a trustworthy reference for that outcome. Raw force, residual whiteness, smoothness and agreement among several filtered curves are not such a reference. The app therefore reports provisional eligibility rather than a validated optimum.
Implemented calculation

3. Exact filter and cutoff definition

The app uses an offline forward/backward Butterworth low-pass filter in second-order sections: order n = 2 per pass, two passes and odd reflection padding. The combined response is zero-phase away from finite-record boundary effects. Its asymptotic attenuation order is four, but its transfer response is not the same as a single-pass fourth-order Butterworth. SciPy defines its design cutoff at the single-pass −3 dB point; forward/backward filtering squares the magnitude response. [7] [8]

Let fs be the native sampling rate, fc the displayed cutoff, and fd the design cutoff passed to SciPy. With a bilinear-transform Butterworth design, the ideal combined amplitude response is:

A2(f)=|H1(f)|2=11+[tan(πf/fs)tan(πfd/fs)]2n
(2)

Combined amplitude response

This is an amplitude response, not a power spectrum.

The app's final_3db convention chooses fd so that A2(fc) = 1/√2, or approximately −3.0103 dB:

fd=fsπarctan(tan(πfc/fs)(2−1)12n)
(3)

Exact digital compensation used by the app

The order per pass is 2. Setting the design cutoff equal to the requested cutoff directly would give 0.5 amplitude, approximately −6.0206 dB, after two passes at that frequency.

Marker and force signals are filtered at their own native rates. Every tested cutoff is strictly between zero and its signal's Nyquist frequency, fs/2. Matching numerical cutoffs aligns the defined attenuation frequency; it does not make every frequency-response detail identical across different sample rates. Coefficients, native rates, padding length and actual design cutoff are exported. Odd-padding length follows SciPy's SOS rule; for this order-2 low-pass implementation it is nine samples. Very short signals are rejected. [8]

Implementation: cutoff_tool/filtering.py, design_filter, lowpass and response. Equations (2)-(3) describe the implemented response and its algebraic compensation; they are not attributed to the supplied paper.

Measure 1

4. Marker residual autocorrelation

The removed residual for coordinate j and cutoff c is rc,j = raw position − filtered position. It is not the C3D camera-reconstruction residual flag. The app ranks how little temporal correlation remains in this removed signal, under the assumption that measurement noise should be approximately white. Challis introduced an autocorrelation-based cutoff procedure; the finite windows and aggregation below are this app's adaptation, not an exact replication or a statistical test of whiteness. [6]

For a window of N residual samples, subtract that window's residual mean. Write the centered samples as ui. For positive lag k, the code uses the same full-window energy denominator at every lag:

ρc,j,w(k)=∑i=0N−k−1uiui+k∑i=0N−1ui2
(4)

Biased normalized sample autocorrelation

The numerator uses overlapping pairs; the denominator uses all N samples. A constant residual has undefined autocorrelation and is not given a perfect score.

S(c;w,K)=medianj∈J[1K∑k=1Kρc,j,w2(k)]
(5)

Dimensionless residual ranking score

In words: average the squared autocorrelations across the chosen positive lags for each coordinate, then take the median across the same included coordinates. Lower scores rank first. Lag zero is excluded because normalized autocorrelation there is one.

Windows, coordinate inclusion and stability

Adaptive grid

The initial marker grids are 5, 6, 10, 15, 20, 25, 30 Hz for running and 4, 5, 6, 8, 10, 12, 15, 20 Hz for walking, after Nyquist exclusions. If the winner is the upper boundary, extend upward by 5 Hz while the next value is no greater than fs/2 − 5 Hz, up to 40 extensions. Then insert 1 Hz samples between the coarse neighbors around the current winner and recompute all scores with consistent coordinate inclusion. The evaluated grid, stopping reason and remaining boundary status are saved.

The code does not search below the initial lower boundary and does not iterate refinement until a global optimum is found. A refined winner can still be unstable or on a boundary. Colored noise, coherent artifact and soft-tissue movement can all undermine the noise-like residual assumption. The top three are an engineering inspection list, not a confidence interval.

Implementation: noise_diagnostics.py and residual informativeness checks in screening.py.

Measure 2

5. Force preservation on fixed contacts

Use the selected platform's signed vertical force F0(t) in newtons. A contact is a contiguous run of samples strictly above the raw threshold (default 20 N). Its first and last above-threshold sample define the interval. Recording-edge contacts and intervals shorter than 0.08 s for running or 0.15 s for walking are rejected. The app does not smooth the event signal or bridge interruptions. Threshold and minimum duration are adjustable; inspect noisy crossings.

The continuous raw force is filtered at every candidate cutoff. The same contact samples are used for raw and filtered summaries. For retained contact q, peak P is the maximum vertical force; impulse I is the trapezoidal time integral over those samples:

Pc,q=maxi∈qFc(ti)Ic,q=∑i=0Nq−2Fc(ti)+Fc(ti+1)2(ti+1−ti)
(6)

Contact peak (N) and impulse (N·s)

Subscript 0 means the raw recording; c means a filtered candidate.

EP(c)=maxq100|Pc,qP0,q−1|EI(c)=maxq100|Ic,qI0,q−1|
(7)

Worst absolute percentage changes

The denominator is the raw contact peak or raw contact impulse, not body weight, filtered force or the largest value across all contacts. Each retained raw sample exceeds a positive threshold, so these raw denominators are positive. Signed changes remain in contact tables; eligibility uses their absolute values.

The default force pass requires at least two complete contacts and EP ≤ 5% and EI ≤ 2%. Both limits are user-adjustable engineering tolerances. The force grid initially contains 5 to 100 Hz in 5 Hz increments plus 6 Hz, with native force Nyquist exclusions; eligible marker-grid values are added for matched comparisons.

Different checks have different support

CalculationFixed support ruleMeaning
Marker residual rankingOne-second trim at each recording end; then interior and halves.Live ACF-score and Winter-construction panels also trim 1 s; marker-summary CSV uses its separately declared comparison guard.
Marker RMS/acceleration summariesGuard gm = 3/min(marker grid), in seconds.Three cycles of the lowest marker cutoff.
Force screenGuard gF = max(gm, 3/min(force grid)). Only contacts fully inside this force-clock interior remain.Every force cutoff uses the same contacts; feet are pooled on the selected plate.
Experimental Fukuchi momentsFixed side-assigned model contacts, valid marker support and 0.5 s guards at valid-segment boundaries.These contacts can differ from signal-screen contacts and are unchanged by the screen's event controls.

These guards are declared heuristics, not proof that every boundary effect has disappeared. Raw-force preservation can preserve noise, resonance or artifact. Passing also does not verify horizontal force, center of pressure, free moment, loading rate or waveform accuracy.

Implementation: screening.py, analysis.contact_events and analysis.integral. The numerical limits and guard choices are project rules.

Mechanics behind measure 3

6. Experimental inverse dynamics and reporting conventions

A rigid segment's net force and moment follow Newton-Euler balance. Let ms be segment mass, a the center-of-mass acceleration, g gravitational acceleration, ω angular velocity, α angular acceleration and Iw the inertia tensor expressed in world coordinates. The required nongravitational force and moment about the center of mass are:

Freq=ms(a−g)MCOM=Iwα+ω×(Iwω)
(8)

Rigid-body force and moment balance

Iw=RIbodyRT; g=(0,−9.81,0) m/s².

The rotation tensor maps body-frame vectors to world-frame vectors. For the Fukuchi model, gravity acts along negative global Y.

The app's biorbd calculation is checked against this Newton-Euler expression for reconstructed rigid-segment states. Euler-coordinate generalized torques are converted through the angular-velocity Jacobian to physical moment vectors; they are not treated directly as XYZ moments. Numerical differentiation occurs within valid continuous segments. General kinematics, inertia and inverse-dynamics background is covered by the identified textbook chapters. [2] [3]

Use a common point for wrench arithmetic

A wrench stores moment and force together as [Mx, My, Mz, Fx, Fy, Fz]. All wrenches are first expressed about the same world origin. If p is the center of pressure and T the free-moment vector, the external origin moment is p × F + T. The required origin moment is MCOM + rCOM × Freq. Recursion subtracts applied environmental/distal wrenches, then transfers the remaining proximal moment to joint position pJ:

Wprox=Wreq−WappliedMJ=Mprox,0−pJ×Fprox
(9)

Proximal wrench and shift to the joint point

In words: balance all loads at one origin first; then subtract the force's moment arm to report about the joint. In the chain recursion, distal joint loads are included with their action-reaction sign.

Order of operations matters. In the Fukuchi adapter, raw contact masks first assign the platform wrench to a foot. These gated world-origin wrenches are then filtered at the force rate. Markers are filtered at their native rate and interpolated to the native force clock before pose reconstruction and differentiation. Filtering is confined to valid processing segments; unresolved marker gaps are not crossed. This is not an independently filtered COP calculation or the same operation as the continuous vertical-force screen.

What the displayed XYZ values mean

The reported quantity is a net internal moment acting on the distal segment, not an individual muscle force or direct joint-contact force. For the implemented Z-X-Y reporting projection, use proximal segment Z, distal segment Y, and normalized floating X=Y×Z‖Y×Z‖. The moment vector is dotted with these axes, divided by measured body mass, and multiplied by the adapter’s explicit reporting sign s:

μa(t)=sside,joint,aMJ(t)⋅ea(t)mbody,a∈{X,Y,Z}
(10)

Mass-normalized projected moment, Nm/kg

Before sign adjustment, the dot product divided by body mass is the normalized projection. In the Fukuchi export, the sign is −1 for right-side X and Y at every joint and for ankle Z on both sides; it is +1 for the remaining components. The Carter left-side adapter exports the projection without these additional sign reversals. The denominator is body mass in kilograms, not body weight in newtons or segment mass. These projection axes need not be mutually orthogonal, so the three dot products are not a vector decomposition or Euler generalized torques.

For the Fukuchi model, normalized ACF and Winter moments use the Z-X-Y projections and signs in equation (10). CAST uses distal anatomical XYZ components instead. The exported *_world_Nm arrays retain physical vectors in laboratory coordinates. Read the selected model’s convention before interpreting components.

Do not assign anatomical names or signs from the letters X/Y/Z alone. Consult the model-specific reporting frames and side conventions in the export. The Fukuchi prototype tracks thigh, shank and foot on both sides with a pelvis reference; Carter output is limited to its supported left-side hip/knee/ankle model. Source-model equivalence remains unresolved.

Implementation: rigid3d.py, examples/compare_human_3d.py, experimental_human.py and the separate Carter adapter. Equations (8)-(10) describe the mechanics and explicit reporting conventions, not proof of anatomical validity.

Measure 3

7. Moment sensitivity on identical support

For candidate matched pair c and another compared pair d, let μc,q,j,a,i be the normalized moment sample for contact q, joint j and component a. Only the contact's assigned side is evaluated. Each supported side must contain complete hip/knee/ankle XYZ triplets. Outputs must have exactly the same time samples; the sensitivity routine does no time normalization or interpolation.

Rq,j,a(c,d)=1Nq∑i=1Nq(μc,q,j,a,i−μd,q,j,a,i)2
(11)

Sample-wise RMS waveform difference

The RMS difference is calculated within one complete contact, joint and component. It is not the difference between the two waveforms’ RMS magnitudes and not an average of stance-normalized cycles.

D(c,d)=max(|maxiμc,i−maxiμd,i|,|miniμc,i−miniμd,i|)
(12)

Extrema difference for the same contact/joint/component

Contact, joint and axis subscripts are omitted in (12) for readability. “Positive/negative extrema” in the export means maximum/minimum; neither is forced to have a particular sign. The maxima need not occur at the same sample.

Take the maximum R and maximum D across all contacts, supported joints and components for every comparison against the candidate. A candidate passes only when every comparison has worst RMS ≤ 0.02 Nm/kg and worst extrema difference ≤ 0.05 Nm/kg. No averaging across participants, contacts or components can hide a failing contact.

At least two complete moment contacts are required. Contacts must have continuous native-clock coverage: a rounding allowance of at most one native sample interval is permitted at endpoints; an internal missing sample is not permitted. Every shortlisted candidate uses the identical contact list and identical comparison set, containing at least three matched pairs with a total span of at least 5 Hz. The code also requires consistent finite limits and complete comparison summaries.

These limits are engineering review flags, not published clinical or accuracy tolerances. Moment agreement across cutoffs can coexist with a systematically wrong model or shared artifact. Conversely, failing a sensitivity limit does not prove that every tested cutoff is scientifically unusable; it means this provisional rule cannot endorse one.

Implementation: moment_sensitivity.py, particularly _contact_metrics, _contacts and assess_candidate_moment_sensitivity.

Decision rule

8. From candidates to a provisional pair

First rank all marker cutoffs using equation (5). Take the first three, then intersect with the available force grid: this is the candidate pool. A matched pair uses c for both kinematics and force, written c/c Hz. The comparison set is the pool plus available common-grid anchors nearest the marker winner minus and plus 5 Hz; duplicates are removed. The final span requirement is checked explicitly rather than assumed.

GateRequired evidenceFailure meaning
MarkerInformative scan; unchanged winner across the nine window/lag checks; winner interior to the final grid.Residual evidence cannot support final eligibility.
Force, for a candidateAt least two complete screen contacts; all raw-referenced peak and impulse changes within the entered limits.That candidate is ineligible.
Moment, for a candidateEvery required comparison meets both worst-contact/component limits.That candidate is ineligible.
Common completenessComplete moment assessments for the entire candidate pool, identical contacts/comparison sets/limits, ≥2 contacts, ≥3 pairs, ≥5 Hz span.No final pair, even if one partial assessment looks favorable.

If the common gates pass, select the highest residual-ranked candidate jointly passing force and moment limits. This is a constrained rank choice, not minimization of true moment error, moment magnitude, or smoothness. If no candidate qualifies, withhold the three-measure pair and list the deficits.

The diagnostic starting pair is a separate output

Before moment assessment, the marker/force rule chooses the highest residual-ranked matched candidate in the top-three pool that passes the force limits. If none passes, it retains the highest-ranked common candidate as an explicit trade-off and reports the failing force metrics. Fewer than two force contacts leaves only a marker diagnostic. Automatic moment mode can calculate illustrative curves at these diagnostic settings when the final decision is withheld.

A force-only option is also reported: the lowest force-grid cutoff passing both force limits, or, if none passes, the cutoff minimizing max(peak change/peak limit, impulse change/impulse limit), breaking ties toward the lower cutoff, as an explicit trade-off. It is not silently combined with a marker cutoff into an accepted moment pair. Manual moment cutoffs are user choices; calculating their output does not validate them.

Current methods: residual_matched_v1 supplies diagnostic settings; three_measure_eligibility_v1 supplies the final provisional decision. Implementation: practical_selection.py and app.py. The planar manifest CLI uses a separate rule and is outside this appendix.

Input scope

9. Calibration, reconstruction and load assignment

The C3D signal screen recognizes mm, cm or m marker coordinates, converts them to metres, and excludes a selected marker if any sample is missing or invalid. Exact all-zero XYZ samples are conservatively unavailable even when the camera residual flag is nonnegative. This screen does not fill gaps. Computed angles, virtual outputs or forces stored among point labels must not be selected as physical marker coordinates.

The custom experimental model is a bounded physical protocol

For a new participant, fukuchi_physical_v1 requires a separate static C3D, the same participant and marker placement, measured body mass and height, unique mappings for every required role, millimetre markers, one platform (index 0) in N/Nmm/mm, and an unchanged shared positive-Y vertical frame and origin. Marker and force clocks must have compatible start frames and durations and force sampling must be at least as fast as marker sampling. The user must additionally verify hardware synchronization; matching file dimensions cannot independently establish it.

There are 30 dynamic roles: bilateral ASIS/PSIS; four thigh and four shank markers per side (top/bottom × medial/lateral); three heel markers per side (bottom/lateral/top); and MT1/MT5 per side. Static calibration additionally requires lateral/medial knee and ankle, greater trochanter and MT2 markers on each side, making 42 static roles. Missing static data fails calibration. Read the source placement descriptions and figure, rather than inferring anatomical meaning from labels alone. [9]

Body mass scales segment masses and normalizes reported moments. Segment geometry comes from static physical markers; measured height is retained as required participant metadata and is not an arbitrary substitute for anatomical calibration. The prototype's joint-center, center-of-mass and inertia assumptions remain model assumptions; they do not reproduce every source Visual3D definition.

Exact default Fukuchi segment assumptions

The table below describes examples/compare_human_3d.py:calibrate with default model options, on each side. It is an implementation specification, not a claim that the cited textbooks validate this 3D parameterization. Segment mass is the listed fraction times measured body mass; COM is the listed fraction along the stated reference line. Foot geometry uses heel-to-toe length even though the mechanical proximal joint is the ankle.

SegmentMass / body massCOM fractionReference line and length LTransverse gyration fraction kAxial inertia axis
Thigh0.1000.433Hip to knee0.323Local Y
Shank0.04650.433Knee to ankle0.302Local Y
Foot0.01450.500Heel.Bottom to midpoint of MT1/MT50.475Local X

In each segment's inertial frame the tensor is diagonal. Each transverse entry is Itrans=ms(kL)2; the axial entry is replaced by Iaxial=0.5ms(width2)2. The width is lateral-to-medial knee-marker distance for the thigh, and lateral-to-medial ankle-marker distance for both shank and foot. This combines prescribed mass/COM/gyration fractions with a cylinder-style axial assumption. The default inertia scale is 1, COM fraction shift is 0, and shank knee anterior-posterior shift is 0. Separate audit perturbations are not default app calibration.

Static marker positions are their means over valid static samples. Knee and ankle centers are the midpoints of the respective lateral and medial markers. Define O as the ASIS midpoint and b as the distance between the two ASIS markers. The right unit vector points from left to right ASIS; the up unit vector is the normalized cross product of right with the vector from PSIS midpoint to O; the front unit vector is up × right. The implemented hip center is O+b(−0.19front−0.30up±0.36right), with + for the right hip and − for the left hip. This explicit regression geometry and the midpoint joints are prototype assumptions; source-model equivalence and anatomical accuracy remain unresolved.

The inertial frames above and the anatomical reporting frames are separate. The thigh reporting plane is fitted from hip, greater trochanter and knee landmarks; the foot reporting geometry uses ankle and projected MT2/MT5 landmarks with documented side-specific construction. Exact construction and the exported tracking/joint-gap diagnostics should accompany reproduction; they must not be inferred from the three displayed component labels.

Qualified recovery is not measured ground truth

The moment workflow can estimate missing cluster markers from other markers in the same frame using an explicitly checked rigid-cluster relationship to static calibration. Fit quality, leave-one-out error and conditioning checks govern acceptance; unresolved frames split valid support. These estimates are distinct from interpolating through time, and their provenance remains visible. A cluster can move relative to bone even when its internal geometry looks rigid.

Fukuchi contact assignment uses fixed raw +Y force events at 20 N and 0.08 s, valid-support guards, and the horizontal distance between COP and a tracked foot center. Ambiguous assignments are excluded (nearest median distance must be ≤0.25 m and side-separation margin ≥0.05 m). These are engineering checks. Custom uploads require explicit review of each proposed side assignment. One accepted contact can yield an illustration, but cannot pass the two-contact sensitivity requirement. Signal-screen marker choices and thresholds do not redefine the model's calibration or contacts.

Implementation: custom_protocol.py, marker_quality.py, fukuchi_protocol.py and examples/compare_human_3d.py. Consult the exported recovery and contact records for actual retained support and numerical quality checks.

Marker protocols, joint centres and coordinates

Marker names describe the acquisition; calibration and the body model define joint centres and axes. Record the physical placements, calibration, model version and output convention. Keep these fixed when comparing cutoff frequencies.

Acquisition / modelJoint centres and segment trackingSupport in this app
Fukuchi physical-marker modelCODA pelvis-width hip regression; knee and ankle anatomical-marker midpoints. Fixed tracking clusters and protocol-specific Z-X-Y moment projections.Experimental joint moments with matching calibration and reviewed contacts.
Hippony CAST cluster modelStatic anatomical landmarks calibrate seven independently tracked groups, with at least three non-collinear markers per group. CODA hip regression and knee/ankle midpoints; moments are distal anatomical XYZ vector components.Experimental joint moments with configurable measured clusters and matching static calibration.
Plug-in Gait / CGM1CGM hip regression and chord-based knee/ankle centres use measured leg lengths, joint widths and marker radius. Thigh/shank wands and static foot offsets establish model-specific axes.Pinned pyCGM2 CGM1 calibration, fitting and bilateral lower-limb kinetics. Software agreement remains dataset-specific.
CGM2.3Hara hip regression, version-specific calibration and OpenSim rigid-model inverse kinematics. Matching names alone does not reproduce its joint-centre or coordinate definitions.Pinned pyCGM2 CGM2.3 calibration, OpenSim fitting and bilateral lower-limb kinetics. IK failure is rejected; no non-IK or CAST fallback is accepted.

The CGM adapter pins pyCGM2 tag 4.4.0-rc2, commit 4e34de0e64e55af6d72b4bb99bf32d9f721d40c9 (upstream package version 4.4rc1). It runs in a separately configured Python 3.10 environment with native BTK and OpenSim. Source, model assets, runtime versions and portability changes are retained in the provenance.

CGM inputs require measured mass, bilateral leg lengths, knee and ankle widths, marker diameter, matching static calibration and explicit foot/head static options. VSK imports must be reviewed, including optional rotation offsets and any upper-body anthropometry. The native frame is unchanged positive global Z up, with gravity along negative Z; markers and calibrated platform outputs use mm and N/Nmm/mm.

Each CGM platform is assigned L, R or X for its entire continuous wrench. One platform alternating between feet is unsupported by this assignment string. Input force channels are filtered once at the analog rate and upstream then strides wrenches onto the point clock without an additional anti-alias filter. Positive force cutoffs must remain below point Nyquist. Strict three-measure eligibility requires force-preservation assessment covering every contributing platform.

The upstream CGM inverse dynamics retains a separate fixed 6 Hz COM filter before spline differentiation: Butterworth order 4 per pass with filtfilt, using the single-pass cutoff convention. Its combined response is approximately -6 dB at 6 Hz. Disabling input marker/force filtering does not disable this internal preprocessing. CGM exports clinical sagittal, coronal and transverse components with the declared Distal, Proximal, Global or JCS projection and upstream signs.

Archived public CGM inputs already include Woltring MSE10 smoothing. ACF, Winter and moment comparisons on those files test additional filtering only. They cannot recover an original raw-data cutoff, and an original-cutoff recommendation is withheld. A force screen covering fewer platforms than the moment model also withholds strict three-measure eligibility while leaving the actual diagnostic curves visible.

Reference testing separates interface replay from model agreement. CGM1 and CGM2.3 replay matched direct pinned-upstream outputs on identical native frames. A longer CGM1 walking recording agreed with stored Nexus moments at a maximum per-component RMS of 0.036139 Nm/kg against the borrowed 0.06 Nm/kg criterion; an earlier recording had a right-hip component at 0.101506 Nm/kg and failed. CGM2.3 has upstream replay evidence only. Independent anatomical accuracy and a universal CAST human-reference equivalence remain unvalidated.

Pinned pyCGM2 source · Model reference-validation record

CAST describes an anatomical-calibration framework; ISB provides coordinate recommendations. Neither defines one universal marker set. The Hippony CAST model uses the Bell–Brand regression documented for a CODA pelvis, with the ASIS midpoint as origin. Knee and ankle centres are marker midpoints without an additional marker-radius correction. Segment mass, COM and inertia remain model estimates.

CAST motion filtering uses measured tracking markers only. Static foot landmarks are transferred by rigid pose for force-to-foot assignment. Invalid or degenerate frames are excluded; guarded continuous segments prevent filtering across gaps. Independently tracked segments may have joint-centre gaps, which are reported as model diagnostics. Distal-frame moment components are vector projections; anatomical motion labels require a separate declared joint-coordinate convention.

For CAST, the distal anatomical rotation maps local coordinates to the laboratory frame; its transpose resolves the physical world moment into local components, normalized by body mass:

Mdistal(t)=Rdistal(t)TMworld(t)m

CAST retains the declared Winter-style segment mass/COM/gyration estimates and cylinder axial-inertia assumption; these are not participant-measured inertias. Pelvis, thigh, shank and foot poses are tracked independently. Hip, knee and ankle closure gaps should be reviewed alongside the cutoff comparison.

Known rigid transformations, anatomical frame handedness and mechanical balance test implementation correctness. Human-model accuracy requires an independent reference. Before claiming equivalence to CGM, Plug-in Gait or Visual3D, compare joint centres, segment poses and moment waveforms on the same recordings, calibration and reporting conventions.

Sources: CAST anatomical calibration; ISB pelvis and femoral axes; CODA hip regression; Vicon model definitions; pyCGM2 model implementations.

Interpretation and reporting

10. Evidence limits and publication use

Solver agreement is a mechanics check. The aligned biorbd 1.12.3 versus OpenSim 4.6/Simbody benchmark covers 640 prescribed states in 16 rigid-body cases. Maximum torque discrepancy was 4.264 × 10−14 Nm against a declared 10−8 Nm tolerance. Frames, inertias, states, gravity and applied wrenches were aligned, and neither solver filtered the states. This verifies the tested engine mechanics and conventions. It does not validate the human anatomical model, marker reconstruction, joint-coordinate reporting or cutoff selector.

Three passing measures do not establish an optimum. Residual whiteness is assumption-dependent, preserving raw force can preserve noise, and moment agreement can preserve shared model error. The top-three pool, adaptive grid, 1 s residual trim, guards, minimum contact count, comparison span and all numerical pass limits are declared engineering choices. They are not confidence intervals or textbook-derived acceptance criteria. Two contacts satisfy a software minimum, not a guarantee of population reliability.

The supported question is bounded. This app assesses the tested recording, model, contacts and candidate family. It does not infer injury risk, tissue force or a universally appropriate cutoff. Sensitivity comparisons should accompany separate outcome-appropriate model validation and uncertainty assessment when reporting a scientific result.

What to report in a manuscript or supplement

Benchmark source: output/aligned_reference_validation/results.json. Decision/report artifacts record the actual analysis settings. This appendix is a methods description, not a certification or validation study.

Quick reference

11. Symbols and glossary

Cutoff, f_c (Hz)
Frequency where the ideal final two-pass amplitude equals 1/√2 of the passband. Hz means cycles per second.
Sampling rate, f_s; Nyquist frequency
Samples per second; Nyquist equals f_s/2. Filtering cannot repair acquisition aliasing or missing synchronization.
Residual, r; autocorrelation, ρ
Raw minus filtered coordinate; similarity of a centered residual with a time-shifted copy. Low score S suggests less residual autocorrelation under the chosen windows.
c and d; q, j, a and i
Two cutoff candidates; contact, joint, reporting component and sample indices. w is a time window; K is the maximum positive lag; J is the included coordinate set.
Peak P (N); impulse I (N·s)
Maximum vertical force over one contact; area under its force-time curve. Neither is a complete description of the force waveform.
RMS difference R (Nm/kg)
Square root of mean squared sample-wise moment difference. It preserves the moment's units and incorporates changes across the contact waveform.
Extrema difference D (Nm/kg)
Larger absolute change in the waveform maximum or minimum. It is distinct from the largest pointwise waveform difference.
COM; COP; wrench
Segment center of mass; center of pressure; moment and force represented about a specified common point.
R; I_w; ω; α
Body-to-world rotation matrix; world inertia tensor (kg·m²); angular velocity (rad/s); angular acceleration (rad/s²). Rotation R is distinct from the RMS symbol used in equation (11).
Normalized moment, μ (Nm/kg); reporting sign, s
Projected net internal joint moment divided by measured body mass, multiplied by the adapter’s side/joint/component sign. Equation (10) lists the Fukuchi and Carter sign rules.
Diagnostic starting pair
A setting to inspect, possibly with an explicit force trade-off; it has not passed the final three-measure rule.
Provisional three-measure pair
A candidate that passes the complete declared checks. Human accuracy and optimality remain unvalidated.
Insufficient evidence
No final pair is issued because required support is missing, marker evidence is unstable or no candidate passes the joint force/moment gates.
Sources and boundaries

12. References

Numbered references support the published principles beside which they appear. App-specific equations, thresholds and selection rules above are checked against the implementation. No source is presented as endorsing the combined rule.

  1. Mai P, Willwacher S. Effects of low-pass filter combinations on lower extremity joint moments in distance running. Journal of Biomechanics. 2019;95:109311. doi:10.1016/j.jbiomech.2019.08.005.Supplied 10-page PDF examined, including Methods §§2.2-2.3, Results and Discussion/Figure 7. Methods and discussion pages were also visually inspected. Contextual filtering evidence; not a validation of this implementation.
  2. Winter DA. Biomechanics and Motor Control of Human Movement. 4th ed. Wiley; 2009. doi:10.1002/9780470549148. Print ISBN 9780470398180.User-supplied textbook checked: printed pp. 69–73, including §3.4.4.3, Eq. 3.9 and §3.4.4.4. Winter's residual method uses RMS differences between raw and filtered coordinates, a linear noise-tail extrapolation and its intercept crossing with the residual curve. This differs from the app's residual-autocorrelation ranking. Page 73 warns that a displacement-based cutoff need not be optimal for velocity or acceleration. These sections do not establish the app's numerical force/moment limits or validate an automatic tail-fitting rule. The live Winter estimate and ACF selector are provisional alternatives; the separate saved multi-trial demonstration is exploratory.
  3. Robertson DGE, Caldwell GE, Hamill J, Kamen G, Whittlesey SN. Research Methods in Biomechanics. 2nd ed. Human Kinetics; 2014. ISBN 9780736093408. Publisher record and table of contents.Publisher metadata and contents verified: Chapters 2 (3D kinematics), 3 (body segment parameters), 4 (forces), 5 (2D inverse dynamics), 7 (3D kinetics), and 12 (signal processing). Full chapter text/equation pages were not verified. No textbook endorsement of the project's pass limits is claimed.
  4. Bisseling RW, Hof AL. Handling of impact forces in inverse dynamics. Journal of Biomechanics. 2006;39(13):2438-2444. doi:10.1016/j.jbiomech.2005.07.021. Primary abstract record.Abstract verified; supports the importance of consistent acceleration/force handling around impact.
  5. Kristianslund E, Krosshaug T, van den Bogert AJ. Effect of low pass filtering on joint moments from inverse dynamics: implications for injury prevention. Journal of Biomechanics. 2012;45(4):666-671. doi:10.1016/j.jbiomech.2011.12.011. Primary abstract record.Study context and abstract verified; evidence concerns sidestep cutting rather than universal movement/filter combinations.
  6. Challis JH. A procedure for the automatic determination of filter cutoff frequency for the processing of biomechanical data. Journal of Applied Biomechanics. 1999;15(3):303-317. doi:10.1123/jab.15.3.303. Author institutional record.Abstract and metadata verified. It describes residual-autocorrelation reasoning and tests using mathematically generated signals with added noise. Full original estimator details were not verified here; the app claims an adaptation only.
  7. SciPy documentation. scipy.signal.butter.Official definition of Butterworth design order, cutoff and second-order-section output. Use exported analysis metadata for the installed software version.
  8. SciPy documentation. scipy.signal.sosfiltfilt.Official forward/backward SOS filtering and odd-padding documentation. The app explicitly records its selected pad length and design coefficients.
  9. Fukuchi RK, Fukuchi CA, Duarte M. A public dataset of running biomechanics and the effects of running speed on lower extremity kinematics and kinetics. PeerJ. 2017;5:e3298. doi:10.7717/peerj.3298. Open article: physical placements, Figure 1 and Table 1.Source protocol, calibration structure and native rates verified. The dataset provides 150 Hz markers and 300 Hz force recordings for running at 2.5, 3.5 and 4.5 m/s. This app's experimental model is not claimed to reproduce the source model exactly.