Disturbance Rejection: S(s) at Low Frequency
Learn how the sensitivity function S(s) quantifies disturbance rejection, why high low-frequency loop gain reduces S(s), and how to measure it.

Contents & prerequisites
What is the sensitivity function S(s) and why does it matter for disturbance rejection?
The sensitivity function S(s) measures how much a disturbance entering the feedback loop survives at the output, and it is the single most direct tool for predicting disturbance rejection. Where most engineers first encounter control theory through the closed-loop transfer function from reference to output, S(s) flips the question: instead of "how does my system respond to a commanded step?" it asks "how does my system respond to something I didn't command — load torque, wind gust, supply ripple, sensor drift?" Every real control loop lives with both questions simultaneously, but only one of them is usually on the datasheet.
Definition of S(s) = 1/(1+L(s)) in the feedback loop
S(s) is defined algebraically from the loop gain L(s), the product of controller, plant, and feedback sensor transfer functions around the loop: S(s) = 1/(1 + L(s)). If you break the loop open at any point and measure the gain all the way around back to the same point, that gain is L(s). Close the loop, and the transfer function from an additive disturbance at the plant output to the system output is exactly S(s). This is why S(s) is called the sensitivity function — it quantifies the closed-loop's sensitivity to anything injected outside the controller's direct path.
How S(s) quantifies the closed-loop response to external disturbances
For a disturbance d(s) entering at the plant output, the resulting output error is y(s) = S(s)·d(s) — no plant model required beyond what's already folded into L(s). If S(s) is small at the frequencies where your disturbance lives, the disturbance barely shows up at the output. If S(s) approaches 1, the loop does nothing to help; the disturbance passes through unattenuated. If |S(jω)| exceeds 1 — which happens at some frequency in every real loop — the feedback is actually making things worse than open loop at that frequency, a fact that surprises engineers who assume "closed loop" always means "better."
Why disturbance rejection is central to control system performance
Reference tracking and disturbance rejection are not the same job, even though both are evaluated against the same closed loop. A servo that tracks a step command beautifully can still drift off position under a constant external load if its disturbance rejection is poor — the kind of steady-state error a performance-specs analysis would flag as Ess even when the step response looks clean on paper. In motor control, thermal regulation, and power conversion, the dominant real-world challenge is almost always rejecting disturbances — load changes, ambient temperature swings, input voltage transients — rather than following a reference that barely moves after startup.
How does loop gain L(s) shape the sensitivity function at low frequencies?
Loop gain L(s) and sensitivity S(s) are reciprocally related, so pushing L(s) up at a given frequency pushes S(s) down at that same frequency. This single relationship is the lever behind essentially every disturbance-rejection design decision.
DC gain and steady-state behavior: S(0) = 1/(1+L(0))
At DC (s = 0), S(0) = 1/(1 + L(0)). If your controller includes an integrator, L(0) is infinite, and S(0) collapses to zero — a constant disturbance produces zero steady-state output error. This is the mathematical reason every textbook tells you to add integral action for load disturbance rejection: it isn't about tracking, it's about driving S(0) to zero.
High loop gain reduces S(s) magnitude near DC
Without an integrator, a proportional-only controller with DC loop gain L(0) = 50 gives S(0) = 1/51 ≈ 0.0196, meaning a disturbance is attenuated to about 2% of its open-loop value at steady state — a 34 dB reduction. Raise L(0) to 500 and S(0) drops to about 0.002, a 54 dB reduction. The relationship is not linear: each decade of loop gain buys roughly 20 dB of low-frequency disturbance attenuation, until something else in the loop runs out of headroom.
Trade-off between disturbance rejection and measurement noise amplification
Pushing loop gain up without limit is not free, because the complementary sensitivity function T(s) = L(s)/(1+L(s)) = 1 − S(s) governs how sensor noise reaches the output, and S + T = 1 always. Driving S(s) toward zero at some frequency forces T(s) toward 1 at that same frequency, meaning measurement noise and model uncertainty pass through essentially unattenuated. In practice this trade-off is managed by frequency separation: push loop gain high where disturbances live (typically low frequency) and let it roll off where sensor noise dominates (typically high frequency), rather than trying to raise gain uniformly across the whole spectrum.
What is the mathematical relationship between S(s) and steady-state error?
S(s) evaluated at s = 0 gives the exact steady-state fraction of a constant disturbance that survives to the output, with no simulation required.
How S(s) at s=0 determines output disturbance attenuation
For a step disturbance of amplitude D entering at the plant output, the steady-state output error equals D·S(0). If S(0) = 0.01, a 2°C constant thermal disturbance settles to a 0.02°C steady-state error. This is a direct, closed-form calculation from the loop gain's DC value — no need to run the full time-domain simulation just to check the steady-state number.
Connection to final value theorem for disturbance signals
This result comes straight from the final value theorem: for a disturbance d(t) that is a unit step, d(s) = 1/s, and the steady-state output is lim(s→0) s·S(s)·d(s) = lim(s→0) s·S(s)/s = S(0). The same theorem applies to ramp disturbances and other polynomial inputs, but then the relevant quantity is not S(0) alone — it depends on how many integrators L(s) contains, the same system-type reasoning used when computing Ess for reference tracking.
Quantifying error rejection ratio in decibels
Engineers usually express S(s) magnitude in decibels: 20·log10|S(jω)|. A value of −40 dB means the disturbance is attenuated to 1% of its original amplitude; −20 dB means 10%; 0 dB means no attenuation at all. When reviewing a Bode plot of S(jω), the frequency range where the curve sits well below 0 dB is the range over which your loop is actually doing useful disturbance rejection work.
How do you design low-frequency disturbance rejection into a controller?
Low-frequency disturbance rejection is designed by shaping L(s) to have high magnitude below the frequencies where disturbances are expected, which in practice means adding integral action and setting gain as high as stability margins allow.
Increasing loop gain at low frequencies without sacrificing stability
Raising proportional gain alone increases L(jω) at all frequencies, including near the crossover frequency where phase margin is determined — pushed too far, this erodes stability margins and produces overshoot or oscillation. The fix is loop shaping: add gain specifically at low frequency without disturbing the gain and phase near crossover, which is exactly what integral action does.
Integrator action and proportional-integral (PI) structure effects
A PI controller, C(s) = Kp + Ki/s, adds a pole at the origin that drives L(0) to infinity and therefore S(0) to zero, while contributing only a bounded −90° phase lag that can be placed well below crossover so it doesn't threaten stability. The integral gain Ki sets how fast the low-frequency gain rises; too large a Ki moves that rise close enough to crossover to eat into phase margin, so Ki is typically tuned as a fraction of the crossover frequency determined during loop-gain design, not picked independently.
Practical limits from actuator saturation and measurement noise
No amount of loop-shaping math survives contact with a saturated actuator: if the controller demands more current, torque, or duty cycle than the actuator can deliver, the linear S(s) model stops applying and the system behaves like an open integrator winding up, often requiring anti-windup logic. On the other end of the spectrum, pushing gain up at low frequency is safe for noise because sensor noise is usually concentrated at higher frequencies — but any 1/f noise or sensor offset drift sits right in the band you're trying to amplify, and it will show up at the output exactly as "disturbance rejection" working against you.
What is the relationship between S(s) magnitude and actual disturbance attenuation?
The magnitude |S(jω)| at a given frequency is literally the attenuation factor applied to a disturbance at that frequency, read directly off a Bode magnitude plot.
Interpreting |S(jω)| in magnitude plots for disturbance signals
A Bode plot of |S(jω)| typically starts low (good attenuation) at low frequency, rises through 0 dB somewhere near the loop's crossover region, and often peaks above 0 dB — the sensitivity peak Ms — before settling back toward 1 at high frequency where the loop has no authority. That peak above 0 dB is not a bug; it is a mathematical consequence of S + T = 1 and the Bode sensitivity integral, which guarantees that gain reduction at some frequencies is paid for with gain amplification at others.
Frequency-dependent rejection: why low-ω disturbances are suppressed differently than high-ω
A disturbance at 1 Hz might see 40 dB of attenuation while the same loop offers 0 dB or even −3 dB of attenuation (i.e., amplification) at 50 Hz, purely because loop gain has rolled off by then. This is why "disturbance rejection" is never a single number for a system — it's a curve, and the right question is always "rejection at what frequency," matched against the actual spectral content of the disturbance you care about.
Typical target values for |S(jω)| at process-relevant frequencies
As a rough design target, many industrial loops aim for |S(jω)| below −20 dB (10% of disturbance passing through) across the known disturbance bandwidth, with a sensitivity peak Ms kept below about 6 dB (a factor of 2) to maintain adequate stability margins — but the exact numbers belong in your specific requirements document, not a rule of thumb, since the right target depends on actuator headroom, sensor noise floor, and how much steady-state error the application can tolerate.
How do you measure and validate disturbance rejection in hardware or simulation?
You validate S(s) by injecting a known disturbance and comparing the measured output attenuation against the model's prediction, not by trusting the Bode plot alone.
Injecting calibrated disturbances and observing output attenuation
In hardware, inject a disturbance at the plant output or input — a load torque step on a motor, a current pulse into a power stage, a heat-gun pulse on a thermal plant — and record the resulting output deviation. Comparing that deviation against the disturbance's known amplitude gives a direct, frequency-specific measurement of |S(jω)| at the frequency (or frequencies) the disturbance contains. For sinusoidal disturbances injected across a frequency sweep, this produces a measured Bode plot of S(jω) you can overlay against the design curve.
Extracting S(jω) from measured closed-loop response data
A practical lab technique: inject a sine or chirp disturbance signal at a summing point between controller and plant, measure both the injected signal and the resulting output, and take the ratio of their Fourier transforms (or use a network/signal analyzer doing swept-sine analysis) to get |S(jω)| and its phase directly. This bypasses the need to independently identify controller and plant transfer functions — S(s) comes out as a single measured curve.
Verifying design predictions against real system behavior
Discrepancies between measured and predicted S(jω) usually trace to unmodeled plant dynamics, actuator nonlinearity, or quantization effects in a digital controller that weren't in the design-time model. A 3–6 dB mismatch near the sensitivity peak is common and worth investigating before shipping, since it directly predicts how much stability margin you actually have versus what the paper design claimed — the same margin-versus-performance trade-off that governs every one of the standard performance specifications used to sign off a control loop.
Related reading
- Noise Amplification: T(s) at High Frequency — the complementary high-frequency trade-off.
- First-Order Step Response: Rise Time, Settling Time — measuring the resulting transient response.
Learning
Sign in to track your progress.
Evidence
Public projects engineers linked to Disturbance Rejection: S(s) at Low Frequency.
No engineer has linked a project to this topic yet. Built something that proves it? Add the project and tag it with control-systems-disturbance-rejection-ss-at-low-frequency — it then shows here and on your public profile.
