RPM filter setup in Betaflight: bidirectional DShot and motor poles
The RPM filter removes motor noise by placing narrow notches at each motor’s rotation frequency and its harmonics. To work it needs bidirectional DShot, ESC firmware that supports it, and the right motor pole count. The defaults are rpm_filter_harmonics=3, rpm_filter_q=500, rpm_filter_min_hz=100 and motor_poles=14. Once it works you can run lighter filtering elsewhere.
What does the RPM filter need?
Three things must be true, and a fault in any one stops it working properly.
- Bidirectional DShot on. The flight controller asks each ESC for its motor speed over the same signal wire. The setting is
dshot_bidir, which is OFF by default. It needs a DShot protocol, so analog PWM protocols can’t do it. - ESC firmware with bidirectional DShot support. The ESC must send the speed back. Check your ESC’s documentation, as not every ESC firmware does this. Hardware also matters, so check that your flight controller and ESC support it.
- The correct motor pole count.
motor_polesis the number of magnets in the motor bell, 14 by default. The flight controller turns the speed it receives into a frequency using this number. A wrong count puts the notches at the wrong frequency.
What are the RPM filter settings?
| Setting | CLI name | Default |
|---|---|---|
| Bidirectional DShot | dshot_bidir |
OFF |
| Motor poles | motor_poles |
14 |
| Harmonics | rpm_filter_harmonics |
3 |
| Width (Q) | rpm_filter_q |
500 |
| Lowest frequency | rpm_filter_min_hz |
100 Hz |
| Fade range | rpm_filter_fade_range_hz |
50 Hz |
| Signal smoothing | rpm_filter_lpf_hz |
150 Hz |
| Strength per harmonic | rpm_filter_weights |
100,100,100 (4.5 and newer only) |
These are the same in 4.3, 4.4, 4.5, 2025.12 and 2026.6. rpm_filter_weights does not exist before 4.5.
Harmonics. The motor makes noise at its rotation frequency and at multiples of it. Harmonics sets how many of these the filter covers, up to the default of 3. Setting it to 0 turns the RPM filter off.
Q. Q sets how narrow each notch is. A higher Q is narrower, so it removes less signal around the noise and adds less delay. A lower Q is wider and more forgiving when the speed reading is noisy.
Minimum frequency. The notches never move below this frequency, so they stay clear of the low range where real movement lives.
Fade range. Notches fade in and out near the minimum frequency, over this range, instead of switching on abruptly.
Signal smoothing. rpm_filter_lpf_hz smooths the speed reading before it positions the notches.
Weights. From 4.5, rpm_filter_weights sets the strength of each harmonic’s notch, from the first to the third. At 100 each is at full strength.
How do you check the RPM filter is working?
Do the first two checks on the bench with props off. Check the third in a log.
- Motors tab. With bidirectional DShot on, the Motors tab shows a speed readout for each motor. Spin the motors with props off, using the slider, and confirm each shows a plausible reading that rises with the throttle. A motor with no reading points to an ESC or wiring problem.
- ESC error rate. The same tab shows how many of the speed messages arrive damaged. A few are normal. A high error rate means the notches will jump around, so fix that before relying on the filter.
- Noise in a log. Fly a slow throttle sweep with unfiltered gyro logging and read the spectrum. A working RPM filter leaves the gyro with no clear ridge climbing with throttle. If a ridge still rises with the throttle after the filter, the filter is either off, off by a pole count, or the speed data is faulty. The filter tuning guide explains how to read the spectrum.
Logging motor speed makes this easier. From 4.5 the log records it unless blackbox_disable_rpm is ON, and the default is OFF.
How does the RPM filter let you filter less?
Without it, the dynamic notch has to track motor noise, which takes several notches with a low Q and costs filter delay. With a working RPM filter, motor noise is already gone, so the dynamic notch only has to catch what remains, mainly frame resonance. You can run fewer dynamic notches, and raise the gyro and D-term lowpass cutoffs in small steps. The result is less filter delay and a sharper quad.
Don’t remove filtering in one jump. Lower the dynamic notch count by one, or raise a cutoff by about 10% to 20%, then fly and touch the motors. Never turn the dynamic notch and lowpass filters all off.
What are the common RPM filter setup mistakes?
- Wrong pole count. The number of magnets is 14 on many motors, but not all. Count the magnets in the bell or check the motor listing, and don’t guess. A wrong count shifts every notch.
- Bidirectional DShot on, but the ESC doesn’t support it. The Motors tab shows no speed. Turn it off again rather than leave the filter running on bad data.
- Setting
dshot_bidirwithout a compatible DShot protocol. Use a DShot protocol that your ESCs support. - High error rate ignored. The filter then reacts to bad readings. Check the wiring and the ESC setup first.
- RPM filter on, but old notch settings left in. A diff from an older tune may carry heavy gyro and D-term filtering and many notches, which you no longer need. Review them after the filter works.
- Harmonics cut to 0 by mistake. That turns the filter off even with bidirectional DShot on.
- Treating mechanical noise as a setting problem. The RPM filter can’t remove noise from a bent prop or loose screw. See hot motors after tuning.
How FPV PID Tune handles it
When you plug in, the app reads dshot_bidir, motor_poles and the RPM filter settings, and warns you when the RPM filter is off. It doesn’t switch bidirectional DShot on for you, because that’s a motor setting. With the RPM filter running, a filters round only touches the rpm_filter_* values if motor peaks remain in the log. Without it, the app covers motor noise with more dynamic notches. Every change is validated against fixed safety limits and read back after Apply. The how it works page shows the whole flow.
