Skip to content
An oscilloscope display showing a clean waveform, representing the textbook PPG signal that smart rings almost never actually capture during motion

What Your Smart Ring's Heart Rate Data Looks Like After You Move: Motion Artifacts, Adaptive Filters, and the Signal You Never See

TL;DR

Your smart ring's PPG sensor produces beautiful, clean heart rate data roughly 40 percent of the time. The other 60 percent is a signal that has been run through your body's mechanical noise filter (your finger moving, your hand swinging, your thumb typing), and what comes out is a waveform that looks like someone sneezed on an oscilloscope. The ring's firmware uses accelerometer data and adaptive filtering to reconstruct the clean signal. Some implementations do this well. Most do not. Here is what actually happens inside the chip when you wave your hand.

The clean signal that almost never happens

A photoplethysmography (PPG) sensor works by shining LEDs into your skin and measuring how much light is absorbed or reflected. With each heartbeat, blood pumps into your capillaries, changing the volume of blood in the tissue, which changes how much light gets through. The result is a waveform that looks like this.

A clean PPG waveform on an oscilloscope display showing the characteristic systolic peak, dicrotic notch, and diastolic decay -- the textbook signal your ring almost never actually captures in real life Photo by Jair Lazaro on Unsplash

The ideal PPG waveform has a sharp systolic peak (when your heart contracts), a dicrotic notch (the brief backflow when the aortic valve closes), and a gradual diastolic decay. This waveform is periodic, predictable, and full of useful features. You can calculate heart rate from the peak-to-peak interval. You can calculate HRV from the timing variance between consecutive peaks. You can estimate respiratory rate from the baseline modulation. You can estimate blood oxygen from the ratio of red to infrared light absorption.

All of that assumes the signal looks like the textbook. In the real world, it almost never does.

What motion does to the signal

The instant you move your hand, three things happen to the PPG waveform.

First, the distance between the LEDs and your tissue changes. The ring is not glued to your finger. It sits there with a mechanical tolerance measured in fractions of a millimeter. When you move, the ring shifts relative to your skin. The optical coupling changes. The baseline jumps.

Second, the blood volume in your finger changes with motion. When you swing your arm while walking, centrifugal force pushes blood toward or away from your fingertips. This is not a subtle effect. Walking can shift your finger's blood volume by enough to change the DC component of the PPG signal by 50 percent or more. The AC component (the heartbeat pulse) rides on top of that shifting baseline, and the two are hard to separate in real time.

Third, the accelerometer in the ring picks up the same motion, which is the only reason any of this works at all. Without the accelerometer, the ring would have no way to distinguish "my finger moved" from "my heart beat differently." The accelerometer provides the reference noise signal. The algorithm's job is to subtract that noise from the PPG signal and hope the remaining waveform is clean enough to find peaks in.

A side-by-side comparison showing a clean PPG waveform versus a motion-corrupted waveform -- the motion-contaminated signal shows wild baseline drift, missing peaks, and what looks like random noise overlaid on the heart rate pattern Photo by Joshua Chehov on Unsplash

The corrupted waveform looks like a seismograph during an earthquake. The peaks are still there, but they are sitting on top of a baseline that is wandering up and down by more than the amplitude of the pulse itself. A naive peak-detection algorithm looking at this signal would find false peaks in the baseline drift, miss real peaks that fall below the noise floor, and report a heart rate of 180 bpm when you are sitting still but flexing your fingers.

How adaptive filters work (the version the marketing slides skip)

This is the part that most wearable companies describe as "advanced motion compensation" and move on. The actual mechanism is worth understanding because it explains why some rings fail silently and others fail obviously.

The standard approach is a normalized least mean squares (NLMS) adaptive filter. The concept is straightforward. You have two input signals: the noisy PPG (the primary input) and the accelerometer data (the reference input). The filter learns how much of the accelerometer signal is present in the PPG signal, then subtracts it.

The math looks like this.

Copy
y(n) = w(n)^T * x(n)
e(n) = d(n) - y(n)
w(n+1) = w(n) + mu * e(n) * x(n) / (||x(n)||^2 + epsilon)

Where:

  • d(n) is the noisy PPG signal
  • x(n) is the accelerometer reference signal
  • w(n) is the filter weight vector (the thing the algorithm learns)
  • y(n) is the estimated noise component
  • e(n) is the cleaned output signal
  • mu is the step size (how fast the filter adapts)
  • epsilon is a small constant to prevent division by zero

The filter iterates on every sample. Each sample, it adjusts the weights slightly to minimize the error. Over time, the weights converge to a representation of the transfer function between motion at your finger and noise in the PPG signal.

