Should this processing cancel?
Identity or bypass cases may require an exact null; intentional gain, EQ or nonlinear processing need their own expected changes. A nonzero residual alone is not a defect.
Elysia Tools
Navigation
Workflow Playbook
Compare a fixed audio reference with separately processed outputs, document null-test coverage and suitable single-tone THD results, and deliver a reviewed regression record with files and hashes.
Hubs
This workflow serves developers and QA teams reviewing one audio-processing change. Freeze a case ID, input, processor build, settings and expected behavior before looking at results. An identity or bypass case differs from an EQ, gain or saturator case: the latter may be expected not to cancel. Define numeric limits and who can approve them; do not invent a universal acceptable residual or distortion percentage afterwards.
The dual-channel generator can create a repeatable fixture, but processing that input through your software remains a separate action. Save generator settings and returned metadata. For a concrete single-tone case, use 48 kHz, a three-second sine at 1 kHz on both channels, a peak target of -18 dBFS and matched phases. Choose a one-second window beginning at 0.5 seconds, away from fades, and verify that the output remains suitable before applying THD. This example is not an acoustic calibration; lower playback gain before auditioning.
Probe both files for encoding, rate, channels and duration, and inspect their waveforms. Null analysis requires matching rates and channel counts, supports mono or stereo at 8–96 kHz and limits each input to 30 seconds. It does not resample or downmix. A channel swap, conversion or clock drift is a separate mismatch, not something an integer offset will generally repair.
Residual means A minus B. A positive offset skips that many frames of B, while a negative one skips A; the available overlap is compared. Record the offset reason, comparedFrames, excludedFrames and wholeFilesCompared. An offset can remove the very transient you wanted to test, so state what remains untested.
Check simple controls: identical decoded arrays cancel, while B at half A's amplitude leaves half A as residual, approximately -6.02 dB relative to a non-silent reference. This illustrates gain sensitivity, not a pass limit. There is no automatic alignment, gain fitting, polarity correction, DC removal or normalization. Zero amplitude and a ratio with a silent reference can produce null logarithmic fields; do not indiscriminately replace those fields with numeric zero. A float residual above full scale is preserved, and some playback software may clip it.
A spectrogram can help locate a stable region, but its image is not a numeric proof of eligibility. The analyzer uses a 0.05–5 second window with at least 20 fundamental cycles and searches near the supplied nominal frequency. Keep the same window location, duration, nominal frequency and harmonic order when comparing approved reports. Record actual analyzed duration and each channel separately.
Inspect status and reasons before reading a percentage. A dominant single-tone check and a half-window stability screen can leave results unreliable or inconclusive. Selected harmonic orders too close to or above the Nyquist guard band are omitted; different omitted sets make totals less comparable. Noise at harmonic frequencies can contribute. The result is not THD+N, a sweep or music measurement, calibrated analog bandwidth or certified uncertainty.
For intended time-varying or nonlinear processing, the test may be inapplicable or its distortion may be intentional. Preserve those cases rather than forcing a low number. Numeric analysis and listening answer different questions.
Keep unmodified JSON and CSV reports, residual.wav and visual evidence from the same run. Waveform images and envelope summaries are not every sample. Align case IDs, channel order and settings before using a path-level JSON diff; timestamps and filenames can change without a signal regression, while a different window can invalidate a direct comparison.
Record observed changes, predeclared limits, acceptance or rejection, owner and unresolved items. Exact cancellation applies only to compared decoded samples, not necessarily all source content or container bytes. Hash the actual delivered inputs, outputs, reports and archives with SHA-256 and retain local copies; hashes preserve identity rather than certify correctness.
Use the related signal-generation workflow to design richer fixtures, the lossy-codec workflow for codec-specific master delivery and broader audio analysis for general source investigation. This page does not run your processor, repair the result or establish whole-device acoustic performance.
Workflow playbook
Generate a controlled stereo fixture when needed, document its exact settings and run your processor separately. Preserve the input, output, build and expected acceptance behavior.
Probe both files and inspect waveforms for channel, duration or gross envelope mismatches. Do not silently resample, remix or normalize to make them comparable.
Compare A minus B with a documented integer offset. Inspect residual metrics, excluded frames and wholeFilesCompared; keep the residual WAV without hidden gain fitting.
Use a spectrogram to check for a stationary region, then measure THD only where applicable. Record per-channel status, window and omitted harmonic orders; retain inconclusive cases.
Identity or bypass cases may require an exact null; intentional gain, EQ or nonlinear processing need their own expected changes. A nonzero residual alone is not a defect.
Null inputs must share sample rate and channel count. Choose a justified integer offset and record excluded frames; zero residual over an overlap does not certify whole files.
Use a dominant stationary single tone and inspect status, window and omitted harmonics. Music, sweeps, multitone or inconclusive results cannot be turned into a valid THD pass.
Align case and channel identities before comparing JSON reports. Review deltas against the declared limits, then archive originals, residuals, decisions and final hashes.