C·02

为什么输出就是 convolution

About 7 minLecture 12

上一节只处理了由几个 impulse 组成的输入。这一节把它推广到任意输入:先把输入切成很多细条,每一条近似成一个 impulse,各自的响应相加;细条越来越窄时,求和就变成积分。这个积分就是 convolution integral。

① 第一步:输入是几个 impulse

例题

例 1 三个 impulse

沿用上一节例 1 的系统 h(t)=t e−tu(t)h(t) = t\,e^{-t}u(t)。输入是三个 impulse:t=0t=0 处面积 1,t=1t=1 处面积 0.5,t=2t=2 处面积 0.8,即 x=δ(t)+0.5 δ(t−1)+0.8 δ(t−2)x = \delta(t) + 0.5\,\delta(t-1) + 0.8\,\delta(t-2)。求 y(t)y(t) 和 y(2.5)y(2.5),并说出 t=2.5t = 2.5 时哪一个 impulse 的贡献最大。

1 2 3 4 5 .5 1 0 t 1 0.5 0.8
输入:三个 impulse,箭头高度 = 面积。
1 2 3 4 5 .2 .4 0 t h(t) = t e-tu(t)
系统的 impulse response h(t)=t e−tu(t)h(t) = t\,e^{-t}u(t),峰值在 t=1t = 1。

每一块的输出(上一节 ③:先平移再缩放):δ(t)→h(t)\delta(t) \to h(t);0.5 δ(t−1)→0.5 h(t−1)0.5\,\delta(t-1) \to 0.5\,h(t-1);0.8 δ(t−2)→0.8 h(t−2)0.8\,\delta(t-2) \to 0.8\,h(t-2)。

linear:相加。

y(t)=h(t)+0.5 h(t−1)+0.8 h(t−2)\begin{aligned} y(t) &= h(t) + 0.5\,h(t-1) \\ &\quad + 0.8\,h(t-2) \end{aligned}

代入数值。t=2.5t = 2.5 晚于三个 impulse,每一项都是"面积 × hh(已经过去的时间)",h(s)=s e−sh(s) = s\,e^{-s}:

impulse过去了多久面积 × h贡献
t=0t = 02.51×2.5e−2.51 \times 2.5e^{-2.5}0.2052
t=1t = 11.50.5×1.5e−1.50.5 \times 1.5e^{-1.5}0.1673
t=2t = 20.50.8×0.5e−0.50.8 \times 0.5e^{-0.5}0.2426
y(2.5)=0.2052+0.1673+0.2426=0.6152y(2.5) = 0.2052 + 0.1673 + 0.2426 = 0.6152
1 2 3 4 5 6 .2 .4 .6 0 t y(t) 总和 y(2.5) ≈ 0.615
灰色虚线是三个单独的响应,青色实线是它们的和 = 总输出。

贡献最大的是 t=2t = 2 那个,但只比 t=0t = 0 那个多一点:这个 hh 要过 1 秒才到峰值,刚进来 0.5 秒的 impulse 还没"长大";2.5 秒前那个虽然已经过了峰值,面积却最大。每一项是"面积 × hh(过去了多久)",两个因子都要看。

② 第二步:任意输入 = 很多细条

现在输入是一条普通的曲线 xx。把时间轴切成宽 Δλ\Delta\lambda 的小段,第 kk 段的位置记作 λk\lambda_k。这一段里的输入近似是常数 x(λk)x(\lambda_k),所以它是一个高 x(λk)x(\lambda_k)、宽 Δλ\Delta\lambda 的细矩形,面积 x(λk) Δλx(\lambda_k)\,\Delta\lambda。

1 2 3 4 1 0 λ x(λ) 细条(宽 Δλ)
橙色阶梯:把 x(λ)x(\lambda) 切成细条。横轴用 λ\lambda 而不是 tt,因为 tt 要留给"我们在问哪一时刻的输出"。

当 Δλ\Delta\lambda 远小于 hh 变化的时间尺度(比如 h=t e−th = t\,e^{-t} 时 Δλ≪1\Delta\lambda \ll 1 s),系统分辨不出一个窄矩形和一个同面积的 impulse:两者产生的输出几乎一样。所以第 kk 条可以换成面积 x(λk)Δλx(\lambda_k)\Delta\lambda、位于 λk\lambda_k 的 impulse。按上一节 ③(平移 λk\lambda_k,乘以面积),它产生的输出是

x(λk) Δλ⋅h(t−λk)x(\lambda_k)\,\Delta\lambda \cdot h(t-\lambda_k)

linear:总输出 = 所有细条的输出之和。

y(t)≈∑kx(λk) h(t−λk) Δλy(t) \approx \sum_k x(\lambda_k)\,h(t-\lambda_k)\,\Delta\lambda

这正是一个 Riemann sum。令 Δλ→0\Delta\lambda \to 0,求和变成对 λ\lambda 的积分:

convolution integral(卷积积分),Alexander 式 (15.66) y(t)=∫−∞∞x(λ) h(t−λ) dλ=x(t)∗h(t)\begin{aligned} y(t) &= \int_{-\infty}^{\infty} x(\lambda)\,h(t-\lambda)\,d\lambda \\ &= x(t) * h(t) \end{aligned}

