Hot Motors on Betaflight: Tune Filters From Your Blackbox Log
Motors too hot to touch after a pack, a hiss on punch-outs, jello, a buzz in the hover: that's noise, and the instinct is to turn filter knobs. But filters don't remove the cause. They hide mechanical problems, add delay, and do nothing when the noise is feedforward reacting to your radio. Below: the four numbers bbdoctor pulls from a log to find the source, real logs for each case, and the fix order.
Why noise cooks motors
The gyro picks up more than the quad's motion: prop imbalance, a rough bearing, arm flex, a loose stack. The filters cut some of it and the rest goes into the PID loop. P passes noise straight through. D is a derivative, so its output grows with frequency: before the D-term lowpass, a 300 Hz vibration of the same amplitude as a 30 Hz wobble gets ten times more D.
That noise ends up in the motor commands, and a propped rotor can't follow it. When bbdoctor compares RPM with the command it allows for about 20 ms of rotor lag, roughly an 8 Hz lowpass. At 80 Hz the RPM follows about ten times weaker; at 300 Hz it barely moves. No thrust, but the winding current still jerks every cycle and turns into heat in the ESC and motor. Hence the 80 Hz line.
The four numbers
Everything uses in-flight data only; "noise" means RMS above 80 Hz.
| Number | How it's computed | Good | Warning | Bad |
|---|---|---|---|---|
| Raw gyro, deg/s | RMS of the unfiltered gyro, worst of roll and pitch | below 4 | 4–10 | 10 or more |
| Filtered gyro, deg/s | the same for the filtered gyro the PIDs see | under 1: headroom | above 3: noise reaches the PIDs | — |
| Filter delay, ms | the shift at which raw and filtered gyro line up best (cross-correlation), mean of roll and pitch | no fixed norm; 0.8–3.2 in this guide's logs | above 1.5 with low noise: delay to win back | — |
| Motor HF noise, % of travel | RMS of the motor commands, worst motor; logs at 500 Hz or faster only | up to 2.5 | above 2.5 | above 4 |
The fifth number is which term carries the noise. Betaflight and INAV log the PID terms separately (axisP, axisD, axisF). bbdoctor high-passes each one at 80 Hz, converts it to percent of motor travel (a PID sum of 1000 is full travel) and computes each term's share of the noise energy: 60% or more makes it the source, otherwise it's "mixed".
Two caveats. The delay compares raw and filtered gyro, so it covers only the gyro chain (lowpasses, notches, RPM filter), not the D-term filters further down. And motor noise lives in the hundreds of hertz, which a 250 Hz log can't see (it stops at 125 Hz), hence the 500 Hz minimum.

Where the noise comes from: four cases
Mechanics: the raw gyro is noisy
Log A in the figure: Betaflight 4.2.5, 215 seconds of flight. Raw noise is 35.8 deg/s on roll and 23.8 on pitch. After the filters it's 1.34 deg/s and the motors are clean: the report flags the raw noise as critical but calls the filters fine. The filters did their job, at the cost of 3.2 ms of delay, the most of any log in this guide. Judge by the filtered gyro or the motors and you'd miss it, yet that 200–450 Hz hump is props, motors or something loose.
The fix is a screwdriver and fresh props, not filters. Once the raw noise drops, the filters have real headroom to win back some delay. To find the exact motor or prop: finding a bad motor or prop from your log.
The tune: noise gets through the filters and D carries it
Log C in the second figure: a 1S whoop on INAV 8.0. Raw gyro 22.1 deg/s, 4.8 after the filters, so noise is getting through. Motor HF noise is a critical 5.5%, 97% of it carried by D. Less D or lower D-term cutoffs make sense here, but with 4.8 deg/s left after filtering the props and frame need work too (D amplifies whatever gets through), and first comes a gain that looks like a typo (below).
D can be the problem even with the motors under 2.5%. Once D alone sends 1.5% of travel to them (3% is critical), bbdoctor raises a separate "D-term noise reaches the motors" finding with a ladder: filtered gyro at 1 deg/s or more, mechanics first; RPM filter off (dshot_bidir = OFF or rpm_filter_harmonics = 0), turn it on; then the D-term cutoffs 15% down from current, or, if the D-term filter is already below 70 Hz, D 10% down instead, since going lower adds delay for little gain. Still hot? D −10% on the next flight. With the motors above 2.5% the advice is shorter: mechanics, then the D-term cutoffs −15% or less D.
Feedforward jitter from the radio
Log A in the second figure: a VX3.5 on Betaflight 4.5.2, 1 kHz log, motor HF noise at a warning-level 3.0%. The stock advice to lower the D-term filters or D would do nothing: D carries 4% of the noise, P under 1%, feedforward 96%. FF is the derivative of the stick, and since the radio sends commands in packets, every packet step makes it kick. Here FF above 40 Hz was 3.6% of motor travel on roll, with 51 kicks per second over 5% of travel across 112 seconds of stick movement.
The tell, even without analysis: motors noisy while the sticks move, quiet in a hover. The same report showed 25–31% overshoot, so bbdoctor's first step is the FF cut from that finding, then averaging and smoothing on the next flight, then feedforward_jitter_factor 7 → 12:
set feedforward_averaging = 2_POINT set feedforward_smooth_factor = 65 save
Those are Betaflight 4.3+ names. On 4.2 bbdoctor reaches for ff_interpolate_sp (AVERAGED_2, or AVERAGED_3 on a 500 Hz link), ff_spike_limit (down to 50) and rc_smoothing_auto_smoothness (up to 20). How FF overshoot looks in the step response: PID tuning from blackbox.
A gain that looks like a typo
Same whoop: roll P 17 and D 50, pitch P 40 and D 35 (INAV default: D 23 with P 40). D is three times P on one axis and below P on the other, and in the log the roll D-term is 12 times stronger than P. bbdoctor flags this pattern (D at least 2×P on one axis, at most P on the other) as a likely typo and puts it first, since it costs one CLI line: D × 0.7 on that axis; if the noise stays, mechanics and the D-term filters:
set mc_d_roll = 35 save

