Add turbocharged twin scenario and cross-platform test harness
This commit is contained in:
97
verification/AUDIO_RENDERING.md
Normal file
97
verification/AUDIO_RENDERING.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# Static outdoor audio and two-stroke verification
|
||||
|
||||
Verified on Linux in Release mode, 2026-10-23. The target remains fluid-derived
|
||||
sound at 44.1 kHz. No synthetic bang, saturation, or combustion event is added
|
||||
by the audio renderer. Acoustic processing does not feed energy into the solver.
|
||||
|
||||
## Renderer
|
||||
|
||||
`OutdoorAudio` replaces the active twin and two-stroke legacy reverb paths.
|
||||
Each intake/exhaust mass-flow derivative drives a compact monopole. Separate
|
||||
left/right paths use inverse distance and fractional-sample delays at 343 m/s.
|
||||
The listener and sources are static. Default listener position is (1.6, 1, 2) m;
|
||||
intake is (-0.2, .7, 0), exhaust (.55, .5, 0), ground y=0, wall x=-1.5.
|
||||
Ground and wall reflection coefficients are .35 and .65. These are configurable
|
||||
assumptions rather than measurements of a particular location.
|
||||
|
||||
A second-order 6 kHz monitoring low-pass reduces sharp acquisition transients;
|
||||
it is linear and does not create afterfire. Early ground/wall reflections use
|
||||
image paths. Woodland uses six approximate scatterers. A stable four-line
|
||||
feedback-delay network supplies an empirical diffuse tail; it does not solve
|
||||
outdoor wave propagation or vegetation scattering. Scene changes smooth over
|
||||
20 ms. The old `OutdoorExhaustReverb` remains for legacy tests but is inactive
|
||||
in both engine scenarios.
|
||||
|
||||
Pipe-end radiation impedance, calibrated directivity, alias-free acquisition,
|
||||
and exhaust afterfire chemistry remain unresolved. PCM output is not calibrated
|
||||
speaker SPL. The monitoring filter cannot recover information lost to aliasing.
|
||||
|
||||
## Measured captures
|
||||
|
||||
Four seconds at full pedal, wall environment, 44.1 kHz stereo. Each row's raw
|
||||
and rendered signals come from the same simulation run. Measurements are
|
||||
before PCM clipping; the raw signal includes direct spatial propagation.
|
||||
|
||||
| Engine | Raw maximum adjacent-sample change | Rendered change | Rendered peak | Clipping samples |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| Twin | .569144 | .0881295 | .119947 | 0 |
|
||||
| Two-stroke | .412956 | .138741 | .390789 | 0 |
|
||||
|
||||
These measurements establish transient reduction, not a subjective judgment
|
||||
that limiter events sound like realistic bangs. Listening on the target audio
|
||||
device is still required. Reproduce from the repository root:
|
||||
|
||||
```sh
|
||||
cmake --build build-audit --target fluidsim_audio_capture -j 4
|
||||
./build-audit/fluidsim_audio_capture --scenario twin --out build/audio/twin-wall --seconds 4 --throttle 1 --scene wall
|
||||
./build-audit/fluidsim_audio_capture --scenario two-stroke --out build/audio/two-stroke-wall --seconds 4 --throttle 1 --scene wall
|
||||
```
|
||||
|
||||
Each produces `-rendered.wav`, `-dry.wav` (filtered direct paths) and
|
||||
`-unfiltered.wav` for comparison. Capture files are build artifacts.
|
||||
|
||||
## Two-stroke and regression checks
|
||||
|
||||
The existing 125 cc geometry now uses the shared ECU and finite-response
|
||||
throttle, fuel dosing after the last scavenging port closes, 3000 RPM idle
|
||||
control with ignition trim, and a dynamic damped cantilever reed with contacts.
|
||||
Cylinder/crankcase geometry work uses adiabatic energy differences. An active
|
||||
charge finishes combustion when a fuel cut begins. Ignition event crossing
|
||||
handles wraparound without spuriously firing retarded ignition at zero degrees.
|
||||
Reed parameters, combustion, scavenging and controller calibrations have not
|
||||
been validated against a measured engine.
|
||||
|
||||
Both desktop engines share `MotorcycleTest` for clutch/vehicle integration,
|
||||
common control dispatch and a common dashboard/dyno renderer. The two-stroke
|
||||
limiter is disabled explicitly in the ECU and cylinder; the twin limiter is
|
||||
unchanged. Idle and overrun controls remain enabled. The motorcycle and gearing
|
||||
reuse the existing twin test configuration, not a measured 125 cc motorcycle.
|
||||
The rolling peak dyno reports crank power and torque versus RPM.
|
||||
|
||||
All five CTest suites passed: basic physics/control, fluid boundary validation,
|
||||
intake regression, outdoor audio, and two-stroke regression. Audio tests cover
|
||||
fractional direct arrival, image reflection arrival, stereo ordering, distance
|
||||
gain, linearity, filtering, causal decaying tails, and reed static compliance
|
||||
and seating. The two-stroke sequence idles for two seconds, holds .6 pedal for
|
||||
four, then releases for eight. It checks fuel stays enabled at open pedal above
|
||||
the old limit, reed opening/seating, positive states, finite audio and idle
|
||||
recovery, with no pipe positivity repairs. It then launches the motorcycle for
|
||||
six seconds and checks shifting, neutral and positive dyno power/torque.
|
||||
|
||||
Latest Release results: free-rev maximum 22471.3 RPM, recovered idle 3236.08 RPM,
|
||||
free-rev audio peak .512784, motorcycle speed 51.3773 km/h after launch. The high
|
||||
unloaded RPM exposes the uncalibrated high-speed friction/combustion behavior;
|
||||
removing the limiter does not validate this as realistic engine performance.
|
||||
Unit checks also verify disabling an already latched limiter restores fueling.
|
||||
The earlier four-second capture table above predates limiter removal and is
|
||||
retained as an audio-renderer measurement, not a current engine baseline.
|
||||
Windows execution of the latest changes is pending.
|
||||
|
||||
## Reference basis
|
||||
|
||||
- [Image source geometry](https://www.acs.psu.edu/noahparker/acs/img-src/img-src.html)
|
||||
- [Feedback delay networks](https://msp.ucsd.edu/techniques/latest/book-html/node111.html)
|
||||
- [Beam theory](https://mechanics.ju.se/SolidMechanics/BeamTheory.html), including uniform-load cantilever deflection used for reed compliance.
|
||||
|
||||
The later YZ125 baseline changes these engine calibrations and measurements; see
|
||||
[YZ125 baseline verification](YZ125_BASELINE.md) for current results.
|
||||
Reference in New Issue
Block a user