The key parameter is mu, the step size. Set it too high, and the filter adapts instantly to every transient spike, including legitimate heart rate changes. The filter becomes so aggressive that it starts subtracting real heartbeats from the output. Set it too low, and the filter cannot keep up with rapid motion. You get clean output during steady-state walking but corrupted output during sudden movements like turning your hand, typing, or gesturing.

Most rings use a dynamic step size that adapts based on the variance of the accelerometer signal. When the variance is low (hand is still), mu drops to near zero. The filter freezes and passes the raw PPG through mostly unchanged. When the variance spikes (hand moves), mu ramps up and the filter goes to work cleaning the signal.

The problem is that the settling time for an NLMS filter on a 50 Hz PPG signal with a 20-tap filter is roughly 200 to 400 milliseconds. That is enough time for the filter to produce garbage output while it converges. Ring manufacturers often solve this by simply discarding the first few hundred milliseconds after a motion event and reporting a "no reading" gap. You have probably seen this in your own data. Your ring drops a few seconds of heart rate data when you start walking, then picks up again once the filter has settled. That gap is not a sensor failure. It is the filter converging.

The three failure modes of motion compensation

Every smart ring on the market has the same three fundamental weaknesses. Some handle them better than others, but none solve all three simultaneously.

Failure mode 1: The band-limiting problem. The accelerometer in a smart ring is a MEMS device with a fixed sampling rate, typically 50 to 200 Hz. The PPG sensor samples at a similar rate. But the mechanical vibrations that couple motion into the PPG signal can extend well above 200 Hz. Micro-vibrations from typing, from the ring tapping against a table, from the subtle resonance of the titanium shell all create noise that the accelerometer literally does not see because it samples too slowly. The adaptive filter cannot subtract what the accelerometer cannot measure. This noise passes through the filter and ends up in the final heart rate reading as uncorrelated error.

Failure mode 2: The correlated motion problem. The adaptive filter assumes that the accelerometer signal and the PPG noise are linearly correlated. This assumption holds for large, slow movements like walking or arm swinging. It breaks down for fast, short movements where the correlation is nonlinear. Typing is the classic example. Each keystroke creates a sharp mechanical impulse that couples into the PPG through a different path than the one the accelerometer captures. The filter sees a noise component in the PPG that does not match its accelerometer reference, assumes it must be physiological, and reports it as part of the heart rate signal.

Failure mode 3: The forgetting factor. Adaptive filters have a memory. The weights w(n) represent a running average of the noise transfer function. When the user changes position (sitting to standing, lying to walking), the transfer function changes. The filter needs to forget its old model and learn a new one. The rate of forgetting is controlled by the step size and the filter length. A filter that is optimized for stable conditions will struggle with transitions. A filter that adapts quickly will be unstable during steady-state conditions. There is no single set of parameters that works for both. Every ring makes a tradeoff, and you can observe the tradeoff directly by looking at how quickly your ring's heart rate reading stabilizes after you change position.

A closeup of a MEMS accelerometer chip on a circuit board -- the tiny silicon device that provides the reference signal for adaptive motion filtering in wearable devices Photo by Denis Nutiu on Unsplash

How different rings handle the tradeoff

I have tested four smart rings (Oura Ring 4, RingConn Gen 2, Ultrahuman Ring Air, and our Pulsyn prototype) through a structured motion protocol. Sit still for 60 seconds, type for 30 seconds, walk in place for 30 seconds, sit still for 30 seconds, raise and lower hand five times, sit still for 60 seconds. The goal was to see how each ring's motion compensation handles transitions and steady-state noise.

I should be clear that this is not a controlled lab study. I used each ring's companion app to log raw heart rate data at the maximum available logging rate, then compared the reported values to a Polar H10 chest strap as reference. The sample size is one unit per model. Take the numbers as directional, not definitive.

Oura's implementation is the most conservative. During rapid motion transitions, it drops data for 1 to 3 seconds and reports the previous value. The result is a heart rate trace that looks smooth but has a visible lag of 2 to 5 seconds behind the reference chest strap. During steady-state walking, Oura's readings track within 4 bpm of the Polar H10. Typing throws it off worse than any other ring. Oura's filter apparently cannot distinguish keystroke noise from heartbeats, and the reported heart rate jumps by 8 to 15 bpm during typing.

RingConn Gen 2 uses a longer filter (more taps) and a lower step size. The result is more stable readings during steady-state motion but slower convergence after transitions. Walking starts with a 6 to 8 second gap of no data while the filter converges. Once it does, readings stay within 3 bpm of the chest strap. Typing still causes errors but the error magnitude is lower, around 5 to 8 bpm.

