• Welcome to ASR. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

Four Ways to Measure Turntable Speed — Audio, Gyro, FG, and Optical

alvaro-oliver

Member
Joined
Jun 26, 2025
Messages
44
Likes
76
Location
Santiago de Chile
Hi everyone,


I wanted to share a detailed overview of four different ways to measure the absolute rotational speed of a turntable. Some are modern, some are traditional, but all provide useful insights into what's really happening under the platter. The goal here is to compare the practical accuracy and resolution of each method using real data — all signals were captured simultaneously using the setup described in this previous post.



Method 1: Audio Test Signal Analysis​


This is the classic approach, supported by standards like IEC 60386 and DIN 45507. You play a test record with a 3000 or 3150 Hz tone, then use a zero-crossing frequency counter — typically after band-pass filtering — to estimate instantaneous frequency and compute RPM from that.


Theoretical resolution:
If you analyze 1.8 seconds of a 3150 Hz tone, you get 5670 cycles. The smallest detectable change is 1/5670 ≈ 0.0176%, or 0.00588 RPM per revolution.
Using longer measurements (e.g. 20 seconds ≈ 11 revolutions), that improves linearly:


Final resolution ≈ 0.00588 / 11 = 0.00053 RPM.


This doesn’t even account for interpolation or DSP tricks — just raw counting.


But here's the catch: any deviation in the tone frequency (from record mastering, wow, etc.) will skew your results. To explore this, I compared five tests using an Analogue Productions test record vs. five using a Clearaudio disc:

Test NameAudio (RPM)FG (RPM)
250803_131124-AN_PRODS32.943333.3312
250803_131154-AN_PRODS32.942433.3304
250803_131228-AN_PRODS32.942633.3304
250803_131258-AN_PRODS32.943733.3314
250803_131336-AN_PRODS32.943233.3311
250803_131756-CLR_AUDIO32.944633.3312
250803_131828-CLR_AUDIO32.955633.3311
250803_131911-CLR_AUDIO32.945033.3315
250803_131944-CLR_AUDIO32.956033.3308
250803_132029-CLR_AUDIO32.957133.3309


Average RPM:


  • Audio (AAPT): 32.9430
  • Audio (Clearaudio): 32.9516
  • FG reference (both): ~33.3310

→ The test tone consistently under-reports RPM by ~0.38. Also: the standard deviation of the audio method is ~0.0062 RPM, while the FG signal shows incredible consistency (±0.0003).




Method 2: Gyroscope​

Gyros measure angular velocity (ω), which is independent of radius — great for rotating systems.


  • At 33⅓ RPM, ω = 200 °/s.
  • A ±250 dps range gyro like the LSM6DSO at 16 bits gives 8.75 mdps/LSB → 0.00146 RPM/LSB.
  • At 200 Hz sampling: resolution ≈ 0.00001 RPM.

That’s unbeatable. But…


Temperature Test:​


I ran a quick test where I cooled the sensor and monitored its reading as it warmed up:


Test NameTemp (°C)Gyro (RPM)FG (RPM)
250803_181744-GYRO_TEMP1.2333.228533.3308
250803_181816-GYRO_TEMP8.3433.239333.3316
250803_181845-GYRO_TEMP11.7433.246633.3315
250803_182031-GYRO_TEMP16.8133.252733.3312
250803_182249-GYRO_TEMP20.8933.252433.3312
250803_182621-GYRO_TEMP23.2333.251133.3321

You can see the drift as it stabilizes, even though the turntable speed (from FG) is constant.

Tilt Test:​

Mounting matters. A ~15° tilt produced a shift of ~0.5 RPM, even though the speed stayed the same.

Test NameTilt angleGyroFG
250803_185741-GYRO_FLAT~ 0°33.224333.3319
250803_185812-GYRO_FLAT~ 0°33.226333.3310
250803_185842-GYRO_FLAT~ 0°33.220033.3313
250803_190000-GYRO_TILT_UP~ +15°32.762033.3321
250803_190030-GYRO_TILT_UP~ +15°32.765033.3316
250803_190105-GYRO_TILT_UP~ +15°32.760433.3317
250803_190159-GYRO_TILT_DOWN~ -15°32.742833.3306
250803_190231-GYRO_TILT_DOWN~ -15°32.741733.3313
250803_190306-GYRO_TILT_DOWN~ -15°32.737233.3313


Radius Test:​


I moved the gyro across the platter: center, 3 cm, 6 cm, 12 cm. Results? No significant change, except for temperature offset — as expected. Angular velocity is constant regardless of radius.

Pruebaradius (cm)Temp. °CGyroFG
250803_195808-GYRO_RAD_0019.5433.232633.3341
250803_195839-GYRO_RAD_0019.9633.224133.3318
250803_195910-GYRO_RAD_0020.4333.226933.3315
250803_200021-GYRO_RAD_6621.6033.228833.3322
250803_200050-GYRO_RAD_6621.7633.229933.3316
250803_200120-GYRO_RAD_6621.8433.225833.3314
250803_200209-GYRO_RAD_121222.2933.233533.3320
250803_200246-GYRO_RAD_121222.1233.231533.3316
250803_200325-GYRO_RAD_121221.8833.232733.3315
250803_200443-GYRO_RAD_3322.7133.233633.3309
250803_200517-GYRO_RAD_3323.3133.233333.3316
250803_200549-GYRO_RAD_3323.7933.233733.3317


⚙️ Method 3: Frequency Generator (FG)​


Many Direct Drive turntables have an internal frequency generator — usually Hall sensors inside the motor producing a pulse train (e.g. 50 Hz at 33⅓ RPM).


In this case, I tapped into the FG signal of a Reloop RP-4000 MK2, processed it with a reciprocal frequency counter using an STM32 microcontroller, and streamed the data to a laptop.

1754284766118.png

  • FG signal: 50 Hz → 1 pulse every 20 ms.
  • Counter resolution: 1 MHz.
  • Theoretical resolution (1.8 s): ±0.00167 RPM


Method 4: Optical Sensor​


This is a “homemade FG.” I built a module with a laser beam and photodetector, producing one pulse per revolution. A fast Schmitt trigger cleans the edges (<100 ns rise time), and the system logs the time between pulses.


  • Rotation = ~0.555 Hz at 33⅓ RPM.
  • 1 MHz timer resolution → ±0.00003 RPM over 1.8 s!
1754284785855.png
1754284793082.png


Here’s a comparison of both systems using an AWG:

SourceRPM MeasuredQuantization Error
FG (50.000 Hz)33.33276±0.00057 RPM
Optical (0.55555 Hz)33.33326±0.00007 RPM


Side-by-Side Comparison​


Here’s a batch of five full test captured over 20 seconds:

Test NameAudioGyroFGOptical
250803_224108-SPEED_MEAS32.953233.239333.329733.3344
250803_224225-SPEED_MEAS32.938533.238433.331433.3326
250803_224309-SPEED_MEAS32.925533.238633.330933.3328
250803_224353-SPEED_MEAS32.942033.240333.331733.3329
250803_225154-SPEED_MEAS32.936933.230433.330733.3383


33⅓ to 45 RPM Transition Test​


For fun, I ran a speed change test (no audio signal available at 45 RPM). The gyro and FG track the speed ramp beautifully — even catching the motor overshoot. The optical method lags by one full revolution (as expected from its lower update rate).

1754285387707.png


MethodRPM @ 45
Gyro44.8444
FG44.9862
Optical44.9889




Final Thoughts​


  • Audio test tones are standardized and widely available, but vulnerable to pressing errors and tone inaccuracies. The method underestimates actual speed and has more variability.
  • Gyroscopes offer insane resolution and dynamic response — but are very sensitive to tilt and temperature. Not ideal for absolute RPM unless you apply correction.
  • Frequency generators and optical sensors give the cleanest, most stable absolute speed — provided your timer and clock are accurate.

These tests aren’t meant to be conclusive, but I hope they shed some light on the strengths and quirks of each method. Happy to hear your thoughts or suggestions — or if you've tried something similar!


Cheers,
Alvaro
 
Fascinating, thanks very much for all the effort!
 
Can you tell a bit a bit more about the band pass filtering, type and method, I am getting wildly varying results when using Ai generated python script for wow and flutter calcs. Like 2 sigma values that are larger than the larges peak to peak variation, that seems strange to me. AI also told me that my DIN filter gain values has to sum to 1 for correct filter gain of 1. But if I do that the filtered 2sigma values becomes in % rather than 0.x or 0.0x%,, and 4 times larger than the unfiltered 2 sigma…