Share and size are different things. In log B, D carries 83% of the noise, but that's only 0.5% of travel: nothing to fix. Share tells you what to fix; size tells you whether to bother.
Fix order
- Mechanics. Fresh props from the same batch, motor screws snug, and spin every motor by hand: smooth, no grinding, no play. No cracked arms, the stack on soft mounts, and nothing flapping: camera, antenna, battery strap.
- RPM filter. You need bidirectional DShot (
dshot_bidir = ON), ESCs on Bluejay, AM32 or BLHeli_32, and the correctmotor_poles(the number of magnets in the bell). Harmonics are set withrpm_filter_harmonics,gyro_rpm_notch_harmonicson 4.1–4.2; 0 means the filter is off. To check that it works, log RPM too: see blackbox setup. - Dynamic notch for resonances that don't follow RPM. With a working RPM filter, 1–2 notches are usually enough (
dyn_notch_count, BF 4.3+). bbdoctor treats a peak that stays at one frequency across throttle (6 dB over the floor in at least 60% of throttle bands, above 60 Hz) as a frame or stack resonance. It only suggests a static notch when the frequency is unambiguous: the log runs at the PID loop rate, or at 2 kHz or faster with the peak below half the Nyquist frequency. In three 6S logs on 4.5.1 (logged at 1013 Hz with a 4 kHz PID loop) the peaks show up at 186–226 Hz, and a "206 Hz" peak could really be 206, 807 or 1219 Hz. Instead of a blind notch, bbdoctor asks for a short log withblackbox_sample_rate = 1/1. - Lowpass filters. Down 15% from current: the D-term ones if D carries the noise, the gyro ones if noise gets through the filters or P carries it. Don't take the D-term filter below 70 Hz.
- D last, and only if D carries the noise and the filters are already low. D names changed in 2025.12, see below.
One exception to this order: a gain that looks like a typo goes first. One change per flight. After each one, fly 30–60 seconds, land, unplug the pack, feel the motors. Cooler: keep it. Not cooler: roll it back.
The main rule: don't raise D on hot, noisy motors, not even for propwash. The reverse holds too: if the report shows overshoot on roll or pitch, don't lower D to cool the motors; the overshoot will grow, so bbdoctor sticks to mechanics and the D-term filters.
Filter names across Betaflight versions
| What | Betaflight 4.0–4.2 | Betaflight 4.3–4.5 and 2025.12 |
|---|---|---|
| Gyro dynamic lowpass | dyn_lpf_gyro_min_hz / dyn_lpf_gyro_max_hz | gyro_lpf1_dyn_min_hz / gyro_lpf1_dyn_max_hz |
| Gyro static lowpass 1 | gyro_lowpass_hz | gyro_lpf1_static_hz |
| Gyro lowpass 2 | gyro_lowpass2_hz | gyro_lpf2_static_hz |
| D-term dynamic lowpass | dyn_lpf_dterm_min_hz / dyn_lpf_dterm_max_hz | dterm_lpf1_dyn_min_hz / dterm_lpf1_dyn_max_hz |
| D-term static lowpass 1 | dterm_lowpass_hz | dterm_lpf1_static_hz |
| D-term lowpass 2 | dterm_lowpass2_hz | dterm_lpf2_static_hz |
| RPM filter harmonics | gyro_rpm_notch_harmonics (4.1–4.2) | rpm_filter_harmonics |
| Filter sliders | 4.2: Configurator only; none before | simplified_gyro_filter, simplified_dterm_filter |
2025.12 keeps the filter names but changes what D means: the base value is now d_roll/d_pitch and the upper one is d_max_roll/d_max_pitch.
The slider trap (4.3+): with simplified_dterm_filter = ON, saving a Configurator tab with sliders recalculates the cutoffs from the multiplier and wipes hand-set values. A real VX3.5 log has the D-term at 180/420 Hz with the slider on at 100, which would give the stock 75/150, so those cutoffs were set by hand or by a preset. Changing cutoffs in the CLI? Switch the slider off.
Work from your current values (get dterm_lpf shows them). bbdoctor takes them from the log header, multiplies every cutoff by 0.85 (or 1.15 to go up) and switches the slider off. For this VX3.5's D-term (180/420 Hz, lowpass 1 at 158, lowpass 2 at 150) a 15% cut looks like this; it's only arithmetic, since FF carries that log's noise:
set dterm_lpf1_dyn_min_hz = 153 set dterm_lpf1_dyn_max_hz = 357 set dterm_lpf1_static_hz = 134 set dterm_lpf2_static_hz = 128 set simplified_dterm_filter = OFF save
And don't reach for simplified_tuning apply as a quick fix: it recalculates filters and PIDs from Betaflight's defaults, not from yours, and silently wipes a hand tune.
When you can relax the filters
Less filtering means less delay and better propwash handling. bbdoctor suggests raising the gyro cutoffs 15% only when all of these hold:
- filtered noise below 1 deg/s on roll and pitch;
- delay above 1.5 ms, otherwise there's nothing to win;
- raw gyro below 4 deg/s;
- no frame resonance;
- the log was recorded at 500 Hz or faster.
For the 4.5 defaults (250/500 Hz, lowpass 2 at 500) the commands would be:
set gyro_lpf1_dyn_min_hz = 288 set gyro_lpf1_dyn_max_hz = 575 set gyro_lpf1_static_hz = 288 set gyro_lpf2_static_hz = 575 set simplified_gyro_filter = OFF save
When noise and delay pass but the raw gyro is noisy or there's a resonance, the report says there's headroom but it's too early to relax. Otherwise it calls the filters fine (or warns above 3 deg/s filtered); a log under 500 Hz gets no relax verdict. A 6S on 4.5.1 with exactly those defaults: 0.6 deg/s filtered and 2.2 ms of delay, plenty of headroom on paper, but 7.4 deg/s raw and a resonance at 206 Hz. The filters are busy with noisy mechanics, and relaxing them sends that noise to the motors. A 4.2 6S log at 534 Hz: 0.31 deg/s filtered, 2.8 ms, but 4.7 raw, so again too early. Of the 17 logs where I could measure both the raw gyro and the delay, none met all five conditions. Clean mechanics are rarer than people think.
Delay vs propwash
Delay is what you pay for filtering. In the logs for this guide it ranges from 0.8 ms (INAV 6.0) to 3.2 ms (the 4.2.5 log with the hump). Convert it to phase to judge it: at 50 Hz, mid propwash band, 1 ms is 18° of lag and 3.2 ms is already 58°. The later the loop sees an oscillation, the worse it damps it: hence propwash, and with enough delay the loop oscillates on its own.
Two VX3.5 flights on 4.5.2: the first with the gyro lowpass at 250/500 Hz and the D-term at 75/150, the second with 300/700 and 180/420. Delay dropped from 2.2 to 1.2 ms, and the worst-axis filtered noise stayed around 1.4–1.5 deg/s both times. Motor HF noise rose from 1.6 to 3.0%, but 96% of it in the second flight was feedforward, with the sticks moving for 112 seconds against 45. Pulling the D-term filters back down to cool the motors would be pointless. For delay in the step response, see PID tuning from blackbox.
Common mistakes
- Lowering filters when FF carries the noise. Delay goes up, the motors stay just as hot.
- Raising D on hot motors for propwash or a "locked-in" feel. D amplifies exactly the high frequencies.
- Judging noise from a 250 Hz log. It only sees up to 125 Hz, and 300 Hz motor noise folds down to 50 Hz (300 − 250), where it looks like a slow oscillation. Logging setup: blackbox setup.
- Notching a peak from a slow log without checking that the frequency is unambiguous: you cut the wrong frequency and add delay.
INAV, ArduPilot and PX4
INAV. Gyro lowpass is gyro_main_lpf_hz (60 Hz by default), the dynamic one runs between gyro_dyn_lpf_min_hz and gyro_dyn_lpf_max_hz and is switched on with gyro_use_dyn_lpf = ON up to 7.x or gyro_filter_mode = DYNAMIC from 8.0 (which also adds ADAPTIVE). The D-term lowpass is dterm_lpf_hz (110 by default, 120 on the whoop above). D is mc_d_roll / mc_d_pitch, FF is mc_cd_roll / mc_cd_pitch. The RPM filter, rpm_gyro_filter_enabled, only works with a separate ESC telemetry wire. More in INAV blackbox analysis.
ArduPilot. Gyro lowpass is INS_GYRO_FILTER (20 Hz in most ArduCopter logs I tested), the D filter is ATC_RAT_RLL_FLTD / ATC_RAT_PIT_FLTD. bbdoctor scales them the same way, × 0.85 or × 1.15. Motor noise and resonances are handled by the harmonic notch, INS_HNTCH_*, driven by throttle, ESC telemetry or FFT. For a fixed frame resonance with an unambiguous frequency bbdoctor suggests the second notch, INS_HNTC2_* with INS_HNTC2_MODE = 0. More in ArduPilot log analysis.
PX4. Gyro lowpass is IMU_GYRO_CUTOFF, the D filter is IMU_DGYRO_CUTOFF. On PX4 the time shift between logged topics isn't the filter delay (it can read 0 with a 30–60 Hz cutoff), so bbdoctor estimates the delay from the setting instead: √2/(2π·fc) for a second-order lowpass. At 40 Hz, where most of the PX4 logs I tested sit, that's 5.6 ms, more than any Betaflight log above. At 70 Hz it's 3.2 ms. The static notch is IMU_GYRO_NF0_FRQ / IMU_GYRO_NF0_BW (1.13 and later; IMU_GYRO_NF_FREQ / IMU_GYRO_NF_BW before), and the dynamic notch (ESC RPM or FFT) is IMU_GYRO_DNF_EN. More in PX4 ULog analysis.
Check it automatically
Upload your log to bbdoctor: Betaflight .bbl and .bfl, INAV .txt, ArduPilot .bin or PX4 .ulg. The report computes all four numbers, splits motor noise into P, D and FF, checks resonances for an unambiguous frequency, and gives CLI commands scaled from your current cutoffs, with the slider switched off where needed. See the example report. No log yet but you have a diff all? The config check flags disabled lowpasses and dynamic notch, an RPM filter without telemetry, and sliders far from 1.0.
FAQ
Why do my motors get hot on Betaflight?
Noise above 80 Hz in the motor commands. It makes no thrust: the winding current jerks back and forth on every cycle and turns into heat. The log shows where it comes from: mechanics (a noisy raw gyro), the D-term, or feedforward jitter from the radio. Only touch the filters once you know which PID term carries the noise.
Should I lower the filters or D first?
Mechanics and the RPM filter come first. If D carries the motor noise, lower the D-term filter cutoffs by 15% from where they are now; if the D-term filter is already below 70 Hz, lower D by 10% instead. If feedforward carries it, neither the filters nor D will help: smooth the feedforward. One change per flight.
Can I relax the filters to fight propwash?
Only when everything lines up: filtered noise below 1 deg/s, delay above 1.5 ms, raw gyro below 4 deg/s, no frame resonance, and a log recorded at 500 Hz or faster. Then raise the gyro filter cutoffs by 15% and feel the motors after every flight.
How hot is too hot for motors?
Land right after a normal pack, unplug the battery and grab a bell. If you can keep a finger on it for a few seconds, you're fine. If you pull away at once, smell varnish, or one motor is clearly hotter than the rest, stop flying and find the cause in the log. After any filter change, start with a short 30–60 second flight.
Updated: