Skip to main content

LTI Systems and Convolution

Linear time-invariant systems are the central model class in signals and systems because they are both expressive and computable. Linearity lets responses add, and time invariance lets a shifted input impulse produce a shifted copy of one fixed response. From these two facts, the output for any input is obtained by convolution with the impulse response.

Convolution is often introduced as a formula, but its meaning is constructive. Break the input into weighted impulses. Pass each impulse through the system. Shift and scale the impulse response for each piece. Add all those responses. In continuous time this addition becomes an integral; in discrete time it becomes a sum.

Definitions

The impulse response of a continuous-time system is the output when the input is δ(t)\delta(t):

h(t)=T{δ(t)}.h(t)=T\{\delta(t)\}.

The impulse response of a discrete-time system is

h[n]=T{δ[n]}.h[n]=T\{\delta[n]\}.

For a continuous-time LTI system, the input can be represented as

x(t)=x(τ)δ(tτ)dτ.x(t)=\int_{-\infty}^{\infty}x(\tau)\delta(t-\tau)\,d\tau.

By time invariance,

T{δ(tτ)}=h(tτ).T\{\delta(t-\tau)\}=h(t-\tau).

By linearity, the output is

y(t)=x(τ)h(tτ)dτ.y(t)=\int_{-\infty}^{\infty}x(\tau)h(t-\tau)\,d\tau.

This is the continuous-time convolution of xx and hh, written

y(t)=(xh)(t).y(t)=(x*h)(t).

For a discrete-time LTI system,

x[n]=k=x[k]δ[nk],x[n]=\sum_{k=-\infty}^{\infty}x[k]\delta[n-k],

so

y[n]=k=x[k]h[nk].y[n]=\sum_{k=-\infty}^{\infty}x[k]h[n-k].

This is discrete-time convolution:

y[n]=(xh)[n].y[n]=(x*h)[n].

Convolution has equivalent forms:

(xh)(t)=h(τ)x(tτ)dτ,(x*h)(t)=\int_{-\infty}^{\infty}h(\tau)x(t-\tau)\,d\tau,

and

(xh)[n]=k=h[k]x[nk].(x*h)[n]=\sum_{k=-\infty}^{\infty}h[k]x[n-k].

For a causal continuous-time LTI system,

h(t)=0for t<0.h(t)=0 \quad \text{for } t<0.

For a causal discrete-time LTI system,

h[n]=0for n<0.h[n]=0 \quad \text{for } n<0.

BIBO stability for an LTI system is equivalent to absolute integrability or summability:

h(t)dt<\int_{-\infty}^{\infty}|h(t)|\,dt<\infty

for continuous time, and

n=h[n]<\sum_{n=-\infty}^{\infty}|h[n]|<\infty

for discrete time.

Key results

Convolution is commutative:

xh=hx.x*h=h*x.

For continuous time, this follows from the change of variables λ=tτ\lambda=t-\tau. For discrete time, it follows from the index substitution =nk\ell=n-k. Commutativity means either signal can be flipped and shifted in the graphical convolution procedure, but it does not mean the physical roles of input and impulse response are identical.

Convolution is associative:

x(h1h2)=(xh1)h2.x*(h_1*h_2)=(x*h_1)*h_2.

This property explains why cascaded LTI systems have an equivalent impulse response

heq=h1h2.h_{\text{eq}}=h_1*h_2.

Convolution is distributive:

x(h1+h2)=xh1+xh2.x*(h_1+h_2)=x*h_1+x*h_2.

This explains parallel interconnections of LTI systems.

The impulse is the identity element:

x(t)δ(t)=x(t),x[n]δ[n]=x[n].x(t)*\delta(t)=x(t), \qquad x[n]*\delta[n]=x[n].

Shifting an impulse response shifts the output:

x(t)δ(tt0)=x(tt0),x(t)*\delta(t-t_0)=x(t-t_0),

and

x[n]δ[nn0]=x[nn0].x[n]*\delta[n-n_0]=x[n-n_0].

For differential equation systems with zero initial rest, impulse response can be found by solving the equation with impulse input or by transform methods. For difference equation systems, h[n]h[n] is found by setting x[n]=δ[n]x[n]=\delta[n] and recursively computing the output, assuming initial rest.

Graphical convolution is easiest when treated as an overlap problem. First identify where x(τ)x(\tau) is nonzero. Then identify where h(tτ)h(t-\tau) or h[nk]h[n-k] is nonzero for a fixed output time or sample. The output is the area or sum of the product over the overlap. For rectangular pulses this reduces to overlap length; for ramps and exponentials the integrand changes over the overlap and the integral must be evaluated on each range.

Support gives a quick check. If x(t)x(t) is supported on [a,b][a,b] and h(t)h(t) is supported on [c,d][c,d], then xhx*h is supported on [a+c,b+d][a+c,b+d], assuming no exact cancellations. In discrete time, if one sequence occupies indices aa through bb and another occupies cc through dd, the convolution occupies a+ca+c through b+db+d. This support rule catches many off-by-one and endpoint mistakes.

Convolution also explains why LTI systems are easy to interconnect. In cascade, impulse responses convolve. In parallel, impulse responses add. In feedback, the equivalent impulse response can often be described by an infinite convolution series or by transform-domain algebra, provided the feedback interconnection is stable and well-defined. These interconnection rules are not generic system rules; they rely on LTI structure.

The impulse response is sometimes more informative than the original equation. A short finite impulse response means the system has finite memory. A long decaying impulse response means old inputs continue to matter but with decreasing influence. A nondecaying impulse response warns that bounded inputs may produce unbounded or persistent accumulated effects.

Visual

LTI factContinuous timeDiscrete time
Impulse responseh(t)=T{δ(t)}h(t)=T\{\delta(t)\}h[n]=T{δ[n]}h[n]=T\{\delta[n]\}
Convolutiony(t)=x(τ)h(tτ)dτy(t)=\int x(\tau)h(t-\tau)d\tauy[n]=kx[k]h[nk]y[n]=\sum_k x[k]h[n-k]
Causalityh(t)=0h(t)=0 for t<0t\lt 0h[n]=0h[n]=0 for n<0n\lt 0
BIBO stabilityh(t)dt<\int \vert h(t)\vert dt\lt \inftynh[n]<\sum_n \vert h[n]\vert \lt \infty
Identityδ(t)\delta(t)δ[n]\delta[n]

Worked example 1: continuous-time convolution of two pulses

Problem: Let

x(t)=u(t)u(t2),h(t)=u(t)u(t3).x(t)=u(t)-u(t-2), \qquad h(t)=u(t)-u(t-3).

Find y(t)=x(t)h(t)y(t)=x(t)*h(t).

Method:

  1. Interpret the signals. x(t)x(t) is a unit-height rectangle on 0t<20\le t\lt 2. h(t)h(t) is a unit-height rectangle on 0t<30\le t\lt 3.

  2. The convolution integral is

y(t)=x(τ)h(tτ)dτ.y(t)=\int_{-\infty}^{\infty}x(\tau)h(t-\tau)\,d\tau.
  1. The factor x(τ)x(\tau) is nonzero for
0τ<2.0\le \tau<2.
  1. The factor h(tτ)h(t-\tau) is nonzero when
0tτ<3.0\le t-\tau<3.

This is equivalent to

t3<τt.t-3<\tau\le t.
  1. The integrand equals 11 where the intervals overlap:
[0,2)(t3,t].[0,2) \cap (t-3,t].

Therefore y(t)y(t) equals the length of that overlap.

  1. Work by ranges of tt:

If t<0t\lt 0, no overlap:

y(t)=0.y(t)=0.

If 0t<20\le t\lt 2, the overlap is from 00 to tt, length tt:

y(t)=t.y(t)=t.

If 2t<32\le t\lt 3, the shorter pulse is fully inside the longer overlap window, length 22:

y(t)=2.y(t)=2.

If 3t<53\le t\lt 5, the overlap is from t3t-3 to 22, length 5t5-t:

y(t)=5t.y(t)=5-t.

If t5t\ge 5, no overlap:

y(t)=0.y(t)=0.

Checked answer:

y(t)={0,t<0,t,0t<2,2,2t<3,5t,3t<5,0,t5.y(t)= \begin{cases} 0, & t<0,\\ t, & 0\le t<2,\\ 2, & 2\le t<3,\\ 5-t, & 3\le t<5,\\ 0, & t\ge 5. \end{cases}

The support length is 2+3=52+3=5, as expected for convolution of two right-starting finite pulses.

Worked example 2: discrete-time convolution

Problem: Compute y[n]=x[n]h[n]y[n]=x[n]*h[n] for

x[n]=δ[n]+2δ[n1]+δ[n2],x[n]=\delta[n]+2\delta[n-1]+\delta[n-2],

and

h[n]=δ[n]δ[n1].h[n]=\delta[n]-\delta[n-1].

Method:

  1. Use impulse shifting:
xh=(δ[n]+2δ[n1]+δ[n2])h[n].x*h=(\delta[n]+2\delta[n-1]+\delta[n-2])*h[n].
  1. Distribute convolution:
y[n]=δ[n]h[n]+2δ[n1]h[n]+δ[n2]h[n].y[n]=\delta[n]*h[n]+2\delta[n-1]*h[n]+\delta[n-2]*h[n].
  1. Convolution with a shifted impulse shifts hh:
y[n]=h[n]+2h[n1]+h[n2].y[n]=h[n]+2h[n-1]+h[n-2].
  1. Substitute h[n]=δ[n]δ[n1]h[n]=\delta[n]-\delta[n-1]:
y[n]=(δ[n]δ[n1])+2(δ[n1]δ[n2])+(δ[n2]δ[n3]).y[n]=(\delta[n]-\delta[n-1]) +2(\delta[n-1]-\delta[n-2]) +(\delta[n-2]-\delta[n-3]).
  1. Collect like impulse terms:
y[n]=δ[n]+δ[n1]δ[n2]δ[n3].y[n]=\delta[n]+\delta[n-1]-\delta[n-2]-\delta[n-3].

Checked answer: The output samples are 11 at n=0n=0, 11 at n=1n=1, 1-1 at n=2n=2, 1-1 at n=3n=3, and 00 elsewhere. Direct summation gives the same result.

Code

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 1], dtype=float)
h = np.array([1, -1], dtype=float)
y = np.convolve(x, h)

print("y samples:", y)

n_x = np.arange(len(x))
n_h = np.arange(len(h))
n_y = np.arange(len(y))

fig, ax = plt.subplots(3, 1, figsize=(7, 6), sharex=True)
ax[0].stem(n_x, x)
ax[0].set_title("x[n]")
ax[1].stem(n_h, h)
ax[1].set_title("h[n]")
ax[2].stem(n_y, y)
ax[2].set_title("y[n]=x[n]*h[n]")
for a in ax:
a.grid(True)
plt.tight_layout()
plt.show()

Common pitfalls

  • Forgetting the flip in graphical convolution. The term is h(tτ)h(t-\tau) or h[nk]h[n-k], not h(t+τ)h(t+\tau).
  • Using LTI convolution for a system that is linear but time-varying, or time-invariant but nonlinear.
  • Confusing impulse response with step response. The step response is the convolution of hh with uu.
  • Dropping boundary cases in finite pulse convolution. Draw overlap intervals and compute lengths.
  • Assuming causal means stable. A causal impulse response can still fail absolute integrability or summability.

Connections