Drone Vibration: Find the Bad Motor or Prop From Your Log
After a crash the quad buzzes on throttle, the footage has jello, and one motor comes down hotter than the rest. Pulling props one at a time and swapping motors is slow, and unreliable when the problem comes and goes. With the right fields recorded, the log points straight at the motor and separates real vibration from look-alikes: an off-centre CG, a tilted motor, telemetry glitches.
Below: how it works in bbdoctor, its thresholds and what real logs showed.
What is shaking: motor, prop or frame
| What the log shows | Likely cause | What to do |
|---|---|---|
| One motor has a much stronger component at its rotation frequency (1×) than the others | Imbalance: bent or badly seated prop, debris under the hub, bent bell or shaft | Fresh prop, then inspect bell and shaft |
| One motor has elevated 2× or 3× components | Damaged blade, blades with different pitch or tracking | Replace the prop |
| A motor spins slower than the others at the same command | Worn bearings, rubbing bell, burnt winding, higher-pitch prop | Spin it by hand, swap it with a neighbour |
| A motor spins faster than the others at the same command | The prop loads it less: chipped, clipped, wrong size, slipping on the shaft | Inspect and replace the prop |
| A peak at one frequency regardless of throttle | Frame, stack, camera or antenna resonance | Tighten screws, secure parts; a notch is only a stopgap |
| Motors of one spin direction always work harder | Tilted motor, twisted arm, mismatched prop pitch on the diagonals | Check the frame on a flat table, straighten motors, matching props |
| One pair (front or rear) is always loaded more, pitch I-term never returns to zero | Off-centre CG | Move the battery instead of replacing motors |
The last two rows aren't vibration, but they usually explain one hot motor.
Why the spectrum can't name the motor
Motor speeds keep changing, so over a flight their peaks smear into one band, and equally loaded motors differ by a few hertz at most. Even when pairs spin differently (on the VX3.5 below, the rearward CG kept the rear motors at 240–280 Hz and the front at 190–215), the spectrum can point at a pair, not a motor.
Then there's the logging rate. On that 3.5-inch VX3.5 the peak motor speed across flights was 583–644 Hz (roughly 35,000–39,000 RPM), while the log ran at 1 kHz, so only content up to 500 Hz is visible. Everything above folds back: 600 Hz shows up at 400 Hz, 644 Hz at 356 Hz. The peak is there, but its frequency no longer says where it came from.
What the log needs
Two things: the unfiltered gyro and per-motor RPM.
- Betaflight 4.5 and newer, including 2025.12. DShot300 or DShot600 with bidirectional DShot, the correct pole count, ESCs on Bluejay, AM32 or BLHeli_32. 4.5 logs both fields by default. Log at 2 kHz rather than 1 kHz: a 1/2 divider at a 4 kHz PID loop, 1/4 at 8 kHz.
- Betaflight 4.0–4.4. The raw gyro only reaches the log via
debug_mode = GYRO_SCALED, and motor RPM isn't logged at all: both fields arrived in 4.5. Bidirectional DShot (4.1+) feeds the RPM filter, but per-motor analysis needs 4.5. - ArduPilot. RPM from ESC telemetry (bidirectional DShot via
SERVO_BLH_BDMASK, or serial telemetry), raw gyro from the IMU_RAW bit inLOG_BITMASK, plusINS_RAW_LOG_OPTon 4.5 and later. See ArduPilot log analysis. - PX4. RPM from
esc_status, raw gyro from anSDLOG_PROFILEwith High rate and Raw FIFO gyro. See PX4 ULog analysis.
For Betaflight 4.5+ (14 poles covers most motors from 18xx up; if in doubt, count the magnets in the bell):
set dshot_bidir = ON set motor_poles = 14 set blackbox_disable_rpm = OFF set blackbox_disable_gyrounfilt = OFF set blackbox_sample_rate = 1/2 save
The 1/2 divider assumes a 4 kHz PID loop; at 8 kHz use 1/4, or you'll log at 4 kHz and fill the flash twice as fast. The test flight: a minute or two of hovering, smooth throttle sweeps, some forward flight. Freestyle with crashes is worse: impacts add their own noise and motor speeds keep crossing. More in the blackbox setup guide.
How per-motor order tracking works
It's borrowed from rotating-machinery diagnostics:
- Motor phase. eRPM gives each motor's rotation frequency at every sample; accumulating it gives the rotor angle, the phase.
- Blocks. The raw roll and pitch gyro, with motion below 30 Hz removed, is cut into 0.25 s blocks: 4 Hz frequency resolution.
- Demodulation. Each block is "unwound" by one motor's phase. Whatever rotates in sync with that motor adds up; the other motors and the noise average out. This yields 1× (once per revolution: imbalance), 2× and 3×.
- Noise floor. The same calculation 12 and 16 Hz either side of the harmonic gives the background, which is subtracted in power terms. The report shows vibration "with noise subtracted".
- Rejection. A block is skipped when any motor is below 20 Hz, and a harmonic when it is under 40 Hz, within 15 Hz of half the logging rate, or within 10 Hz of any other harmonic, another motor's or its own folded one: where they cross, they can't be told apart.
- Result. The median over all blocks, which shrugs off outliers. At least 8 blocks (two seconds of usable flight) are required.
Because the phase comes from the true rotation frequency, aliasing doesn't matter: a motor at 640 Hz in a 1 kHz log is analysed like one at 300 Hz. Rejection costs data: in a 193-second VX3.5 flight the front-left motor kept 387 of roughly 770 blocks.
| Condition | Threshold | Why |
|---|---|---|
| Motor's harmonic above its own noise | at least ×2.5 | Don't accuse a motor over a level buried in the background |
| Reference | median of the other motors whose harmonic is at least ×1.5 above noise; 0.1 deg/s if there are none | The motor itself is excluded, and motors whose harmonic is lost in noise don't drag the reference down |
| 1× stronger than the reference | 1.8× warning, 3× critical | For comparison: unflagged spread in our logs reached 1.5–1.7× |
| 2× or 3× stronger than the reference | 2.2× warning | These harmonics are weaker and scatter more between motors |
| Minimum data | 8 blocks of 0.25 s, data on at least three motors | Two blocks or a single neighbour prove nothing |
What real logs showed
The same motor in three flights
A 3.5-inch VX3.5 on Betaflight 4.5.2, 4S, 1 kHz logging, three flights of two to three minutes. All three times the report flagged M4, front left:
- flight one: 2.6 deg/s vs ~1.3 on the others, 2.0×, ×6.0 above noise, 243 blocks;
- flight two: 2.9 vs ~1.4, 2.0×, ×6.1, 387 blocks;
- flight three: 2.5 vs ~1.2, 2.2×, ×4.9, 229 blocks.

That's the signature of a hardware problem: chance doesn't pick the same motor three times. In a fourth flight M4 was the loudest again, at 1.75×, just under the threshold, so the report stayed quiet. The threshold cuts borderline cases; you decide from a series of logs.
M3 (rear left) also runs high at 1.6–1.7× but never crosses the threshold: worth a look, no more. And M4 is the least loaded motor on this quad (in flight two the front pair averaged 21% command, the rear 33%), yet it vibrates the most. So it's not load but an imbalance in the prop, bell or shaft.
A 6S quad where the culprit moves around
A different build on Betaflight 4.5.1, 6S, logging at about 1 kHz, four flights over two weeks. One flight flagged M3 (rear left): 3.2 vs ~1.7 deg/s, 1.8×, ×12.4 above noise, 619 blocks. Another flagged M1 (rear right): 4.0 vs ~2.1, 1.9×, ×13.3, 713 blocks. In the other two, M3 and M4 were loudest at 1.5× and 1.6×, below the threshold.
The signal is stronger here, but the culprit changes between flights. That usually means props, which get swapped, clip grass and chip. When the finding moves around, start with a fresh set of props, not motors.
These logs also show why the noise gate matters. Single motors had an alarming-looking 2× ratio of 4.8–5.3, but no other motor's 2× rose even ×1.5 above noise, so the ratio was taken against the 0.1 deg/s floor. The harmonic was about 0.5 deg/s, ×1.6–1.9 above noise, under the ×2.5 gate, so the report rightly ignored it.
Reading the "the more even, the better" line
The report lists each motor's 1× vibration. For VX3.5 flight two: M1: 1.4, M2: 0.7, M3: 2.3, M4: 2.9.

