JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

Frequency Response: Filters and the Bode View

Last rung, Fourier taught us that any signal is a recipe of pure sine waves. This rung cashes that in: a linear, time-invariant system does not 'see' your waveform at all — it sees each sine wave separately and does just two things to it, scale its size and slide its phase. Bundle those two numbers across all frequencies and you get [[ee-frequency-response|H(f)]], the single curve that tells you everything a filter will ever do. By the end you will read a Bode plot, find a cutoff frequency, design an [[ee-rc-time-constant|RC]] low-pass filter by hand, and see why filtering and [[ee-convolution|convolution]] are the very same act wearing two costumes.

A system that only knows one trick

Stand at the bottom of a long playground swing and give it a push once every time it comes back. Push at exactly the swing's natural rhythm and it climbs higher and higher; push too fast or too slow and most of your effort is wasted. The swing responds to the frequency of your pushing, not to the shape of any single shove. A linear, time-invariant (LTI) system — a filter, an amplifier, a length of cable, a room full of echoes — behaves the same way. Feed it a pure sine wave and it answers with a sine wave at the exact same frequency, only resized and time-shifted. It never invents a new frequency. That single, almost boring fact is the deepest property an electrical engineer leans on.

Why does this happen? Because a sine wave (written as the complex exponential e^{j2πft}) is an eigenfunction of any LTI system: push it in, and the very same wave comes out, merely multiplied by a constant. That constant is complex — it carries a size and an angle — and it depends on the frequency f. We call it H(f), the frequency response. So the entire personality of an LTI system collapses into one complex-valued function of frequency. Tell me H(f) and I can predict the output for any input, no differential equations required.

INPUT spectrum        FILTER's response       OUTPUT spectrum
  X(f)            ×        H(f)          =        Y(f)

  |X|                     |H|                     |Y| = |H||X|
  ###                     ‾‾‾\__                  ##
  ####                       \                    ###
  #####  every freq          \   keeps lows,      ####
  ######  present            \    kills highs      ##
  +---------- f         +----------- f         +----- ·
                                                  (highs gone)

  Frequency f1: Y(f1) = H(f1) · X(f1)   <- independent
  Frequency f2: Y(f2) = H(f2) · X(f2)   <- of each other
  ...
  No frequency leaks into any other. Pure scaling per channel.
An LTI system processes each frequency in its own private lane. Output = response × input, channel by channel.

Magnitude and phase: two plots, one story

Because H(f) is complex, it carries two pieces of news at every frequency. The magnitude |H(f)| says how much that sine wave is amplified or attenuated — a gain of 2 doubles its amplitude, a gain of 0.1 shrinks it to a tenth. The phase ∠H(f) says how far the output sine wave is nudged in time relative to the input — a lag of −90° at some frequency means that wave comes out a quarter-cycle late. We almost never plot them on the same axes. Instead we draw two stacked curves versus frequency: the magnitude response on top, the phase response below. Together they are the Bode plot.

Two scaling tricks make these plots readable across the enormous range of real electronics. First, frequency runs on a logarithmic axis, so each step is a decade (×10): 10 Hz, 100 Hz, 1 kHz, 10 kHz all sit equally spaced. Audio spans three decades, RF spans nine — a linear axis would be useless. Second, magnitude is drawn in decibels: |H| in dB = 20·log₁₀|H|. The factor of 20 is for amplitude ratios (power ratios use 10). This turns multiplication into addition, so cascading two filters just adds their dB curves, and the eye reads slopes instead of curves.

  dB ratios worth memorising
  --------------------------
  |H| = 1     -> 20·log10(1)    =   0 dB    (no change)
  |H| = 2     -> 20·log10(2)    =  +6 dB    (double)
  |H| = 10    -> 20·log10(10)   = +20 dB    (×10)
  |H| = 0.707 -> 20·log10(.707) =  -3 dB    (the cutoff!)
  |H| = 0.5   -> 20·log10(.5)   =  -6 dB    (half)
  |H| = 0.1   -> 20·log10(.1)   = -20 dB    (1/10)

  A slope of '-20 dB/decade' means: every ×10 in
  frequency, the output drops by a factor of 10.
Decibel landmarks. −3 dB (a gain of 0.707) is the famous half-power point that defines a filter's edge.

Four shapes, four jobs: classifying filters

Once you read magnitude plots fluently, filters sort themselves by silhouette. A low-pass lets slow signals through and chokes off the fast ones — exactly what you want to smooth a noisy sensor reading or strip the carrier off a demodulated signal. A high-pass does the reverse, blocking DC and slow drift while passing crisp edges, the way an oscilloscope's AC-coupling input ignores a battery offset but shows you the ripple. A band-pass keeps a window of frequencies and rejects everything outside — a radio tuner picking one station out of the air. A band-stop (or notch) does the opposite, surgically removing one troublesome band, like a 50/60 Hz notch that kills mains hum in an ECG.

  LOW-PASS              HIGH-PASS
  |H|                   |H|
  ‾‾‾‾\                       /‾‾‾‾
      \                      /
       \____                /____
  +--------- f          +--------- f
     pass | stop          stop | pass

  BAND-PASS             BAND-STOP (notch)
  |H|                   |H|
      /‾‾\              ‾‾\    /‾‾
     /    \               \  /
  __/      \__             \/
  +--------- f          +--------- f
   keeps a window        removes a window
Four filter families read straight off the magnitude response — each is just a different shape of |H(f)|.

