很多人在学习模拟电路时,都会被一句经典结论卡住:负反馈可以消除失真。第一反应通常是:输出端信号已经被放大了,失真是放大器“产生的”,输入端又不知道输出发生了什么,负反馈凭什么把失真消掉?更让人疑惑的是,负反馈明明降低了放大倍数,为什么反而说“改善”了性能?
这个直觉并不错,失真确实是放大器在放大过程中引入的,负反馈也不可能像滤网一样,把已经出现的毛刺从波形里筛掉。负反馈真正的做法,是把输出端带有失真的信号采样回来,与输入信号做减法,让放大器的输入端“提前”得到一个修正后的误差信号,从而压低失真在输出中的比例。
换句话说,负反馈的本质是用增益换线性。它有足够的开环增益去“浪费”,再用反馈环路把一部分增益换成了稳定性和纯度。这种交换到底是怎么发生的?本文不打算只讲公式,而是用一个可在仿真工具中复现的小实验,从波形和 THD 数据两个维度,把“负反馈消除失真”这件事彻底讲透。
读完本文,你会理解负反馈消除失真的数学模型、失真来源、仿真实验的搭建方法,也知道负反馈的边界在哪里——它不是万能的,有些干扰它不仅消不掉,甚至会让系统变得不稳定。
1. 为什么“负反馈消除失真”听起来像悖论
先看一个常见的认知冲突。
假设一个放大器开环增益是 100 倍,输入 0.5V 时输出 50V。由于放大器在大信号下出现非线性,输出波形出现了明显压缩,这就是失真。现在接入负反馈,闭环增益降到了 10 倍,同样的输出幅度需要更大的输入信号。这个时候很多人会想:既然负反馈把放大倍数降低了,失真应该也“变小”了?这不叫消除,这叫退化。
问题的关键在这里:负反馈让放大倍数下降的同时,输出信号的失真比例也下降了,而且下降幅度与放大倍数下降并不完全等价。前者下降 10 倍时,非线性失真可能下降了 20 倍甚至 100 倍,这种相对改善是真实存在的。
再从反馈闭环的角度看。负反馈系统在输入端的比较器,并不是拿原始输入信号直接激励放大器,它用的是“输入信号与反馈信号的差值”。这个误差信号里面,已经携带了输出端失真的修正信息。
可以这样理解:
- 开环系统:输入 0.5V,输出 50V,失真 5V。这个失真只能由放大器自己“扛着”。
- 闭环系统:输出失真了,反馈网络把它采回来,在输入端和原始信号相减,等效于让放大器的输入信号里提前包含了一个“反向修正量”。放大后再输出,失真的残余量就被压低。
这个机制并不神秘,它依赖的是“误差检测 + 深度负反馈”的循环调整。要真正理解为什么它能压低失真,需要看一个非常简洁的数学模型。
2. 数学本质:失真为什么会被“除以 (1 + AF)”
负反馈消除失真的核心,在误差模型中体现得最清晰。
假设开环增益为 A,反馈系数为 F,输入信号为 Vin,放大器内部在输出端注入了一个失真量 D。这个 D 可以理解为非线性失真、电源纹波、末级晶体管饱和压降等一切在放大过程中引入的误差。那么闭环输出可以写成:
Vout = A × (Vin - F × Vout) + D把包含 Vout 的项合并:
Vout × (1 + A·F) = A × Vin + D于是:
Vout = [A / (1 + A·F)] × Vin + [1 / (1 + A·F)] × D这个式子非常重要,它给出了两个结论:
- 信号增益从 A 变成了 A / (1 + A·F),也就是闭环增益 Af。
- 失真量 D 同样被压缩,压缩倍数是 1 / (1 + A·F)。
这里有一个容易被忽略的细节:信号和失真被压缩的倍数是相同的。看起来信号也衰减了,增益也降低了,那负反馈到底改善了哪部分?
关键要看相对比例。如果只看增益,两者确实同步下降;但如果看输出端“失真占信号的比例”,失真被压缩的倍数和信号被压缩的倍数是一样的,两者似乎应该抵消。问题出在 D 的注入位置。
失真 D 是在放大过程中加入的误差,而信号 Vin 是经过输入端比较后进入放大器的。对信号而言,负反馈降低了增益,但对失真而言,放大器内部产生的误差并没有先经过“输入减法”环节,它直接被反馈环路检测并压缩。用更直观的话说:
- 信号走的是“输入 → 差值 → 放大 → 输出”的完整路径;
- 失真更像是“半路加入”的扰动;
- 反馈环路对半路加入的扰动,压制能力恰好是 1 + A·F。
当反馈很深,也就是 A·F 远大于 1 时,这个式子近似为:
Vout ≈ (1 / F) × Vin + (D / (A·F))信号增益由反馈网络 F 决定,失真被压到极小。这就是深度负反馈下,“增益只由反馈网络决定,失真几乎消失”的来源。
需要注意,这个输出端误差模型是理解负反馈的最经典近似。真实电路中的非线性失真分布在整个信号链路中,误差注入点不同,压缩效果会略有差别,但工程结论方向一致:环路增益越大,环路内部产生的失真被压制得越狠。
所以负反馈消除失真,并不是“消除”已经存在的波形错误,而是通过反馈比较把内部误差在放大过程中提前反向抵消,最终输出端的残余误差被压缩到原来的 1 / (1 + A·F)。
3. 失真从哪里来:非线性失真与频率失真
理解了负反馈的数学模型,还要知道失真到底是怎么产生的,否则实验电路设计无从下手。
放大器失真主要分两类。
第一类是非线性失真。晶体管、场效应管的转移特性天然是非线性的,小信号时可以近似看成线性,一旦信号幅度变大,工作点进入饱和区、截止区,输出波形就会被压缩、削平,于是产生谐波。典型表现是:
- 单管共射放大器在大信号下输出波形上下不对称;
- 推挽输出级在交越点附近产生交越失真;
- 运放输出摆幅接近电源轨时发生限幅削波。
这种失真在时域上表现为“波形形状不再是标准正弦”,在频域上表现为“输出频谱里出现了基频的整数倍谐波”。衡量它的常用指标就是 THD,总谐波失真。
第二类是线性失真,也叫频率失真。放大器的耦合电容、晶体管极间电容、分布电容,会让不同频率的信号获得不同增益,导致输出信号的高频分量、低频分量比例发生变化。方波经过放大器后变成圆头、斜顶,就是频率失真的典型表现。
负反馈对两类失真的影响不同:
- 对非线性失真,反馈把环路内部的误差量压缩了 1 + A·F 倍,谐波分量显著下降;
- 对频率失真,负反馈也能把幅频特性压平。以一个单极点系统为例,开环带宽为 BW,加入负反馈后闭环带宽扩展为 (1 + A·F) 倍。这就是“增益带宽积近似恒定”说法的来源。
所以负反馈不仅改善波形纯度,还改善通频带。对大多数放大器设计来说,这两点都是刚需。
4. 实验设计思路与仿真环境准备
下面进入实验环节。实验目标是做一组对比:同一个非线性放大器,在开环和闭环两种状态下,观察输出波形的失真差异,并用 THD 数值量化。
为了让实验聚焦“负反馈”这个变量,而不是被具体器件模型的参数干扰,这里使用行为级压控电压源构建一个非线性放大器模型。模型表达式为:
Vout = 10 × tanh(Vin / 0.1)这个式子的含义:
- 当 Vin 很小时,tanh(x) ≈ x,放大器近似线性,小信号增益为 10 / 0.1 = 100 倍;
- 当 Vin 增大时,tanh 曲线逐渐饱和,输出被压缩到 ±10V 附近;
- 这模拟了真实放大器大信号时的增益压缩效应,和晶体管输出特性往饱和区走的过程很接近。
反馈网络采用最简单的电阻分压:
- R1 = 9kΩ,接在输出和反馈采样点之间;
- R2 = 1kΩ,接在反馈采样点和地之间;
- 反馈系数 F = 1 / (9 + 1) = 0.1;
- 理想闭环增益约为 1 / F = 10 倍。
实验环境推荐使用 LTspice,免费且跨平台,直接支持文本形式的网表和 .four 失真分析指令。其他支持行为源的 SPICE 工具也完全可以,语法可能略有差异。
对比实验要保持输出基波幅度接近,否则没有意义。开环输入 0.06V 左右时输出约 6V,闭环则要增大输入到 0.6V 左右,让输出也达到 6V 附近。这样对比的就是“同样输出幅度下,谁更干净”。
5. 实验一:开环放大器的失真有多明显
先看开环电路。元件连接关系如下:
- 信号源 V1 正极接节点 in,负极接地;
- 行为源 B1 正极接节点 out,负极接地,输出电压按模型表达式计算;
- 负载电阻 Rload 接在 out 和地之间,取 10kΩ,模拟后级负载。
LTspice 网表如下:
* Open-loop nonlinear amplifier, input amplitude = 0.06V V1 in 0 SINE(0 0.06 1k) B1 out 0 V={10*tanh(v(in)/0.1)} Rload out 0 10k .tran 0 5m 0 10u .four 1k V(out) .backanno .end这段网表的说明:
SINE(0 0.06 1k)表示幅度 0.06V、频率 1kHz 的正弦信号;.tran 0 5m 0 10u表示仿真 5ms,最大步长 10μs;.four 1k V(out)表示对输出节点做 1kHz 基波的傅里叶分析,直接得到 THD。
在 LTspice 中新建文本文件,粘贴上述内容,保存为open_loop.cir,然后运行仿真。仿真结束后,在波形窗口添加 V(out) 节点波形,可以看到输出峰值约 5V 到 6V,但波形顶部和底部出现明显压缩,不再是对称正弦,而是呈现出“圆顶”特征。
打开 View 菜单下的 FFT 窗口,选择 V(out),把频率范围缩放到 0 到 10kHz,可以看到清晰的频谱:1kHz 处是基波,2kHz、3kHz、4kHz 处都出现了幅度不小的谐波峰。这些谐波就是非线性失真的证据。
查看 SPICE Error Log,里面会列出 .four 指令的分析结果,包含各次谐波幅度和 THD。根据输入幅度和模型参数,这个电路的 THD 通常会在百分之几到十几之间,是一个肉眼可见、数据可查的失真状态。
这一步是最容易被忽略的地方。很多人在学习负反馈时,总喜欢把输入信号调到很小,让开环放大器工作在线性区,结果看到波形很漂亮,就认为失真不存在。真实系统里信号幅度稍大,非线性就出来了。所以实验第一步,一定要把输入幅度调到让输出波形明显变形,留给负反馈一个“可以改善的问题”。
6. 实验二:加入负反馈后的波形变化
现在在原有电路上加入反馈网络,并把输入幅度提高到 0.6V 左右。
元件连接如下:
- 信号源 V1 接输入节点 in;
- B1 仍然是输出节点 out,但模型变为
10*tanh((v(in)-v(fb))/0.1),即放大器的输入是“原始输入信号与反馈采样电压之差”; - R1 接在 out 与 fb 之间,9kΩ;
- R2 接在 fb 与地之间,1kΩ;
- 负载 Rload 接在 out 与地之间,10kΩ。
LTspice 网表如下:
* Closed-loop nonlinear amplifier with negative feedback V1 in 0 SINE(0 0.6 1k) R1 out fb 9k R2 fb 0 1k B1 out 0 V={10*tanh((v(in)-v(fb))/0.1)} Rload out 0 10k .tran 0 5m 0 10u .four 1k V(out) .backanno .end与开环电路相比,这个电路多了一个反馈采样节点 fb。B1 的表达式从v(in)/0.1变成了(v(in)-v(fb))/0.1,意思是:放大器输入端的有效电压不再是原始输入,而是“输入减去反馈量”。
当输出没有失真时,反馈电压只是输出的一部分,和输入相减后,驱动放大器的净输入会很小。由于净输入被压到了放大器的线性区,非线性误差就大幅减小了。
运行仿真,观察 V(out) 波形。输出幅度依然在 5V 到 6V 左右,但波形形状明显比开环时圆润,顶部和底部的压缩几乎消失,看起来更接近标准正弦波。
打开 FFT 窗口和 SPICE Error Log,查看 THD 数值,会比开环状态下降一个数量级以上,从“明显的失真”变成“轻微失真”。
这里有一个很容易混淆的点:为什么闭环输入从 0.06V 提高到了 0.6V,输出看起来还是和开环差不多的 6V?因为闭环增益已经降到了约 10 倍,而不是开环的 100 倍。这不是负反馈“坏处”,恰恰是负反馈的代价——它牺牲了约 10 倍的增益,换来了 THD 的大幅下降。
输出幅度相同、失真更低,这就是“用增益换线性”的直观体现。
7. 量化验证:用 THD 与频谱对比失真改善
波形只能定性看,工程上量化失真最常用的是 THD,总谐波失真。THD 定义为各次谐波有效值的平方和,再开根号,除以基波有效值,通常用百分比表示:
THD = sqrt(V2² + V3² + V4² + ... + Vn²) / V1 × 100%其中 V1 是基波幅度,V2、V3、V4 等是二次、三次、四次谐波幅度。
LTspice 里加一句.four 1k V(out)就能直接得到 THD 和各次谐波幅度。如果想自己计算,或者把结果导出到 Python 中做可视化对比,也可以用下面这段脚本。
import numpy as np import pandas as pd import matplotlib.pyplot as plt def load_ltspice_csv(path): """读取 LTspice 导出的 CSV,默认第一列是时间,第二列是信号""" df = pd.read_csv(path, comment="#") time = df.iloc[:, 0].to_numpy() signal = df.iloc[:, 1].to_numpy() return time, signal def thd_from_signal(time, signal, f0=1000.0, harmonic_count=5): """计算基波 f0 附近的总谐波失真 THD""" dt = np.median(np.diff(time)) fs = 1.0 / dt # 重采样到均匀时间网格,避免 SPICE 变步长数据造成频谱泄漏 t = np.arange(time[0], time[-1], dt) v = np.interp(t, time, signal) # 去直流,加汉宁窗 v = v - np.mean(v) n = len(v) win = np.hanning(n) spectrum = np.fft.rfft(v * win) freqs = np.fft.rfftfreq(n, d=dt) def peak_amp_around(freq): """在目标频率附近找最大谱线幅度""" lo = np.searchsorted(freqs, freq - 20.0) hi = np.searchsorted(freqs, freq + 20.0) idx = lo + np.argmax(np.abs(spectrum[lo:hi])) return np.abs(spectrum[idx]) * 2.0 / np.sum(win) fundamental = peak_amp_around(f0) harmonics_sq = 0.0 for k in range(2, harmonic_count + 1): harmonics_sq += peak_amp_around(k * f0) ** 2 thd = np.sqrt(harmonics_sq) / fundamental * 100.0 return thd, fundamental t_open, v_open = load_ltspice_csv("open_loop.csv") t_closed, v_closed = load_ltspice_csv("closed_loop.csv") thd_open, amp_open = thd_from_signal(t_open, v_open) thd_closed, amp_closed = thd_from_signal(t_closed, v_closed) print(f"Open-loop output amplitude: {amp_open:.3f}V, THD: {thd_open:.3f}%") print(f"Closed-loop output amplitude: {amp_closed:.3f}V, THD: {thd_closed:.3f}%")运行前,需要在 LTspice 中分别保存两段波形:仿真结束后,选中 V(out) 波形,File → Export data as text,导出为 CSV。开环数据保存为open_loop.csv,闭环数据保存为closed_loop.csv。
脚本会分别计算两种状态下的输出基波幅度和 THD,并打印出来。判断实验是否成功的标准有两个:
- 开环和闭环的输出基波幅度应该接近,说明对比的是“同一输出幅度下”的失真;
- 闭环 THD 应显著低于开环 THD,通常在数量级上拉开差距。
如果输出幅度差很多,说明输入信号没有调整到位,需要重新调整输入幅度,让两者输出幅度可比。
FFT 分析虽然直观,但也有坑,尤其是频谱泄漏。如果采样时间不是信号周期的整数倍,基波能量会泄漏到相邻频点,导致 THD 计算偏高。所以代码里用汉宁窗做抑制,同时强调:这套方法用于两种状态的相对对比足够,绝对精度不必和实验室仪器较劲。
8. 负反馈的边界、常见误区与排查思路
负反馈消除失真的实验做完了,但工程中很多关于负反馈的误区,比公式更容易让人踩坑。
先看负反馈能做到和做不到的事:
| 目标 | 负反馈能否实现 | 说明 |
|---|---|---|
| 抑制环路内部产生的非线性失真 | 能 | 失真的残余量约为原来的 1 / (1 + A·F) |
| 抑制输出端注入的电源纹波、末级扰动 | 能 | 这类误差也在反馈环路内 |
| 改善通频带内幅频特性平坦度 | 能 | 闭环带宽被扩展,增益相对平坦 |
| 降低输入端信号源本身的噪声 | 基本不能 | 输入端噪声与信号走同一条路径,改善有限 |
| 消除已生产生并叠加到输出端的脉冲干扰 | 不能即时消除 | 反馈需要时间反应,高频瞬态干扰效果有限 |
| 解决反馈环路不稳定带来的自激振荡 | 不能 | 反馈不当反而会产生自激 |
这张表格里最容易被误解的是“负反馈能降低噪声”。准确说法应该是:负反馈能抑制由放大电路内部产生、且在反馈环路内的噪声和失真;对于输入信号源本身带进来的噪声,负反馈几乎没有改善作用,甚至会因为要放大输入信号而把噪声一起放大。
再看三个高频误区:
误区一:反馈越深越好。从失真抑制公式看,A·F 越大越好,但环路增益过大时,放大器的附加相移会让反馈在某些频点变成正反馈,导致自激振荡。实际工程中,反馈深度要结合相位裕度来设计,而不是盲目加深。
误区二:负反馈能滤除已经削掉的波形。如果输出已经撞到电源轨,产生硬削波,反馈回路确实能把波形“拉回来”一些,但削波导致的频谱扩展和相位变化,并不会被完全清除。更稳妥的做法是把输入幅度控制在放大器线性区内,再用负反馈保证线性区的失真够低。
误区三:负反馈万能,加了之后系统就稳定。负反馈的作用对象是环路增益和误差,系统稳定性取决于环路增益的相位特性,不取决于有没有加反馈。
下面是实验中可能遇到的问题和排查思路:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 开环波形没有明显失真 | 输入幅度太小,放大器工作在线性区 | 查看输出幅度是否只有几百毫伏 | 增大输入幅度,直到输出接近 ±6V,观察波形压缩 |
| 闭环后失真改善不明显 | 反馈系数太小,或者输入幅度没有调到位 | 检查 R1/R2 比值,确认 F 是否为 0.1 | 增大 F,或把闭环输入调到输出 6V 再对比 |
.four指令报错或 THD 数值异常 | 输出波形未进入稳态,谐波分析窗口过短 | 延长仿真时间,或查看输出波形最后几个周期是否稳定 | 把 .tran 时长增加到 10ms 以上,或使用波形的稳定区间分析 |
仿真报tanh函数不支持 | LTspice 版本较老,或语法错误 | 检查 B1 表达式是否完整 | 将 tanh 改写为(exp(2*x)-1)/(exp(2*x)+1) |
| FFT 结果频谱泄漏严重 | 仿真时间不是信号周期的整数倍 | 检查仿真时长是否为 1k 信号周期的整数倍 | 使用 5ms、10ms 等整数倍时长,或加汉宁窗 |
| 闭环增益与 1/F 偏差较大 | 反馈网络对输出有负载效应,开环增益不足 | 断开反馈网络测等效负载,计算实际环路增益 | 增大开环增益,或者提高反馈电阻阻值 |
9. 负反馈设计的工程建议与总结
最后从工程实践角度,给出几点做负反馈设计时值得注意的建议。
第一,反馈网络要稳定。负反馈把闭环增益的稳定性交给了反馈系数 F,如果 F 本身受温度、电压影响而漂移,闭环增益也会跟着漂。电阻分压网络尽量用精度高、温漂低的电阻;如果对增益精度要求高,可以使用精密电阻或带修调的网络。
第二,留足开环增益余量。既然失真改善量取决于 1 + A·F,而闭环增益又被限制在 1/F 左右,那么 A 必须比最终的闭环增益高出一个数量级以上。设计时要先明确“需要多低的失真”,再反推开环增益需求,而不是随手接个反馈电阻。
第三,注意稳定性。深度负反馈是自激振荡的高发区,尤其当放大器本身有多个极点、高频相移明显增大的时候。设计完成后,建议做环路增益的相位裕度仿真,或者直接观察闭环输出的阶跃响应是否出现振铃。必要时增加相位补偿电容。
第四,区分输入端噪声和环路内噪声。负反馈无法有效抑制输入端的噪声,如果应用场景对噪声敏感,应该在信号链前端做滤波,而不是指望负反馈包治百病。
第五,验证时用 THD 和频谱说话。肉眼观察正弦波是否“圆润”只能算定性判断,工程验收要用 THD、IMD、频谱分量这些量化指标。这也是本文实验最后保留 Python 计算脚本的原因——把每一次调整都量化,才能形成可靠的技术积累。
负反馈是模拟电路里少有的“用一个简单结构,换取多项性能”的设计,但它的代价是增益和稳定性风险。学负反馈时,与其死记公式,不如亲手做一个开环失真、闭环改善的实验,在波形和频谱上亲眼看到失真被压下去的过程。这也是本文写这个小实验的初衷。
建议你打开仿真工具,把开环、闭环两个电路跑通,然后试着改一改反馈电阻的比值,看看 THD 和输出幅度是怎么随反馈深度变化的。这一步做完,你对负反馈的理解会比单纯刷题扎实得多。