The CoPilot generated script I got uses another way of getting the carrier frequency than zero crossings,,, nor sur what is best
1754400619246.png
 
Last edited:
I never heard speed problems (including wow & flutter) from anything that wasn't broken or mis-adjusted.

Cheap record players used to use synchronous motors which is what electric clocks use. They lock to the line-frequency which is super accurate (in developed countries). If you don't lose power your electric clock will remain accurate to the second for years. (The power companies also make small corrections... "two wrongs make it right" but the corrections are very-small. I assume the strobe on my old direct drive turntable (with adjustable speed) is a neon bulb run from the AC.

The clock in a "cheap consumer soundcard" is sometimes off by enough to cause pitch or tempo problems for musicians but "normal listeners" usually don't hear it. A good turntable wouldn't be off by that much.
 
This is a great example of really interesting and enlightening empirical work - thank you for the work and the great narrative explanation and analysis!

I don’t play vinyl myself, but to me that’s irrelevant - the knowledge gained here is useful, and enjoyable to read. I especially appreciate that the conclusions drawn are fully supported by the results of the investigation.
 
Very interesting comparison! Out of curiosity: How long did you measure with the gyro and did you apply any drift correction (temporal drift, not temperature) to the data?

Could you perhaps show a plot of measured speed over time for all methods? Would be cool to see.
 
Hi Balle,
Can you tell a bit a bit more about the band pass filtering, type and method,
According to the Virtins document: '312.9 Hz ~ 5945 Hz band pass filter is to band limit the FM signal, but it should allow the highest possible frequency deviation to pass through.' You can use those fixed values assuming the signal has an exact frequency of 3.15 kHz. What the published script does is first calculate the average frequency and then use a factor of 0.1 and 1.9 to approximate the filter's cutoff frequencies.
I am getting wildly varying results when using Ai generated python script for wow and flutter calcs. Like 2 sigma values that are larger than the larges peak to peak variation, that seems strange to me.
The 2-sigma measurement cannot be greater than the largest peak. The fact that the method is called 2-sigma suggests that twice the standard deviation could be used to measure it. However, the correct interpretation according to the standard's definition is that the 95th percentile value should be used. This is very poorly documented, so I believe it's worth mentioning.
AI also told me that my DIN filter gain values has to sum to 1 for correct filter gain of 1. But if I do that the filtered 2sigma values becomes in % rather than 0.x or 0.0x%,, and 4 times larger than the unfiltered 2 sigma…
If you want to experiment with the weighting filter, I suggest using the script weighting_filter.py instead of directly manipulating the coefficients, unless you really know what you're doing.
The CoPilot generated script I got uses another way of getting the carrier frequency than zero crossings,,, nor sur what is best
View attachment 467834
What that script is doing is applying an FFT to obtain the PSD, and then calculating the peak frequency. Unlike the zero-crossing method, it's more vulnerable to distortions and requires pre-filtering the signal before applying it.

I hope this helps.
 
Last edited:
This is a great example of really interesting and enlightening empirical work - thank you for the work and the great narrative explanation and analysis!

I don’t play vinyl myself, but to me that’s irrelevant - the knowledge gained here is useful, and enjoyable to read. I especially appreciate that the conclusions drawn are fully supported by the results of the investigation.
Thanks so much for your feedback! It was really important for me to be as clear and concise as possible, so I leaned on AI to help with that. The original text was quite a bit more boring .
 
Very interesting comparison! Out of curiosity: How long did you measure with the gyro and did you apply any drift correction (temporal drift, not temperature) to the data?

Could you perhaps show a plot of measured speed over time for all methods? Would be cool to see.
Hi! All measurements are 20 seconds long, and no type of correction was applied, only interpolation was used to integrate all measurements into a single timeline.

Unfortunately, I don’t have a plot with all four signals simultaneously because I haven’t finished integrating everything into a single output file. But here’s a graph from one of the output CSV. These signals are filtered at 20 Hz.

1754441544298.png


And this other plot comes from the optical sensor capture (in red), along with the unprocessed FG signal and Gyroscope measurement:

1754442640141.png


Regards!
 
Back
Top Bottom