在电子/控制工程中,复数绝不只是单纯的数学抽象。交流电路分析中的相量(phasor)、拉普拉斯变换中的 s=σ+jω、Z变换中的单位圆、伯德图中的复频率响应 — 这一切都根植于复变函数论。本文将从复数体系出发,一路讲到留数定理、Z变换与数字滤波器设计,彻底征服这一整块内容。
直角坐标形式(Rectangular Form):
z=x+iy=x+jy
(电气工程中用 j 代替 i,因为 i 用来表示电流)
- 实部:Re(z)=x
- 虚部:Im(z)=y
极坐标形式(Polar Form):
z=reiθ=r(cosθ+isinθ)=r∠θ
- 模(大小):r=∣z∣=x2+y2
- 幅角(相位):θ=arg(z)=arctan(y/x)(需考虑所在象限)
欧拉公式(Euler's Formula):
eiθ=cosθ+isinθ
由此可得:
cosθ=2eiθ+e−iθ,sinθ=2ieiθ−e−iθ
被誉为数学史上最美公式的欧拉恒等式:
eiπ+1=0
五个最重要的数(e、i、π、1、0)由一个式子连接在一起。
棣莫弗公式(De Moivre's Formula):
(reiθ)n=rneinθ=rn(cosnθ+isinnθ)
n次方根:z1/n=r1/nei(θ+2kπ)/n,k=0,1,…,n−1
表示单位圆上 n 等分的点。(1的n次方根:WNk=ej2πk/N — 会在FFT中出现!)
加法/减法(直角坐标形式更方便):
(x1+iy1)±(x2+iy2)=(x1±x2)+i(y1±y2)
乘法(极坐标形式更方便):
(r1eiθ1)(r2eiθ2)=r1r2ei(θ1+θ2)
模相乘,相位相加 — 这是电气工程中阻抗相乘的基础。
除法:
r2eiθ2r1eiθ1=r2r1ei(θ1−θ2)
共轭复数(Complex Conjugate):
zˉ=x−iy=re−iθ
有用的性质:
- zzˉ=x2+y2=∣z∣2
- Re(z)=(z+zˉ)/2
- Im(z)=(z−zˉ)/(2i)
- ∣zˉ∣=∣z∣,arg(zˉ)=−arg(z)
复数的威力,在交流电路分析中得到了充分发挥。
将 v(t)=Vmcos(ωt+ϕ) 表示为相量:
V=Vmejϕ=Vm∠ϕ
阻抗(Impedance):
ZR=R(纯电阻,无相位差)
ZL=jωL(电感,相位超前+90度)
ZC=jωC1=ωC−j(电容,相位滞后-90度)
串联RLC阻抗:
Z=R+jωL+jωC1=R+j(ωL−ωC1)
模:∣Z∣=R2+(ωL−1/(ωC))2
相位:ϕ=arctan(RωL−1/(ωC))
谐振条件:ω0L=1/(ω0C) → ω0=1/LC,Z=R(纯电阻)
传递函数(Transfer Function):
H(jω)=X(jω)Y(jω)
这就是拉普拉斯域中的 H(s)∣s=jω,也是伯德图的基础。
f(z)=f(x+iy)=u(x,y)+iv(x,y)
其中 u,v 是实值函数。
示例:
f(z)=z2=(x+iy)2=x2−y2+i(2xy)
u(x,y)=x2−y2,v(x,y)=2xy
f(z)=ez=ex+iy=ex(cosy+isiny)
u(x,y)=excosy,v(x,y)=exsiny
f(z) 的复数导数:
f′(z0)=limΔz→0Δzf(z0+Δz)−f(z0)
与实数不同,Δz 必须能在复平面上任意方向趋近于0,且极限值都相同。
沿x轴方向(Δz=Δx):
f′(z)=∂x∂u+i∂x∂v
沿y轴方向(Δz=iΔy):
f′(z)=i1∂y∂u+∂y∂v=−i∂y∂u+∂y∂v
两个表达式要相等,需要满足:
∂x∂u=∂y∂v,∂y∂u=−∂x∂v
这就是柯西-黎曼方程(Cauchy-Riemann Equations)。
若 u,v 的偏导数连续,且满足柯西-黎曼方程,则 f(z) 是解析函数(Analytic Function)。
解析函数的实部和虚部,分别满足拉普拉斯方程:
∇2u=∂x2∂2u+∂y2∂2u=0
∇2v=∂x2∂2v+∂y2∂2v=0
证明:由柯西-黎曼方程可得 uxx=vyx,uyy=−vxy,因此 uxx+uyy=vyx−vxy=0(混合偏导数可交换求导顺序)。
已知 u 时,可利用柯西-黎曼方程求出 v(调和共轭函数)。
工程意义:势流理论中速度势与流函数的关系,静电学中电势与电力线的关系。
指数函数 ez=ex(cosy+isiny):
- 在整个复平面上解析
- (ez)′=ez
- ∣ez∣=ex,arg(ez)=y
三角函数:
cosz=2eiz+e−iz,sinz=2ieiz−e−iz
- cosz、sinz 在整个复平面上解析
- 与实数三角函数不同,模可以趋向无穷大:∣cos(iy)∣=coshy→∞
双曲函数:
coshz=2ez+e−z,sinhz=2ez−e−z
cos(iz)=coshz,sin(iz)=isinhz
对数函数(多值函数):
lnz=lnr+i(θ+2kπ),k∈Z
主值(principal value):Lnz=lnr+iθ,−π<θ≤π
在 z=0 与负实轴上会出现奇异性(分支切割,branch cut)。
C:复平面上的曲线(参数化 z(t)=x(t)+iy(t),a≤t≤b)
∫Cf(z)dz=∫abf(z(t))z′(t)dt
示例:∫Cz2dz(C:从原点到 1+i 的直线)
参数化:z(t)=t+it,z′(t)=1+i,0≤t≤1
∫01(t+it)2(1+i)dt=∫01t2(2i)(1+i)dt=(2i)(1+i)⋅31=32i+2i2=3−2+2i
∮Cf(z)dz=0
条件:f(z) 在单连通闭曲线 C 上及其内部解析。
直观理解:解析函数的积分与路径无关。
与格林定理的关系:
∮Cf(z)dz=∮C(u+iv)(dx+idy)=∮C(udx−vdy)+i∮C(vdx+udy)
应用格林定理和柯西-黎曼方程,两项都为0。
路径无关性:闭曲线积分为0 ↔ 积分与路径无关
原函数(antiderivative):若 F′(z)=f(z),则 ∫abf(z)dz=F(b)−F(a)
f(a)=2πi1∮Cz−af(z)dz
条件:f(z) 在 C 上及其内部解析,a 位于 C 内部。
解读:f(z)/(z−a) 在 z=a 处有一个极点。柯西公式说明,极点周围的积分与函数值直接相关。
高阶导数公式:
f(n)(a)=2πin!∮C(z−a)n+1f(z)dz
这说明了解析函数可以无限次求导!
泰勒级数:若 f(z) 在 z=z0 附近解析,则:
f(z)=∑n=0∞an(z−z0)n,an=n!f(n)(z0)
洛朗级数(Laurent Series):若 f(z) 在环形区域 r1<∣z−z0∣<r2 上解析,则:
f(z)=∑n=−∞∞an(z−z0)n=∑n=0∞an(z−z0)n+∑n=1∞(z−z0)nbn
负幂次部分称为主要部分(principal part)。
当 f(z) 在 z=z0 处不解析时:
可去奇点(Removable Singularity):洛朗级数中没有负幂次项。
zsinz=1−6z2+120z4−⋯(z=0 为可去奇点)
只要在 z=0 处赋予函数值1,函数就变为解析的。
m阶极点(Pole of Order m):有限个负幂次项。
f(z)=(z−z0)m1(解析函数)(m阶极点)
本性奇点(Essential Singularity):无穷多个负幂次项。
e1/z=1+z1+2!z21+⋯(z=0 为本性奇点)
皮卡定理:在本性奇点附近,函数值几乎能取遍所有复数。
留数的定义:f(z) 的洛朗级数中 (z−z0)−1 项的系数。
Res[f,z0]=b1=2πi1∮∣z−z0∣=ϵf(z)dz
留数的计算方法:
单极点(m=1):
Res[f,z0]=limz→z0(z−z0)f(z)
有理函数 f=p/q(单极点):
Res[f,z0]=q′(z0)p(z0)
m重极点:
Res[f,z0]=(m−1)!1limz→z0dzm−1dm−1[(z−z0)mf(z)]
留数定理(Residue Theorem):
∮Cf(z)dz=2πi∑kRes[f,zk]
zk 是 C 内部的所有奇点。
复变函数论最强大的应用之一:把很难计算的实积分变得简单。
例1:I=∫−∞∞1+x2dx
f(z)=1/(1+z2)=1/[(z+i)(z−i)]
使用上半平面的半圆路径。z=i 是上半平面的单极点:
Res[f,i]=limz→i(z+i)(z−i)z−i=2i1
当 R→∞ 时,半圆弧的贡献趋于0(约当引理)。
I=2πi⋅2i1=π
因此 ∫−∞∞1+x2dx=π(验证:arctan(x)−∞∞=π)
例2:I=∫0∞x2+a2cosxdx(a>0)
f(z)=z2+a2eiz=(z+ia)(z−ia)eiz
上半平面的极点:z=ia
Res[f,ia]=2iaei(ia)=2iae−a
∫−∞∞x2+a2eixdx=2πi⋅2iae−a=aπe−a
只取实部:
I=∫0∞x2+a2cosxdx=2aπe−a
例3:∫02π2+cosθdθ
令 z=eiθ,dz=izdθ,cosθ=(z+z−1)/2:
∫02π2+cosθdθ=∮∣z∣=12+(z+z−1)/2dz/iz=∮i(z2+4z+1)2dz
极点:z=−2±3。位于单位圆内部的是:z1=−2+3
=2πi⋅i⋅2(z1−z2)2=32π
布罗姆维奇积分(Bromwich Integral):
f(t)=2πi1∫σ−i∞σ+i∞F(s)estds
这是 s 平面上沿一条竖直线的路径积分,若用一个包含左侧所有极点的半圆把路径闭合起来,就可以应用留数定理:
f(t)=∑kRes[F(s)est,sk]
示例:F(s)=1/(s2+ω2) 的拉普拉斯逆变换
极点:s=±iω
Res[s2+ω2est,iω]=2iωeiωt
Res[s2+ω2est,−iω]=−2iωe−iωt
f(t)=2iωeiωt−e−iωt=ωsinωt
验证:L{sinωt/ω}=1/(s2+ω2) ✓
离散时间信号 x[n] 的Z变换:
X(z)=Z{x[n]}=∑n=−∞∞x[n]z−n
z=rejΩ 是复变量。收敛条件:∑∣x[n]∣∣z∣−n<∞
收敛域(ROC, Region of Convergence):
- 单边因果信号:∣z∣>rmax(极点之外)
- 单边反因果信号:∣z∣<rmin(极点之内)
- 双边信号:环形区域 r1<∣z∣<r2
单位脉冲:
x[n]=δ[n]⇒X(z)=1,对所有 z
单位阶跃:
x[n]=u[n]⇒X(z)=z−1z=1−z−11,∣z∣>1
指数信号:
x[n]=anu[n]⇒X(z)=z−az=1−az−11,∣z∣>∣a∣
正弦信号:
x[n]=cosΩ0n⋅u[n]⇒X(z)=z2−2zcosΩ0+1z(z−cosΩ0),∣z∣>1
x[n]=sinΩ0n⋅u[n]⇒X(z)=z2−2zcosΩ0+1zsinΩ0,∣z∣>1
单位斜坡:
x[n]=nu[n]⇒X(z)=(z−1)2z,∣z∣>1
线性性:
Z{ax[n]+by[n]}=aX(z)+bY(z)
时移:
Z{x[n−k]}=z−kX(z)
z−1 就是单位延迟算子。差分方程由此变为代数方程!
z缩放(频移):
Z{anx[n]}=X(z/a)
时间反转:
Z{x[−n]}=X(z−1)
卷积(Z变换的核心):
Z{x[n]∗h[n]}=X(z)H(z)
LTI系统分析的核心:卷积变成了乘法!
初值定理:
x[0]=limz→∞X(z)
终值定理:
limn→∞x[n]=limz→1(z−1)X(z)
部分分式法:
X(z)=A(z)B(z)=∑kz−pkAkz
pk 为极点,Ak=[(z−pk)X(z)/z]z=pk
示例:X(z)=(z−1)(z−0.5)z2
zX(z)=(z−1)(z−0.5)z=z−1A+z−0.5B
A=z−0.5zz=1=2,B=z−1zz=0.5=−1
X(z)=z−12z−z−0.5z
x[n]=2u[n]−(0.5)nu[n]=[2−(0.5)n]u[n]
幂级数展开法(长除法):
X(z)=x[0]+x[1]z−1+x[2]z−2+⋯
将 X(z) 展开为 z−1 的幂级数,即可直接读出 x[n]。
示例:y[n]−0.5y[n−1]=x[n],初始静止状态,x[n]=u[n]
应用Z变换(初始条件为0):
Y(z)−0.5z−1Y(z)=X(z)=z−1z
Y(z)(1−0.5z−1)=z−1z
Y(z)=1−0.5z−1z/(z−1)=(z−1)(z−0.5)z2
用部分分式做逆变换(与上例相同):
y[n]=2u[n]−(0.5)nu[n]=[2−(0.5)n]u[n]
当 n→∞ 时 y[∞]=2(用终值定理验证:(z−1)⋅z2/[(z−1)(z−0.5)]∣z=1=1/0.5=2)
传递函数 H(z):
LTI系统的输出与输入之比:
H(z)=X(z)Y(z)=1+a1z−1+⋯+aNz−Nb0+b1z−1+⋯+bMz−M
零点(zero):使 H(z)=0 的 z 值
极点(pole):使 H(z)=∞ 的 z 值
稳定性条件:所有极点都必须位于单位圆内部。
稳定⇔所有极点 pk:∣pk∣<1
FIR滤波器(有限脉冲响应):
H(z)=b0+b1z−1+⋯+bMz−M
极点只在原点,因此总是稳定。可以实现线性相位特性。
IIR滤波器(无限脉冲响应):
H(z)=A(z)B(z)
只要极点位于单位圆内部就稳定。用较少的系数即可实现陡峭的特性。
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
N_order = 4
Wn = 0.2
b, a = signal.butter(N_order, Wn, btype='low')
print("巴特沃斯LPF系数:")
print(f" b = {b}")
print(f" a = {a}")
w, h = signal.freqz(b, a, worN=2048)
zeros, poles, gain = signal.tf2zpk(b, a)
print(f"\n零点: {zeros}")
print(f"极点: {poles}")
print(f"增益: {gain:.4f}")
print(f"极点模: {np.abs(poles)}")
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
axes[0, 0].plot(w/np.pi, 20*np.log10(abs(h) + 1e-15), 'b-', linewidth=2)
axes[0, 0].axhline(y=-3, color='r', linestyle='--', label='-3dB')
axes[0, 0].set_xlabel('归一化频率 (x pi rad/samples)')
axes[0, 0].set_ylabel('幅度 (dB)')
axes[0, 0].set_title('巴特沃斯LPF频率响应(幅度)')
axes[0, 0].set_xlim([0, 1])
axes[0, 0].set_ylim([-80, 5])
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)
angles = np.unwrap(np.angle(h))
axes[0, 1].plot(w/np.pi, angles*180/np.pi, 'g-', linewidth=2)
axes[0, 1].set_xlabel('归一化频率 (x pi rad/samples)')
axes[0, 1].set_ylabel('相位 (度)')
axes[0, 1].set_title('巴特沃斯LPF相位响应')
axes[0, 1].set_xlim([0, 1])
axes[0, 1].grid(True, alpha=0.3)
unit_circle = np.exp(1j * np.linspace(0, 2*np.pi, 200))
axes[1, 0].plot(unit_circle.real, unit_circle.imag, 'k--', alpha=0.5)
axes[1, 0].scatter(zeros.real, zeros.imag, s=100, marker='o',
color='blue', zorder=5, label='零点')
axes[1, 0].scatter(poles.real, poles.imag, s=100, marker='x',
color='red', linewidths=2, zorder=5, label='极点')
axes[1, 0].axhline(0, color='gray', alpha=0.3)
axes[1, 0].axvline(0, color='gray', alpha=0.3)
axes[1, 0].set_xlabel('实部')
axes[1, 0].set_ylabel('虚部')
axes[1, 0].set_title('极-零点图 (z平面)')
axes[1, 0].legend()
axes[1, 0].grid(True, alpha=0.3)
axes[1, 0].set_aspect('equal')
imp = np.zeros(50)
imp[0] = 1.0
h_imp = signal.lfilter(b, a, imp)
axes[1, 1].stem(h_imp, markerfmt='bo', linefmt='b-', basefmt='k-')
axes[1, 1].set_xlabel('采样点 n')
axes[1, 1].set_ylabel('h[n]')
axes[1, 1].set_title('脉冲响应 (IIR 无限)')
axes[1, 1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('digital_filter_analysis.png', dpi=150)
plt.show()
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
N_fir = 50
Wn = 0.2
h_fir = signal.firwin(N_fir + 1, Wn, window='hamming')
b_iir, a_iir = signal.butter(6, Wn, btype='low')
w_fir, H_fir = signal.freqz(h_fir, [1], worN=2048)
w_iir, H_iir = signal.freqz(b_iir, a_iir, worN=2048)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
axes[0].plot(w_fir/np.pi, 20*np.log10(abs(H_fir)+1e-15),
'b-', linewidth=2, label=f'FIR (N={N_fir})')
axes[0].plot(w_iir/np.pi, 20*np.log10(abs(H_iir)+1e-15),
'r-', linewidth=2, label='IIR 巴特沃斯 6阶')
axes[0].set_xlabel('归一化频率')
axes[0].set_ylabel('幅度 (dB)')
axes[0].set_title('FIR vs IIR 频率响应')
axes[0].set_xlim([0, 1])
axes[0].set_ylim([-80, 5])
axes[0].legend()
axes[0].grid(True, alpha=0.3)
ph_fir = np.unwrap(np.angle(H_fir))
ph_iir = np.unwrap(np.angle(H_iir))
axes[1].plot(w_fir/np.pi, ph_fir*180/np.pi,
'b-', linewidth=2, label='FIR (线性相位)')
axes[1].plot(w_iir/np.pi, ph_iir*180/np.pi,
'r-', linewidth=2, label='IIR (非线性相位)')
axes[1].set_xlabel('归一化频率')
axes[1].set_ylabel('相位 (度)')
axes[1].set_title('FIR vs IIR 相位响应')
axes[1].set_xlim([0, 0.5])
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('fir_vs_iir.png', dpi=150)
plt.show()
print("系数个数比较:")
print(f" FIR: {len(h_fir)} 个系数")
print(f" IIR: b={len(b_iir)}, a={len(a_iir)} 系数合计 {len(b_iir)+len(a_iir)}")
z=esTs,s=Ts1lnz
对于 s=σ+jω:
z=eσTsejωTs=eσTs∠(ωTs)
| s平面特性 | z平面特性 |
| --------------------------------------- | ------------- | --- | ---- |
| jω 轴 (σ=0) | 单位圆 ∣z∣=1 |
| 左半平面 (σ<0) | 单位圆内部 ∣z∣<1 |
| 右半平面 (σ>0) | 单位圆外部 ∣z∣>1 |
| 直流 (s=0) | z=1 |
| 奈奎斯特频率 (ω=π/Ts) | z=−1 |
稳定性对应:
- 连续系统:所有极点在左半平面 → 离散系统:所有极点在单位圆内部
将模拟滤波器转换为数字滤波器的方法:
s=Ts2⋅z+1z−1
会产生频率翘曲(frequency warping):ωanalog=Ts2tan(2Ωdigital)
需要用预翘曲(pre-warping)修正后再设计。
from scipy import signal
import numpy as np
N = 4
Wn_analog = 2 * np.pi * 1000
z_a, p_a, k_a = signal.buttap(N)
b_analog, a_analog = signal.zpk2tf(z_a, p_a, k_a)
b_analog, a_analog = signal.lp2lp(b_analog, a_analog, Wn_analog)
fs = 8000
b_digital, a_digital = signal.bilinear(b_analog, a_analog, fs)
print("模拟滤波器极点:", np.roots(a_analog))
print("数字滤波器极点:", np.roots(a_digital))
print("数字极点模:", np.abs(np.roots(a_digital)))
连续系统传递函数:
G(s)=(s+p1)(s+p2)⋯K(s+z1)(s+z2)⋯
劳斯-赫尔维茨判据(Routh-Hurwitz Criterion):
利用特征多项式 ansn+an−1sn−1+⋯+a0 的劳斯阵列,判断右半平面极点的个数。
奈奎斯特判据:
根据 G(jω) 的奈奎斯特图对 (−1,0) 点的包围次数来判断稳定性。
数字控制器的传递函数 C(z):
PID数字实现(后向欧拉近似):
C(z)=Kp+Kiz−1Tsz+KdTszz−1
本文涉及的内容:
- 复数体系:直角坐标形式、极坐标形式、欧拉公式、棣莫弗公式、相量分析、阻抗
- 复变函数与解析函数:复数微分、柯西-黎曼方程、调和函数
- 复积分:路径积分、柯西定理、柯西公式
- 洛朗级数与留数定理:奇点分类、留数计算、实积分应用、拉普拉斯逆变换
- Z变换:定义、收敛域、主要变换对、求解差分方程
- 数字滤波器设计:FIR/IIR、极-零点图、稳定性、双线性变换
- s平面 vs z平面:稳定性条件对应关系
下一篇将讲解数值分析(Numerical Methods)。从方程求解、数值微分/积分、ODE数值解法、线性系统,到插值,全部用Python完整实现。
- Churchill, R. & Brown, J. "Complex Variables and Applications", 9th Edition
- Oppenheim, A. & Schafer, R. "Discrete-Time Signal Processing", 3rd Edition
- Proakis, J. & Manolakis, D. "Digital Signal Processing", 4th Edition
- Ogata, K. "Modern Control Engineering", 5th Edition
- SciPy 信号处理官方文档