逐个符号看:

  • tt:我们要求输出的那个时刻。积分过程中它是常数;积完以后,结果才是 tt 的函数。
  • λ\lambda:dummy variable(哑变量),扫过"输入的每一小块是什么时候进来的",积完就消失。
  • x(λ) dλx(\lambda)\,d\lambda:λ\lambda 时刻进来的那一小块输入的面积。
  • h(t−λ)h(t-\lambda):那一小块到 tt 时刻已经过了 t−λt-\lambda 秒,这是它此刻留下的余波(每单位面积)。
  • ∗*:读作"convolution",不是乘号。

推导只用了 linear 和 time-invariant,所以这个公式对任何 LTI 系统都成立,和电路的细节无关;它给出的是系统在输入到来之前静止(initial condition 为 0)时的输出。

一句话

输出 = 过去每一小块输入留下的余波之和。正因为它是"把很多响应叠加起来",Alexander 也把它叫 superposition integral(叠加积分)。

③ 例:Riemann sum 怎样变成积分

例题

例 2 用细条近似算 y(2)

x(t)=u(t)x(t) = u(t),h(t)=t e−tu(t)h(t) = t\,e^{-t}u(t)(同例 1)。求 y(2)y(2):(a) 用宽 Δλ=0.5\Delta\lambda = 0.5 的细条近似;(b) 用 Δλ=0.25\Delta\lambda = 0.25;(c) 用积分精确计算。

先看哪些 λ\lambda 有贡献。t=2t = 2。x(λ)=u(λ)x(\lambda) = u(\lambda) 只在 λ>0\lambda \gt 0 时为 1;h(2−λ)h(2-\lambda) 只在 2−λ>02 - \lambda \gt 0,即 λ<2\lambda \lt 2 时不为 0。所以只有 0<λ<20 \lt \lambda \lt 2 有贡献,被积函数是 h(2−λ)=(2−λ) e−(2−λ)h(2-\lambda) = (2-\lambda)\,e^{-(2-\lambda)}。

0.5 1 1.5 2 = t .2 .4 0 λ 4 根条(Δλ = 0.5) h(2−λ)
青色是被积函数 h(2−λ)h(2-\lambda),橙色是 4 根条。每根条的高度 = "λk\lambda_k 时刻进来的那一小块,到 t=2t = 2 时还剩多少余波"。最高的是 1 秒前进来的那块(hh 的峰值),不是最晚进来的。

(a) Δλ=0.5\Delta\lambda = 0.5。4 条,中点 λk=0.25,0.75,1.25,1.75\lambda_k = 0.25, 0.75, 1.25, 1.75,过去的时间 2−λk=1.75,1.25,0.75,0.252 - \lambda_k = 1.75, 1.25, 0.75, 0.25。高度 (2−λk)e−(2−λk)(2-\lambda_k)e^{-(2-\lambda_k)} 依次是 0.3041、0.3581、0.3543、0.1947,和 1.2112,乘宽度 0.5:

y(2)≈0.5×1.2112=0.6056y(2) \approx 0.5 \times 1.2112 = 0.6056

(b) Δλ=0.25\Delta\lambda = 0.25。8 条,中点 0.125, 0.375, …, 1.875,同样算出 y(2)≈0.5969y(2) \approx 0.5969。

(c) 积分。换元 s=2−λs = 2 - \lambda("那一小块进来以后过了多久"):dλ=−dsd\lambda = -ds,λ\lambda 从 0 到 2 对应 ss 从 2 到 0,负号正好把上下限翻回来:

y(2)=∫02(2−λ) e−(2−λ) dλ=∫02s e−s dsy(2) = \int_0^2 (2-\lambda)\,e^{-(2-\lambda)}\,d\lambda = \int_0^2 s\,e^{-s}\,ds

分部积分(ss 求导,e−se^{-s} 积分):∫s e−sds=−s e−s+∫e−sds=−(s+1) e−s\int s\,e^{-s}ds = -s\,e^{-s} + \int e^{-s}ds = -(s+1)\,e^{-s}。所以

∫0Ts e−s ds=1−(1+T) e−Ty(2)=1−3e−2=0.5940\begin{aligned} \int_0^T s\,e^{-s}\,ds &= 1 - (1+T)\,e^{-T} \\ y(2) &= 1 - 3e^{-2} = 0.5940 \end{aligned}

条越窄,近似值(0.6056 → 0.5969)越接近积分值 0.5940。上面这个 ∫0Ts e−sds\int_0^T s\,e^{-s}ds 的式子C·03例 2 还会用。

容易混的地方
  • 积分对 λ\lambda 积,tt 在积分里是常数。
  • 被积函数里是 h(t−λ)h(t-\lambda),不是 h(λ−t)h(\lambda - t),也不是 h(λ)h(\lambda)。
  • ∗* 不是乘法:C·04例 1 会看到 u∗u=t u(t)u * u = t\,u(t),而 u⋅u=uu \cdot u = u。
  • 公式要求系统是 LTI,并且在输入到来之前是静止的。