Worked example: the RC low-pass, from parts to plot

Nothing makes H(f) concrete like the humblest filter in electronics: one resistor R feeding one capacitor C, with the output taken across the capacitor. At low frequencies the capacitor has all the time in the world to charge, so it tracks the input and the output equals the input — gain ≈ 1. At high frequencies the capacitor can barely begin charging before the input reverses, so it stays near 0 V — the signal is choked off. That is a low-pass filter, built from two parts and a wire.

To get H(f) we treat the circuit as a voltage divider using complex impedances. The capacitor's impedance is Z_C = 1/(j2πfC); the resistor's is just R. The divider gives H(f) = Z_C / (R + Z_C) = 1 / (1 + j2πfRC). Notice RC together set a single time constant τ = RC, and the cutoff lands exactly where the imaginary part equals 1, i.e. 2πf_c·RC = 1.

  1. Pick parts. Let R = 1.6 kΩ and C = 100 nF. Then τ = RC = 1.6×10³ × 100×10⁻⁹ = 1.6×10⁻⁴ s = 160 µs.
  2. Find the cutoff. f_c = 1 / (2πRC) = 1 / (2π × 1.6×10⁻⁴) ≈ 995 Hz — call it 1 kHz.
  3. Check the −3 dB point. At f = f_c, the term j2πfRC = j1, so H = 1/(1+j1), |H| = 1/√2 = 0.707 → exactly −3 dB. ✓
  4. Check the phase there. ∠H = −arctan(2πfRC) = −arctan(1) = −45° at the cutoff — the signature half-way phase lag of a 1st-order low-pass.
  5. Read the roll-off. A decade above f_c (10 kHz), |H| ≈ 1/10 → −20 dB. Each further decade drops another 20 dB. Slope = −20 dB/decade.
    Vin o---[ R = 1.6k ]---+---o Vout
                           |
                         [ C ] 100nF
                           |
                          GND

  H(f) = 1 / (1 + j·2pi·f·R·C),   f_c = 1/(2pi·R·C) ~ 1 kHz

  |H| in dB                          phase
   0 ----____                          0 ---\__
  -3       ‾·(f_c)                    -45      ·(f_c)
 -20          ‾‾‾\__ -20dB/dec       -90          ‾‾‾---
      10  100  1k  10k  100k              10  100 1k 10k 100k
              (Hz, log)                        (Hz, log)

  freq     |H|      dB       phase
  100 Hz   0.995   -0.04    -5.7 deg
  1 kHz    0.707   -3.0    -45   deg   <- cutoff
  10 kHz   0.0995 -20.0    -84   deg
  100 kHz  0.010  -40.0    -89.4 deg
The RC low-pass and its Bode plot. Magnitude is flat then rolls off at −20 dB/decade; phase swings from 0° to −90°, passing −45° at f_c.

Same act, two costumes: filtering is convolution

We have been living in the frequency domain, where filtering is a clean multiply, Y(f) = H(f)·X(f). But the circuit itself lives in time, processing the signal sample by sample as it arrives. How does one multiplication in frequency translate back to time? Through the convolution theorem, the most useful bridge in all of signal processing: multiplication in frequency is convolution in time. The time-domain twin of H(f) is the impulse response h(t) — literally the wiggle the system spits out when you hit it with one infinitely sharp tap.

The link is beautifully tight: H(f) is the [[ee-fourier-transform|Fourier transform]] of h(t), and h(t) is the inverse transform of H(f). They are the same object in two languages. For our RC filter, hit it with an impulse and the capacitor charges instantly then bleeds out as h(t) = (1/RC)·e^{−t/RC} — a decaying tail of length set by τ. Convolving any input with that exponential tail is identical to multiplying its spectrum by 1/(1+j2πfRC). Two pictures, one filter.

  TIME domain                    FREQUENCY domain
  -----------                    ----------------
  x(t) --[ * h(t) ]--> y(t)      X(f) --[ × H(f) ]--> Y(f)
         convolution                    multiplication
          (hard)                          (easy)

          h(t) <----- Fourier transform -----> H(f)
          impulse response                 frequency response
          (RC: a decaying e^{-t/RC} tail)  (RC: 1/(1+j2pi f RC))

  The two domains are bridged by the Fourier transform.
  Pick whichever side makes your problem simple.
The convolution theorem: convolving with h(t) in time equals multiplying by H(f) in frequency. The Fourier transform is the door between them.

Reading a Bode plot like a pro

Put it all together and a Bode plot becomes a story you can read at a glance. Scan the magnitude curve from left to right: a flat region is a passband, a downhill slope is a stopband approaching, and the slope itself (in dB/decade) tells you the order. Find the −3 dB points to mark the cutoffs and measure the bandwidth between them. Then glance at the phase curve to judge how much the filter will smear the timing of a fast signal — phase that swings hard near the cutoff warns of ringing and delay.

  1. Find the passband. The flat top of the magnitude curve — frequencies that pass with roughly full gain (0 dB).
  2. Mark the cutoff(s). Where the curve crosses −3 dB below the passband level. One crossing = low/high-pass; two = band-pass/stop.
  3. Read the bandwidth. The span of frequencies between cutoffs (or below the single cutoff of a low-pass).
  4. Read the roll-off slope. −20 dB/decade per order. Steeper = higher order = sharper but more phase distortion.
  5. Inspect the phase. Gentle phase = faithful timing; rapid phase swing near f_c = expect delay and ringing on sharp edges.