This has been on my personal to-do list for quite some time. I don't work on turntables much anymore, but when I did, they were primarily direct drives, and I used the motor frequency generator (FG) signal to ascertain speed stability. It's not too difficult to learn how to eyeball zero-crossing behavior on a scope, but it's not easy to convey that to someone else.
Resilient software options for W&F analysis are typically expensive, or old and therefore dated. They're also not designed to measure carriers in the 50–150 Hz range where motor FG/tach signals typically are. Even packages with adaptive filters like MultiInstrument don't deal with edge artifacts, as those don't matter with 3–3.15 kHz signals.
So, this Python prototype was born:
Auto-tuned adaptive prefilter. The bandpass prefilter centers itself on whatever carrier it finds. Below ~500 Hz, bandwidth scales as a fixed percentage of carrier (±30%) — wide enough to pass all W&F sidebands without cutting into the fundamental. Above 500 Hz, absolute bandwidth caps at ±150 Hz — still generous for worst-case W&F sidebands (Carson's rule gives ~±80 Hz) but tight enough to reject broadband noise that would corrupt zero-crossing timing.
Adaptive edge trimming. Bandpass prefilters corrupt the first and last few zero crossings — the filter needs time to settle. The analyzer uses a two-stage approach: first, a time-based trim removes crossings within the prefilter's settling time (2/bandwidth seconds) from each end, guaranteeing the worst transient samples are gone regardless of carrier rate. Then a MAD-based (median absolute deviation) scan extends the trim if any of the first/last 20 crossings still exceed 5× MAD. The two trims combine by taking whichever is larger. This scales automatically — at 3 kHz the time-based trim catches the transient that would otherwise slip past the amplitude check (because per-crossing error is small at high crossing rates), while at 100 Hz the amplitude check catches edge artifacts that stick out well beyond the settling window.
AES6-2008 weighting and metrics. Weighted peak is 2σ (95th percentile), not max. RMS per AES6/IEC 60386. Wow and flutter are band-separated — wow is weighted content below 6 Hz, flutter is the remainder. Drift (0.05–0.5 Hz) is reported independently.
Motor harmonic identification. Optional — if you provide slot and pole counts, the spectrum plot auto-identifies peaks as rotation harmonics, electrical frequency, slot passing, or torque ripple, each labeled with per-bin RMS amplitude. Tells you whether your dominant W&F source is mechanical, electrical, or something else.
Polar speed plot. Instantaneous frequency per revolution on a polar axis, 0.1%/div radial scale. Two revolutions overlaid to show repeatability. Rotation-synchronous components show a consistent shape; random flutter shows as spread between traces.
5-second minimum capture. Validated stable for weighted W&F (peak, RMS, wow, flutter) down to 5-second recordings. Drift needs 20s+ but the W&F numbers don't move.
It's usable now as a standalone Python script; however, the next phase is to turn it into an SPA (Single Page Application) that runs in the web browser, similar to sjplot.com/online, but with far more interactivity.
Initial spec is attached. More to come.
Resilient software options for W&F analysis are typically expensive, or old and therefore dated. They're also not designed to measure carriers in the 50–150 Hz range where motor FG/tach signals typically are. Even packages with adaptive filters like MultiInstrument don't deal with edge artifacts, as those don't matter with 3–3.15 kHz signals.
So, this Python prototype was born:
Auto-tuned adaptive prefilter. The bandpass prefilter centers itself on whatever carrier it finds. Below ~500 Hz, bandwidth scales as a fixed percentage of carrier (±30%) — wide enough to pass all W&F sidebands without cutting into the fundamental. Above 500 Hz, absolute bandwidth caps at ±150 Hz — still generous for worst-case W&F sidebands (Carson's rule gives ~±80 Hz) but tight enough to reject broadband noise that would corrupt zero-crossing timing.
Adaptive edge trimming. Bandpass prefilters corrupt the first and last few zero crossings — the filter needs time to settle. The analyzer uses a two-stage approach: first, a time-based trim removes crossings within the prefilter's settling time (2/bandwidth seconds) from each end, guaranteeing the worst transient samples are gone regardless of carrier rate. Then a MAD-based (median absolute deviation) scan extends the trim if any of the first/last 20 crossings still exceed 5× MAD. The two trims combine by taking whichever is larger. This scales automatically — at 3 kHz the time-based trim catches the transient that would otherwise slip past the amplitude check (because per-crossing error is small at high crossing rates), while at 100 Hz the amplitude check catches edge artifacts that stick out well beyond the settling window.
AES6-2008 weighting and metrics. Weighted peak is 2σ (95th percentile), not max. RMS per AES6/IEC 60386. Wow and flutter are band-separated — wow is weighted content below 6 Hz, flutter is the remainder. Drift (0.05–0.5 Hz) is reported independently.
Motor harmonic identification. Optional — if you provide slot and pole counts, the spectrum plot auto-identifies peaks as rotation harmonics, electrical frequency, slot passing, or torque ripple, each labeled with per-bin RMS amplitude. Tells you whether your dominant W&F source is mechanical, electrical, or something else.
Polar speed plot. Instantaneous frequency per revolution on a polar axis, 0.1%/div radial scale. Two revolutions overlaid to show repeatability. Rotation-synchronous components show a consistent shape; random flutter shows as spread between traces.
5-second minimum capture. Validated stable for weighted W&F (peak, RMS, wow, flutter) down to 5-second recordings. Drift needs 20s+ but the W&F numbers don't move.
It's usable now as a standalone Python script; however, the next phase is to turn it into an SPA (Single Page Application) that runs in the web browser, similar to sjplot.com/online, but with far more interactivity.
Initial spec is attached. More to come.
Attachments
Last edited: