想象你站在一场热闹的宴会上。朋友小明在正前方三米外讲一件趣事,而四周有三十几个人在碰杯、聊天、大笑。奇怪的是,你依然能听清小明说的每一个字。这背后靠的是两只耳朵:它们分布在头两侧,产生微小的到达时间差,大脑根据这个差“算”出小明的位置,然后像探照灯一样把听觉注意力射向他。今天我们要讲的波束成形(Beamforming),正是把这一整套本领教给机器——只不过把耳朵换成麦克风阵列,把大脑换成一段算法。一排麦克风就是一组“人造耳蜗”,算法则是“声音聚光灯”的控制台:让光柱对准目标说话人,把四周的嘈杂推到阴影里。这篇内容会从阵列怎么排、灯怎么拧,讲到会自己追光的自适应波束、会擦浮尘的后置滤波,再到用 AI 训练的深度波束成形,最后聊聊怎么把这盏聚光灯装进智能音箱。
学完这一步,你能读懂智能音箱远场拾音、会议降噪、机器人听觉背后的空间滤波原理,知道它们各自的适用边界和部署成本,做出更靠谱的技术选型。
目录
可视化演示
动态演示波束成形的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
波束成形:波束成形 波束成形概述 波束成形原理 核心机制可视化 波束成形整体架构与关键组件
1. 阵列空间采样:先排好灯珠
人只有两只耳朵,却硬是靠约 20 厘米的头部宽度,分辨出声源来自左边还是右边——因为两只耳朵收到的声音有时间差和音量差。若把两只耳朵换成一条直线上的 4 颗麦克风,这个“左右差”就有了 4 次重复采样,能分辨的方向也就更细。可以说,麦克风阵列就好比聚光灯的灯珠组:灯珠的数量和排列方式,决定了这盏“声学聚光灯”的基础性能。
阵列排布首先要解决的一个问题是:相邻灯珠距离 d 应该取多少?我们知道声音在空气里以约 343 m/s 的速度传播,频率越高波长越短。如果麦克风间距比波长的一半还大,就会出现“空间混叠”——一个方向传来的高频声音,会被阵列误认成另一个方向,就像栅栏格子太宽,飞鸟会从缝隙中“穿越”过来。因此在做远场语音时,通常要求相邻阵元间距 d ≤ λ_min/2,其中 λ_min 是最高关心频率对应的波长。
在满足混叠约束的前提下,可以用均匀线阵(ULA)来近似分析。N 个等间距全向麦克风排成一条线,其主瓣方向图的 3dB 宽度近似为:
所以,选麦克风阵列就像选择聚光灯的灯组:灯珠数量(N)、间距(d)和总长(孔径)决定这盏声学聚光灯能打多窄的光柱。排好了灯珠,接下来就该研究怎么让光柱“动起来”对准人。
- 波长含义声音在一个振动周期内传播的距离,频率越高波长越短。
- 麦克风个数N 是阵列中的麦克风数量,可以理解为聚光灯的灯珠颗数。
- 阵元间距d 是相邻两个麦克风中心之间的距离,它决定了对空间不同方向的采样密度。
- 合成孔径N 乘 d 就是整排麦克风的总长度,孔径越大,可分辨的角度越精细。
- 主瓣宽度0.89 倍的波长除以孔径,得到主瓣的 3dB 宽度,角度越小表示聚光灯越窄越准。
2. 固定波束成形:对齐波形再拧亮灯
回到宴会厅。你和小明面对面坐着,他说的每句话都像水面波纹一样扩散,先到达离他近的耳朵,再到达离他远的耳朵。如果小明在你正前方,两只耳朵听到的时间几乎一样;如果他偏右,你的右耳会先听到。而你的大脑其实在偷偷“等待”左耳的声音,把两边波形对齐后再一起加工——这就是最原始的延时求和。
延时求和波束成形(Delay-and-Sum Beamforming, DSB)做的正是这件事:每个麦克风根据目标方向计算一个补偿时延 τ_i,把声波到达阵列的时间差“抠掉”,再把所有麦克风的信号加起来取平均。来自这个方向的声波就被对齐、同相相加而增强;来自其他方向的声波没有对齐,加出来相互抵消、被削弱。
更一般的形式是滤波求和(Filter-and-Sum):每个通道不再只做纯时延,而是挂一个滤波器,可以在频域做更精细的幅度和相位调整。一个固定波束成形器在空间中呈现“主瓣 + 旁瓣”的方向图:主瓣对着目标方向,旁瓣则可能“漏光”,从旁瓣进来的噪声仍然会进来。指向性指数(DI)描述了主瓣相对旁瓣的整体增益,是评价固定波束的核心指标。
固定波束就像把聚光灯用手拧死在某个角度:简单、稳定、不耗电,也不会因为环境变化自己调整。但现实是宴会厅里噪声在变、人也在动,于是我们还需要更聪明的“自动追光”。
- 麦克风输入x_i(t) 表示第 i 个麦克风在时刻 t 采集到的声音波形。
- 时延补偿t 减去 τ_i,把每个麦克风的信号“等待”或“提前”,抵消声波传播到不同麦克风的时间差,τ_i 由入射角和阵元位置算出。
- 同相叠加求和符号把所有对齐后的波形逐点相加,目标方向的分量彼此增强。
- 归一化平均乘上 1/N,让输出信号的幅值尺度与单麦克风保持可比较,避免阵列越大输出越爆炸。
3. 自适应波束:会躲障碍的追光
继续宴会厅的故事。如果小明的右手边有一桌人突然大声碰杯,固定聚光灯虽然照着小明,但灯光边缘还是会扫到邻桌的躁动。这时理想的聚光灯会自动收紧边缘、避开躁动的方向——这就是自适应波束:根据麦克风实际收到的噪声信号,自动调整每个“灯珠”的亮度,也就是权重。
最小方差无失真响应(MVDR)是自适应波束的经典方案。它的核心思想是:在目标方向的增益保持恒定的前提下,最小化波束输出的总功率。输出功率越小,说明漏进来的噪声越少。数学上,这个最优化问题有闭式解:
自适应聚光灯虽然聪明,但“太敏感”:手一抖、方向偏半度,它就可能把主角的脸照黑。所以现实中很少单独使用 MVDR,而是让它和固定波束搭档——固定波束保证下限,自适应波束负责追光。
- 导向矢量a(θ_s) 是目标方向 θ_s 对应的相位模板,描述声波到达每个麦克风时的相对相位差。
- 噪声协方差R 是各麦克风接收噪声之间的相关矩阵,是“噪声地图”的数学表达。
- 白化处理对 R 求逆,相当于把噪声先“抹平”,让算法不再偏向某些方向。
- 归一化约束分母是一个标量,用来缩放权重,保证目标方向的增益严格为 1。
4. 后置滤波增强:灯下浮尘再擦净
即使聚光灯调得再准,灯光照到的地方总还有一点浮尘——波束输出里仍然残留着来自旁瓣和混响的噪声。后置滤波就像在灯前加一块滤光片:对每一束光,也就是每一个时频点,检查“这是主角的声音还是灰尘”,是灰尘就挡掉。
波束成形完成了空间维度的增强,把多通道信号合并成一路;后置滤波则在这路信号上做频域加权,本质上是一个随频率变化的增益 G(k,l)。最常用的是维纳滤波:
滤光片不是越厚越好,太厚会把主角的呼吸声也滤掉。后置滤波的目标是“擦掉浮尘,但不擦掉眼神”——在降噪和语音失真之间找到平衡点。
- 频率与帧索引k 表示第几个频率点,l 表示第几帧,合起来定位到“某个时刻的某个频段”。
- 先验信噪比ξ(k,l) 是目标语音功率与噪声功率之比,是决定增益的关键输入。
- 增益曲线ξ 取 0 时增益为 0,ξ 趋近无穷时增益趋近 1,整条曲线平滑地把噪声频点压低。
5. 广义旁瓣相消:双筒镜与减噪推子
前面提到自适应波束怕方向误差。工程上更常用的是一个更稳健的“双筒望远镜”方案:广义旁瓣相消(GSC)。它把复杂的最优化问题拆成两条路:一条主路用固定波束稳稳地照住小明;一条辅路专门去“听噪声”,最后把辅路听到的噪声从主路里减掉。
GSC 由三部分组成:上支路是固定波束输出,好比主镜头;中间的阻塞矩阵 B 好比挡板,把目标方向的声音挡住,只放行噪声;下支路是自适应滤波器,对阻塞后的噪声信号做匹配,估计主输出里残留的噪声。GSC 一个核心性质是:
GSC 就像一位有经验的音效师:主话筒交给固定波束保证清晰,另一只“监听耳机”专门捕捉噪声,然后精准减掉。为了防止误伤主角,音效师会在吵闹时才推动降噪推子,安静时把推子拉回。
- 阻塞矩阵B 是一个 M×(M-1) 的矩阵,相当于一组空间上的“隔音板”。
- 目标导向矢量a(θ_s) 是目标方向声波在各麦克风上的相位模板。
- 零空间条件矩阵乘法结果为零向量,表示目标信号被完全挡住,辅路输出里只剩下非目标方向的干扰。
6. 深度波束成形:请来 AI 调光师
前面所有方法都需要人手工设计“规则”:怎么排阵列、怎么设约束、怎么估计噪声。现在换个思路:请一位见过上万场宴会的调光师——深度神经网络。你不需要告诉它麦克风间距公式,只要给它大量“宴会现场 + 主角纯声”的样本,它就能自己学会什么时候该把灯打亮、避开谁。
深度波束成形(deep beamforming)把神经网络与传统波束成形结合。最流行的做法是:先用神经网络估计每个时频点的语音掩码 m_s(k,l) 和噪声掩码 m_n(k,l),然后用掩码做加权,估计语音协方差 R_s 与噪声协方差 R_n,再套用 MVDR 公式算出最优权重。神经网络的输出等于给传统波束成形提供一本“噪声地图”:
这位 AI 调光师虽然厉害,但也有“水土不服”:在它没见过的宴会厅(阵型或声场)里,效果可能不如老老实实的固定波束。所以现实系统常常是“老师傅 + AI 学徒”双保险:深度估计给传统波束提供更准的噪声地图,传统波束保证物理下限。
- 复数频谱x(k,l) 是第 k 个频率、第 l 帧的复数频谱向量,维度等于麦克风数。
- 噪声掩码m_n(k,l) 是神经网络输出的 0 到 1 之间的数,表示该时频点是噪声的概率。
- 空间协方差展开外积 x x^H 把单个频点的方向信息展开成矩阵。
- 掩码加权平均分子是掩码加权和,分母是掩码总和,两者相除得到平均意义上的纯噪声协方差。
7. 工程部署优化:把聚光灯装进手电筒
再好的聚光灯,最终要装进产品里——可能是智能音箱那指甲盖大的 DSP,也可能是会议室里一台低功耗 CPU。你在论文里跑通的波束成形,到了芯片上要面对三件事:来不来得及(延迟)、塞不塞得下(内存)、撑不撑得住(鲁棒性)。
流式处理时,波束成形通常按帧处理。帧长 N_frame 和采样率 f_s 共同决定算法延迟:
工程上还有更多权衡:MVDR 的矩阵求逆复杂度约 O(N³),N 是麦克风数,一般 4 到 8 个麦尚可承受,但掩码估计的深度神经网络可能吃掉大部分 CPU 预算。常用技巧包括用分块频域自适应算法降低复杂度、在静音段冻结自适应权值、用对角加载提升数值稳定性、把模型量化到 int8 后跑在 NPU 上。评测方面,PESQ 和 STOI 是两大客观指标,分别反映语音质量和可懂度;部署前还要做麦克风频响差异校准,避免“实验室满分、现场翻车”。
把声学聚光灯装进产品,就像把舞台灯光系统塞进露营手电筒:空间、电量、反应时间全都受限。理解这些部署约束,才不至于让精心设计的“光柱”最终只存在于 PPT 里。
- 帧长N_frame 是算法一次处理的采样点个数,例如 256 点。
- 采样率f_s 是每秒采样次数,例如 16000 Hz。
- 延迟公式两者相除得到一帧对应的物理时间,也就是最低算法延迟。
AI 应用场景
智能音箱远场唤醒
阶段:语音信号前端处理
解决的问题:单麦克风在 3 到 5 米的客厅里,电视声、空调声、厨房噪声会让唤醒率大幅下降。传统方案只是提高唤醒阈值,结果唤醒率和误唤醒率互相打架。用 4 麦环形阵列做固定波束扫描几个候选方向,再用后置滤波清掉残留噪声,最后把增强后的信号送入唤醒词检测网络。
具体案例:某智能音箱在 5 米距离、电视开着的客厅里实测,开启波束成形后唤醒率提升约 12 个百分点,误唤醒率下降一半。用户喊“小爱同学”时,音箱能准确看向用户方向,而不是被电视里的广告词带走。
会议室智能转写
阶段:实时语音转写的前端增强
解决的问题:会议场景的噪声往往不是白噪声,而是空调低频轰鸣、键盘敲击、翻纸声这些稳态干扰。波束成形负责空间滤波,但麦克风阵列对混响和旁瓣噪声的抑制有限,需要 GSC 或 MVDR 抑制稳态噪声,再用深度掩码修正协方差估计,提升转写准确率。
具体案例:八人会议桌上放一台阵列麦克风,说话人分布在 40 厘米到 3 米的不同方位。系统自动检测当前说话人方位,实时转向增强,转写准确率从 78% 提升到 88%,同时不再把键盘声识别成“语音”。
服务机器人听觉导航
阶段:机器人声源定位与指令增强
解决的问题:机器人在嘈杂展厅里需要定位“请帮我拿水”的说话人,同时忽略广播和旁人的对话。经典波束成形在强噪声下表现有限,深度波束成形通过学习大量真实声场数据,能更精准地区分目标语音与干扰。
具体案例:某导览机器人在商场展厅中使用 6 麦环形阵列加深度波束成形,指令识别率从 62% 提升到 85%,并且能在大约 10 度范围内锁定说话人方位,带动头部转向完成交互。
Python 演示
import numpy as np FS = 16000C = 343.0D_MIC = 0.04MICS = 4DUR = 2.0T = np.arange(int(FS * DUR)) / FSTARGET_ANGLE = 30.0NOISE_ANGLE = -45.0MIC_POS = np.arange(MICS) * D_MIC def propagate(source, angle_deg): """按远场平面波时延把声源加载到每个麦克风上""" specs = np.fft.rfft(source) freqs = np.fft.rfftfreq(len(source), 1.0 / FS) tau = MIC_POS * np.sin(np.deg2rad(angle_deg)) / C output = np.zeros((MICS, len(source))) for i in range(MICS): output[i] = np.fft.irfft(specs * np.exp(-1j * 2 * np.pi * freqs * tau[i]), len(source)) return output class DelaySumBeamformer: """延时求和波束成形器""" def __init__(self, mic_pos, sample_rate, speed=343.0): self.mic_pos = mic_pos self.sample_rate = sample_rate self.speed = speed def process(self, multichannel, angle_deg): n_mics, n_samples = multichannel.shape specs = np.fft.rfft(multichannel, axis=1) freqs = np.fft.rfftfreq(n_samples, 1.0 / self.sample_rate) tau = self.mic_pos * np.sin(np.deg2rad(angle_deg)) / self.speed weighted = np.zeros(specs.shape[1], dtype=complex) for i in range(n_mics): phase = 2 * np.pi * freqs * tau[i] weighted += specs[i] * np.exp(1j * phase) weighted = weighted / n_mics return np.fft.irfft(weighted, n_samples) def snr_db(signal, noise): return 10.0 * np.log10(np.mean(signal ** 2) / (np.mean(noise ** 2) + 1e-12)) def main(): rng = np.random.default_rng(42) target = 0.5 * np.sin(2 * np.pi * 1000 * T) + 0.2 * np.sin(2 * np.pi * 2000 * T) noise = 0.4 * np.sin(2 * np.pi * 300 * T) + 0.3 * rng.standard_normal(T.size) x_t = propagate(target, TARGET_ANGLE) x_n = propagate(noise, NOISE_ANGLE) x_mix = x_t + x_n bf = DelaySumBeamformer(MIC_POS, FS, C) y_t = bf.process(x_t, TARGET_ANGLE) y_n = bf.process(x_n, TARGET_ANGLE) y_mix = bf.process(x_mix, TARGET_ANGLE) print("Input SNR: %.1f dB" % snr_db(target, noise)) print("Output SNR: %.1f dB" % snr_db(y_t, y_n)) print("Array gain: %.1f dB" % (snr_db(y_t, y_n) - snr_db(target, noise))) if __name__ == "__main__": main()
specs = np.fft.rfft(source)把整段声音变换到频域,方便做精确的分数时延。tau = MIC_POS * np.sin(np.deg2rad(angle_deg)) / C根据入射角计算每个麦克风相对参考点的到达时延。output[i] = np.fft.irfft(specs * np.exp(-1j * 2 * np.pi * freqs * tau[i]), len(source))在频域乘相位旋转实现时延,模拟声音传播到各麦克风。class DelaySumBeamformer封装的“声音聚光灯”控制台,输入多通道信号和期望方向,输出增强后的单通道信号。phase = 2 * np.pi * freqs * tau[i]目标方向的相位差,用来把每路信号“拉齐”。weighted += specs[i] * np.exp(1j * phase)对齐后再叠加,目标方向的信号同相相加。weighted = weighted / n_mics取平均,保持能量尺度。print("Array gain: %.1f dB" % ...)打印阵列增益,直观看到聚光灯带来的信噪比提升。
常见误区
误区反正麦克风阵列就是为了多采几个声音,那我直接上 16 个麦克风,随便摆成一排,数量多了效果肯定比 4 个好。
正解阵列性能不只看数量,更看孔径、间距和目标频段是否匹配。间距太大,高频会空间混叠;间距太小,低频主瓣太宽。16 个麦只排成手掌长的一排,和 4 个麦拉开半米的效果完全不同。聚光灯不是灯珠越多越亮,灯珠排得太挤或太松都会让光斑不均匀。
为何常见:人们容易把“多通道”等同于“更多信息”,忽略了空间采样本身有物理约束,这是一个很直觉化的类比陷阱。
误区看了“鸡尾酒会效应”的科普后,以为波束成形能把宴会厅里每个人的声音都单独提取出来,想听谁就听谁,像网上的“声音放大镜”。
正解波束成形本质是空间滤波:增强一个方向、抑制其他方向。它对固定或慢变的噪声很有效,但如果两个人挨得很近,或者都在同一方向上,波束成形无法把他们分开。真正处理多人叠声需要盲源分离或说话人日志技术。
为何常见:科普视频常把“多人分离”与“定向增强”混为一谈,给初学者的预期抬得过高。
误区既然自适应波束能根据噪声自动调整,那固定波束就是淘汰技术,凡是产品一律用自适应波束就好。
正解自适应波束在导向矢量有误差或信噪比较低时,可能误把目标语音当噪声压掉,这叫“目标相消”。固定波束虽然笨,但它永远不会把主角照丢。工程上常用 GSC 结构或对角加载把两者结合,既保证稳健性,又获得自适应能力。
为何常见:“自动”两个字给人“更聪明”的直觉,但自动系统在误差面前可能比手动系统更脆弱。
误区神经网络那么强,我只要把多路音频灌进去,它自己就能学会波束成形,完全不用关心阵列排布。
正解深度模型确实可以隐式学习空间滤波,但它学的是训练数据里的“阵型 + 声场”。一旦麦克风数量、间距或设备外形变了,模型性能可能大幅下降。多数产品采用深度掩码估计 + 传统 MVDR 的组合,保留物理可解释性,只在数据充分时才能换成端到端模型。
为何常见:机器学习“端到端”的流行叙事让人忽略了模型对数据分布的高度依赖。
面试题
Q1. 麦克风阵列相比单麦克风的最核心优势是什么?
- A.能提高采样率上限
- B.能利用空间信息分离声源← 正确答案
- C.能消除所有混响
- D.能扩展声音频率范围
答案:B。麦克风阵列的核心优势是空间维度——通过多个麦克风的时延差,可以在空间上分辨声源方向,实现定向增强和噪声抑制。采样率上限由硬件决定,混响无法完全消除,频率范围主要取决于麦克风本身,所以 A、C、D 都不对。
Q2. 麦克风阵列阵元间距超过最高频率对应波长的一半时,主要会导致什么?
- A.d 小于半波长时最优
- B.d 大于半波长时最优
- C.出现空间混叠← 正确答案
- D.d 任意取值即可
答案:C。空间采样定理要求阵元间距不超过波长的一半,否则高频声波会出现方向歧义,即空间混叠,一个方向的声音被误判成另一个方向。选项 A、B、D 都是对间距的误解,只有 C 正确。
Q3. 延时求和波束成形中,来自非目标方向的信号经过时延补偿后叠加,通常会?
- A.同相叠加得到增强
- B.相位错乱相互抵消← 正确答案
- C.输出功率成倍增加
- D.与目标方向互不干扰
答案:B。延时求和的目标是让目标方向的信号对齐后同相相加,而非目标方向的信号因为相位没有对齐,叠加时互相抵消,能量被削弱。A 说的是目标方向的情况,C 和 D 描述都不准确。
Q4. 关于 MVDR 波束成形,下列说法正确的有哪些?
- A.目标方向保持无失真响应← 正确答案
- B.输出总功率被最小化← 正确答案
- C.对导向矢量误差不敏感
- D.需要估计噪声协方差矩阵← 正确答案
答案:ABD。MVDR 的核心约束是目标方向增益为 1,同时最小化输出总功率,因此 A、B 正确。它的权重公式中包含噪声协方差矩阵 R,所以 D 正确。MVDR 对导向矢量误差很敏感,微小偏差就可能导致目标相消,C 错误。
Q5. GSC 广义旁瓣相消中,阻塞矩阵的主要作用是什么?
- A.增强目标方向信号
- B.将目标方向信号置零← 正确答案
- C.降低系数矩阵维度
- D.估计信号响度特征
答案:B。阻塞矩阵 B 满足 B·a(θ_s)=0,它把目标方向的信号“挡住”,使辅路只保留噪声参考,供后面的自适应滤波器估计并抵消主路残留噪声。A、C、D 都不是阻塞矩阵的职责。
Q6. 关于维纳滤波后置增益 G=ξ/(1+ξ),下列说法正确的有哪些?
- A.ξ 是目标与噪声功率比← 正确答案
- B.ξ 越大增益越接近一← 正确答案
- C.ξ 越大增益越接近零
- D.ξ 是阵列麦克风个数
答案:AB。ξ 是先验信噪比,即目标功率与噪声功率的比值,A 正确。当 ξ 很大时,G 趋近于 1,保留语音;当 ξ 很小时,G 趋近于 0,压制噪声,所以 B 正确、C 错误。ξ 与麦克风个数无关,D 错误。
Q7. 深度波束成形中,神经网络的典型输入是什么?
- A.单通道增强音频
- B.多通道 STFT 频谱← 正确答案
- C.麦克风位置坐标
- D.目标说话人的照片
答案:B。深度波束成形模型通常接收多路麦克风信号的 STFT 幅度谱或复数谱,输出语音/噪声掩码,再估算空间协方差并生成波束权重。单通道音频丢失了空间信息,麦克风坐标虽是辅助信息但不是主输入,照片更与音频无关。
Q8. 16kHz 采样率下,帧长 512 点对应的算法延迟约为多少?
- A.8 毫秒
- B.16 毫秒
- C.32 毫秒← 正确答案
- D.64 毫秒
答案:C。延迟 = 帧长 / 采样率 = 512 / 16000 = 0.032 秒,即 32 毫秒。16 毫秒对应 256 点帧长,64 毫秒对应 1024 点帧长。
Q9. 缓解自适应波束“目标相消”的常用手段有哪些?
- A.对角加载正则化← 正确答案
- B.增大麦克风间距
- C.导向矢量校正← 正确答案
- D.增加滤波器阶数
答案:AC。对角加载相当于给协方差矩阵加一个小的对角项,提升数值稳定性和鲁棒性;导向矢量校正则直接修正方向误差,两者都能缓解目标被误压。增大麦克风间距会改变阵列几何,增加滤波器阶数只影响频率分辨率,都不能解决目标相消问题。
Q10. 关于 GSC 与 MVDR 的关系,下列说法正确的是?
- A.GSC 是 MVDR 的等价结构← 正确答案
- B.GSC 适用于单麦克风信号
- C.GSC 无法阻塞目标声
- D.MVDR 不能用于远场
答案:A。在无约束的理想条件下,GSC 是 MVDR 的等效实现,它把约束优化拆成固定波束支路和自适应对消支路。GSC 依赖多通道阵列,单麦克风无法构造阻塞矩阵;阻塞矩阵的核心性质正是阻塞目标声;MVDR 恰恰是远场波束成形的经典方法,因此 B、C、D 均错。