Ultrahuman Ring Air uses the most aggressive approach. A high step size and short filter converge in under 1 second after motion starts. The problem is that it overcorrects. During typing, the reported heart rate sometimes drops below the actual value as the filter mistakes legitimate heartbeats for motion noise and subtracts them. The result is a heart rate reading that looks responsive but is systematically low by 5 to 10 bpm during light activity.

Our Pulsyn prototype uses a filter bank approach. Instead of one adaptive filter, we run three filters in parallel with different step sizes and tap counts. A controller algorithm (a simple decision tree based on accelerometer variance and signal quality metrics) selects which filter's output to use at any given moment. The tradeoff is computational. Three filters running at 50 Hz on a microcontroller use about three times the processing budget of one filter. For a smart ring with a 7-day battery target, that is a real cost. I am not sure this is the right tradeoff long-term, but in our prototype testing, it produces fewer transition gaps and lower typing error than any single-filter implementation.

What this means for your daily data

The practical implication is that your ring's heart rate data during most of your waking hours is partially synthetic. The ring is not measuring your heart rate directly during motion. It is measuring a corrupted signal, running it through a filter, and estimating what the clean signal would have been. The filter is good at estimating during steady-state, repetitive motion (walking, jogging, cycling). It is bad at estimating during irregular motion (typing, cooking, gesturing, fidgeting).

If you look at your 24-hour heart rate chart in your ring's app, the data points during sedentary periods (sitting, sleeping, lying down) are the most accurate. The data points during active periods have varying degrees of algorithmic reconstruction. The ring's app does not tell you which data points are measured and which are estimated. It presents all of them with equal confidence.

This matters for HRV. Heart rate variability is calculated from the timing differences between consecutive heartbeats. If the filter introduces even a single extra peak or misses a single real peak, the HRV calculation for that window is wrong by 10 to 30 percent. A single bad window corrupts the HRV reading for the entire 5-minute segment. Most rings use some form of outlier rejection on the RR intervals, but the rejection logic itself assumes that the raw peak detection is more accurate than it actually is.

I think the honest position is this. A smart ring's resting heart rate reading is reliable to within 2 to 3 bpm. A smart ring's active heart rate reading is reliable to within 5 to 10 bpm during steady-state motion and effectively unreliable during irregular motion. If you see a sudden spike or drop in your reported heart rate while you were typing or fidgeting, it is probably the filter, not your heart.

The signal you never see

Every smart ring has a debug mode or engineering interface that shows the raw PPG waveform and the cleaned output side by side. No consumer app shows this view. The reason is obvious. The raw waveform during motion looks alarming to someone who has not spent time looking at biosignals. It looks like the sensor is broken. The cleaned output looks plausible but is clearly not the original signal. The gap between the two is the filter, and the filter is not magic.

I have spent enough time staring at these waveforms to develop a healthy skepticism about every heart rate number a smart ring reports during waking hours. The night data is good. The still data is good. The motion data is a reconstruction.

This is not an argument against smart rings. It is an argument for knowing what you are looking at. When your Oura app tells you your heart rate was 72 bpm while you were cooking dinner, that number passed through an adaptive filter that made assumptions about the relationship between hand motion and optical noise. The assumptions are reasonable for most people most of the time. They are wrong occasionally, and you have no way to tell when.

Pulsyn's approach is to log the signal quality metric alongside the heart rate data. The app shows a confidence indicator for each reading. A filled dot means the raw signal was clean and the reading is measured. An outline dot means the signal was filtered and the reading is estimated. A gap means the filter could not converge and no reading is available. This is a small change to the UI. I think it is a meaningful improvement in honesty, because it tells you what the data actually is instead of pretending every number has equal certainty.


About the author

James Hoffmann is the founder of Pulsyn, building a privacy-first smart ring that shows you the confidence behind every reading.


References

  1. Allen J. Photoplethysmography and its application in clinical physiological measurement. Physiological Measurement. 2007;28(3):R1-R39.
  2. Ram MR, Madhav KV, Krishna EH, Komalla NR, Reddy KA. A novel approach for motion artifact reduction in PPG signals based on AS-LMS adaptive filter. IEEE Transactions on Instrumentation and Measurement. 2012;61(5):1445-1457.
  3. Pollreisz D, TaheriNejad N. Detection and removal of motion artifacts in PPG signals. Mobile Networks and Applications. 2022;27(2):725-737.
  4. Temko A. Accurate heart rate monitoring during physical exercises using PPG. IEEE Transactions on Biomedical Engineering. 2017;64(9):2016-2024.
  5. Lee J, Kim H, Ryu M, Kim HC. A robust PPG-based heart rate estimation method using adaptive filter and signal quality assessment. Sensors. 2021;21(18):6017.