Absolute numbers depend on the frame, arm stiffness and FC mounting, so don't compare "2.9 deg/s" between quads; compare motors within one quad and against its earlier logs. If the line evens out after a prop change, it is fixed, even if nothing was flagged.
When data is thin
A PX4 1.12 log at 200 Hz from a large 6S craft, motors at 41–53 Hz: harmonics keep dropping below 40 Hz, hitting the 85 Hz ceiling or crossing. 1× was computable on two motors only. At 2× the report said "motor 2: elevated 2× harmonic, 52.9× stronger (5.3 vs ~0.0 deg/s)", but the other motors had no measurable noise floor, so none entered the reference and the ratio used 0.1 deg/s, although motor 1's own 2× was higher, 8.6 deg/s. Inspect the props, but it's no verdict: weigh absolute deg/s, block count and logging rate, not just the ratio.
RPM at the same command
The second, independent check covers friction and load. Healthy motors with matching props spin equally fast at the same command. The analysis bins the flight by motor command (10–90% in 5% steps, at least 0.3 s of data per motor in each bin) and compares each motor's median RPM with the average of the other motors, so one weak motor doesn't make its neighbours look fast. The result averages the bins.
RPM also lags the command by about 20 ms of rotor inertia. Ignored, that makes harder-working motors (say, the rear pair with a rearward CG) look 2–3% "slower" with nothing wrong, so the command gets the same lag first.
| Deviation from the others | Level | What to check |
|---|---|---|
| −6% or lower | warning | Bearings (spin by hand, feel for grinding), a rubbing bell, overheated windings, prop pitch |
| −10% or lower | critical | Same, and don't fly it until checked: it eats thrust headroom and overheats |
| +6% or higher | warning | The prop: chipped or clipped blade, wrong pitch or size, slipping on the shaft |
Normal: the VX3.5 came out at +2.0%, −1.7%, +2.0%, −2.2%, with single bins up to ±4% (panel B above); the rear pair reads slightly "faster" almost everywhere, likely not the motors: the rearward CG keeps them at high command for long stretches, while the front pair only touches it in bursts. The 6S quad's totals stayed within ±0.6%. The 6% threshold sits well clear of this scatter.
Read both checks together. Strong 1× with normal RPM: imbalance (the VX3.5's M4). Low RPM without a 1× spike: friction or a cooked winding. Both on one motor: usually crash damage, a bent shaft or a rubbing bell.
Confirm it on the bench
- Fresh prop. Fit a new prop from the same batch to the suspect motor and fly. Peak gone — it was the prop. Check that the hub sits flat: sand or a cocked washer under the prop causes the same imbalance.
- Motor by hand. Battery disconnected, prop off (the motor may still be hot after a flight), spin the bell: grinding, notchiness, vertical shaft play or rub marks on the stator mean new bearings or a new motor. Watch from the side for bell wobble; impacts bend bells.
- Swap. Swap the motor with a neighbour. The problem moved — it's the motor. It stayed — check the ESC, solder joints or arm.
- Geometry. On a flat table, check that every motor stands vertical and no arm is twisted.
- Control log. Fly the same simple flight and compare the 1× line.
Motors tab spin tests — props off only. Some faults hide without load, so the log has the final word.
Numbering: Betaflight and INAV, Quad X — M1 rear right, M2 front right, M3 rear left, M4 front left. ArduPilot and PX4 — 1 front right, 2 rear left, 3 front left, 4 rear right. bbdoctor uses the log's firmware numbering and, when the frame layout is known, adds the position: "Motor 4 (front left)".
Look-alikes: when the motors are fine
- Off-centre CG. On the same VX3.5 the rear pair was loaded 42–54% more than the front in every flight, with the pitch I-term sitting at 42–55 to compensate (lots of fast forward flight looks similar). The warning starts at a 12% difference between sides, critical above 30%. Move the battery until the quad balances level on your fingers under the frame centre.
- A diagonal fighting yaw. If the motors of one spin direction average 12% or more above the others, the mixer is constantly correcting yaw. A small 2S quad (CS110) showed 15%, a 1S whoop on INAV 46%. The causes are mechanical (tilted motor, twisted arm, mismatched prop pitch), so new motors won't fix it.
- eRPM telemetry errors. On another 6S quad (Betaflight 4.5.1) M3 and M4 had 1.3 and 1.6 RPM jumps per second, the other two under 0.1. The threshold is over one jump per second or over 1% zeros while spinning. The RPM filter then puts its notches in the wrong place. Check the ESC signal wire joint, interference from the power leads, and the ESC firmware.
- Frame resonance. A peak fixed in frequency at any throttle is frame or stack mechanics. In a log at about 1 kHz its true frequency is ambiguous: on the 6S quad (1013 Hz log) a "186 Hz" peak could equally be 827 or 1199 Hz. How to spot it on the heatmap: reading a blackbox log.
- Tune noise. Weak filtering or high D heats motors with no mechanical fault; that and RPM filter and notch setup are covered in hot motors and filter tuning.
Jello in the footage
Jello is a rolling-shutter artefact: the sensor reads the frame line by line, and if the camera shakes during readout, the lines shift. So jello directly shows vibration reaching the camera: prop or bell imbalance, a loose mount, a resonating bracket.
Log first: if one motor stands out at 1×, change its prop and inspect the motor, then fit fresh props all round. If per-motor vibration is even and the jello stays, it's the mount: tighten the screws, make sure the camera doesn't touch the frame, add dampers or a TPU mount. Stabilisation in post often won't remove fine high-frequency jello.
No RPM in the log
INAV and EmuFlight usually don't log per-motor RPM, nor does Betaflight before 4.5, and ArduPilot or PX4 without ESC telemetry have no source for it. Per-motor analysis is then unavailable, and the report says so. What still works:
- Noise heatmap against throttle. Lines climbing with throttle come from motors and props; a fixed-frequency line is the frame. That decides between props and frame, though not which motor.
- Motor load. Pair imbalance and the yaw diagonal come from motor commands and don't need RPM.
- ArduPilot VIBE. Below 30 m/s² is normal, above 60 nearly always hurts altitude and position hold; there's also an accelerometer clipping counter.
Then it's the old way: new props first, then motor swaps. If your ESCs can do bidirectional DShot, enabling it on Betaflight 4.5 beats a day of swaps.
Check it automatically
Upload your log to bbdoctor, free and online. It runs every check in this guide. If fields are missing, the report says which to enable and gives the CLI commands. See the example report, and check your settings before flying with the config check.
FAQ
How do I tell which motor is causing the vibration?
You need a log with the unfiltered gyro and per-motor RPM (bidirectional DShot or ESC telemetry). Then the vibration can be split by motor: the culprit shows a much stronger component at its own rotation frequency (1×). bbdoctor flags a motor when that component is 1.8× stronger than on the others and clearly above the noise. Without RPM in the log you are back to swapping props and motors.
Is it the prop or the motor?
Put a fresh prop on the suspect motor and fly again. Peak gone — it was the prop. Still there — swap the motor with a neighbour: if the problem moves with the motor, the motor is at fault (bell, shaft, bearings); if it stays on the same arm, look at the ESC, solder joints or the arm. If the motor keeps standing out flight after flight, even with a new prop, look at the bell, shaft and bearings.
Why is one motor hotter than the others?
Compare its RPM at the same command: if it spins 6% or more slower than the others, something is dragging it — bearings, a rubbing bell, a burnt winding or a higher-pitch prop. If its RPM is normal, the usual cause is an off-centre CG: one pair of motors works harder all the time and runs hotter.
Does finding the bad motor work without bidirectional DShot?
The per-motor analysis does not: without RPM there is no way to tie vibration to a specific motor. The log still shows the overall noise level, frame resonances, load imbalance between motor pairs and a diagonal that is fighting yaw. The exact motor is then found by swapping props and motors.
Updated: