ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

道尔夫-切比雪夫加权MATLAB实现:旁瓣抑制与主瓣展宽权衡

道尔夫-切比雪夫加权MATLAB实现:旁瓣抑制与主瓣展宽权衡

简介:面向阵列天线与阵列信号处理方向的学习者,这份资源提供基于 MATLAB 的线阵道尔夫—切比雪夫加权综合实现,用于解决在给定副瓣电平约束下求解各阵元激励幅度、并观察方向图变化的问题,适合已具备天线基础与 MATLAB 编程能力、需要动手验证加权效果的本科生、研究生及工程人员。压缩包共 3 个文件,以 2 个 m 脚本和 1 个 txt 说明为主:脚本分别完成切比雪夫激励幅度计算与加权后方向图仿真,说明文件交代使用方式,包体约 2KB,轻量易读。代码支持自行修改阵元个数、阵元间距、副瓣电平、波束指向角度与信号频率,通过切换代码块即可对比不同参数下激励分布与方向图主瓣宽度、副瓣高度的差异,关键步骤均附中文注释,便于逐行理解综合流程。目前已有 1003 人学习下载,可作为课堂实验、课程设计或自学阵列综合的参考脚本。

1. 旁瓣压到 -30 dB 之后主瓣胖了一圈:道尔夫-切比雪夫加权在做什么

用 MATLAB 给线阵天线做道尔夫-切比雪夫加权,第一次把 16 元阵的旁瓣从均匀加权的 -13.2 dB 硬压到 -30 dB 时,方向图确实漂亮了,可 -3 dB 波束宽度从 6.4° 涨到 9.1°,测角精度掉了一截。这不是代码写错了,而是这套加权方式的固有代价:在阵元数和阵元间距给定的前提下,它给出的是“等旁瓣电平约束下主瓣最窄”的那唯一一组电流分布。换句话说,报一个旁瓣指标,它就反算出唯一的激励系数,没有第二组解可以挑选。

这套 MATLAB 实现要落地的就是把这句话变成能跑的代码:输入阵元数、间距、目标旁瓣电平,输出加权系数、归一化方向图、实测旁瓣电平、-3 dB 波束宽度和零点位置。做阵列综合的、写雷达链路预算的、要给 DBF 通道加窗的,都能直接把系数拿去用。

2. 把旁瓣电平翻译成多项式系数:x0、阶数与主瓣展宽的三个公式

2.1 阵因子为什么能写成切比雪夫多项式

N 元等间距线阵,阵元位置取以阵列中心为原点,第 n 个阵元的坐标是 x_n = (n-(N-1)/2)d,n = 0,1,…,N-1。激励电流记作 I_n,阵因子就是各阵元贡献的相干叠加:

AF(θ) = Σ_{n=0}^{N-1} I_n · exp(j·k·x_n·sinθ)

把空间相位统一记成 ψ = kd·sinθ = 2π(d/λ)·sinθ,上式可以写成 AF = Σ I_n exp(j(n-(N-1)/2)ψ)。激励对称时 I_n = I_{N-1-n},配对之后只剩余弦项:

AF(ψ) = I_c + 2Σ_{r>0} I_r cos(rψ)

对奇数 N,r 取 0,1,…,(N-1)/2;对偶数 N,r 取 1/2,3/2,…,(N-1)/2,因为阵元落在半整数倍的位置上。

关键一步是变量替换 y = cos(ψ/2)。代入 cos(rψ) 并用倍角公式展开,AF 就变成 y 的 N-1 次多项式。道尔夫的做法是直接令这个多项式等于切比雪夫多项式 T_{N-1}(x0·y),其中 x0 是一个大于 1 的尺度因子。这样做的理由很实在:T_m(x) 在 |x|≤1 区间里所有极值都等于 ±1,等幅振荡;在 |x|>1 区间单调上升,正好对应主瓣。把 |y|≤1 映射到旁瓣区、|y|>1 映射到主瓣区,就得到了“所有旁瓣等高”的效果,这也是切比雪夫加权区别于汉明、汉宁这些窗函数的核心特征——后者旁瓣是递减的,第一旁瓣最高,越远越低。

从多项式系数反推电流分布,就是后面第 3 章脚本要做的事。这里先记住一点:整条链路里唯一自由的参数就是 x0,它由旁瓣电平决定,跟阵元数、间距都无关。

2.2 由旁瓣电平反解 x0 与主瓣展宽

主瓣峰值出现在 ψ=0,此时 y=cos(0)=1,T_{N-1}(x0) 就是主瓣电平;第一旁瓣峰值出现在 y=cos(ψ/2) 落到 ±1 的位置,T_{N-1}(±1)=±1。所以主瓣与旁瓣的电压比 R 满足:

T_{N-1}(x0) = R,R = 10^(SLL/20)

SLL 取正值,例如目标 -30 dB 就代 30。切比雪夫多项式在 x>1 时的显式表达是 T_m(x)=cosh(m·arccosh(x)),反解立刻得到:

x0 = cosh( arccosh(R) / (N-1) )

这个式子值得多看两眼。N 越大,分母越大,x0 越靠近 1,意味着同样的旁瓣指标下多项式“挤”得更紧,主瓣相对越窄——这就是大孔径带来的增益。反过来,N 固定时想把 SLL 从 -20 dB 压到 -40 dB,R 从 10 涨到 100,arccosh 只按对数增长,所以旁瓣指标的代价不是线性的,压得越深越吃力。

主瓣展宽没有闭式的简洁解,工程上一般数值测量。定性规律是:SLL 每降低 10 dB 左右,-3 dB 波束宽度大约增加 10%~20%,具体比例跟 N 有关。N 小的时候展宽更明显,因为阵元数少、边缘电流被迫拉得很高。

提示:SLL 不要低于 -13.26 dB 去调用,那个值附近切比雪夫解已经退化成均匀加权,再低没有意义,MATLAB 的 chebwin 会直接给警告。

2.3 阵元间距和扫描角把边界卡死

切比雪夫加权只管电流分布,管不了栅瓣。栅瓣的出现条件是 ψ 在可见空间内出现多个 2π 周期,即 d/λ ≥ 1/(1+|sinθ_max|)。不扫描时 θ_max=90°,要求 d ≤ λ/2;扫描到 60° 时,要求 d ≤ λ/1.866 ≈ 0.536λ,比半波长还宽松一点,但如果扫描到 90° 端射,d 必须小于 λ/2 才不出现栅瓣。

实际工程里 d 通常取 0.5λ,一是避开栅瓣,二是让互耦可控。d 一旦超过 0.5λ,方向图会在可见空间边缘冒出第二个大瓣,切比雪夫加权压不住它——加权只改变各阵元的幅度,不改变阵元间距决定的周期结构。

扫描带来的第二个变化是波束展宽。阵列在 sinθ 空间的波束宽度是固定的,换到 θ 空间要除以 cosθ0,所以扫到 60° 时波束宽度大约是正扫时的 2 倍。这一点在做测角精度预算时必须算进去,不能拿正扫的数字去套全扫描范围。

3. 在 MATLAB 里生成加权系数:chebwin 与自写递推两条路

3.1 直接用 chebwin:一行拿到系数,但先核对三件事

Signal Processing Toolbox 里的 chebwin 就是干这个的,签名是 w = chebwin(N, sll),N 是点数,sll 是旁瓣相对主瓣的衰减,单位 dB,必须传正数。

N = 16; % 阵元数 sll = 30; % 目标旁瓣 -30 dB,这里传正数 d_lambda = 0.5; % 阵元间距,波长归一化 w = chebwin(N, sll); % 返回 N×1 列向量,峰值在中心 w = w(:).'; % 统一转行向量,后面按行参与矩阵运算 w = w / sum(w); % 归一化:总激励为 1,方便级联链路预算 fprintf('系数长度 %d,最大值 %.4f,最小值 %.4f\n', ... numel(w), max(w), min(w)); fprintf('动态范围比 %.2f (%.2f dB)\n', ... max(w)/min(w), 20*log10(max(w)/min(w)));

这段代码的重点不在调用本身,而在归一化。chebwin 返回的是未归一化的窗,峰值在中点、取值约等于 1 的量级,但总和不是 1。如果后面要跟发射功率、通道增益一起算链路预算,统一归一化到 sum(w)=1 更省事;如果只是看方向图,归不归一化都行,因为画图前还会再除一次最大值。

三件事要在调用前核对:第一,sll 必须是正数,传 -30 会让内部算出 R<1,acosh 直接报错或返回复数;第二,N 为偶数时没有中心阵元,chebwin 给的是对称的两半,做相位中心对齐时要注意偏移 (N-1)/2 是半整数;第三,chebwin 是窗函数视角,它的“主瓣”定义和阵列方向图的主瓣不完全是一回事,两者数值上一致但概念要对齐,别拿窗函数的等效噪声带宽去套阵列增益。

3.2 自写递推脚本:从 T_m 的升幂系数到阵元电流

不想依赖工具箱,或者想搞清楚系数到底怎么来的,就自己写。思路分四步:先用三项递推 T_{k+1}=2xT_k-T_{k-1} 求出 T_{N-1}(x) 的升幂系数;再代入 x=x0·y,得到 y 的幂次系数;然后用 cos^k(a)=2^{-k}Σ C(k,j)cos((k-2j)a) 把 y^k 展成 cos(nψ/2) 的组合;最后按阵元到中心的距离 r 取对应阶数的系数,中心阵元取全值,对称阵元各取一半。

function w = cheb_weight(N, sll_dB) % CHEB_WEIGHT N 元等距线阵的道尔夫-切比雪夫加权系数 % N 阵元数,>= 2 % sll_dB 旁瓣电平,正数,例如 30 表示 -30 dB % 返回 1×N 行向量,按阵元 1..N 排列,和为 1 m = N - 1; % 多项式阶数 = 阵元数 - 1 R = 10^(sll_dB/20); % 主瓣/旁瓣电压比 x0 = cosh(acosh(R)/m); % 峰值映射点 % ---- 1) 三项递推求 T_m(x) 的升幂系数 ---- Tkm1 = 1; % T_0 = 1 Tk = [0; 1]; % T_1 = x,升幂排列 for k = 1:(m-1) Tkp1 = [0; 2*Tk] - [Tkm1; 0; 0]; % T_{k+1} = 2x*T_k - T_{k-1} Tkm1 = Tk; Tk = Tkp1; end cT = Tk; % 长度 m+1,cT(k+1) 是 x^k 的系数 % ---- 2) 代 x = x0*cos(psi/2),得到 cos(psi/2) 的幂次系数 ---- kk = (0:m).'; cY = cT .* (x0 .^ kk); % P(y) = sum cY(k+1)*y^k, y = cos(psi/2) % ---- 3) 把 cos^k(psi/2) 展成 cos(n*psi/2) 的线性组合 ---- cCos = zeros(1, m+1); % cCos(n+1) 对应 cos(n*psi/2) for k = 0:m coef = cY(k+1) / 2^k; for j = 0:k n = abs(k - 2*j); % 倍角公式里的阶数 cCos(n+1) = cCos(n+1) + coef * nchoosek(k, j); end end % ---- 4) 按阵元到中心的距离取系数,还原电流分布 ---- rlist = abs((0:N-1) - (N-1)/2); % 每个阵元到中心的距离,可为半整数 I = zeros(1, N); for n = 1:N A = cCos(round(2*rlist(n))+1); % cos(2r*psi/2) = cos(r*psi) if rlist(n) == 0 I(n) = A; % 中心阵元独占 else I(n) = A/2; % 左右对称阵元各分一半 end end w = I / sum(I); % 归一化到总激励为 1 end

逐步说明。第一步里 [Tkm1; 0; 0] 是在低位补两个零,让长度和 [0; 2*Tk] 对齐,这是升幂表示下做多项式加减最容易翻车的地方——补错位数不会报错,只会算出一个看似合理但完全错误的多项式,所以建议拿 N=4、SLL=30 手算一遍对照。第二步的 x0.^kk 在 N 较大时会比较大,但还在 double 的范围内。

第三步是整段代码的核心。cos^k(a) 的倍角展开用的是二项式系数,n=abs(k-2j) 会重复出现,所以用累加而不是赋值,这是“同阶合并”的关键,漏掉累加的后果是方向图完全不成形。2^k 的除法必须放在累加之前做,先累加后除会放大舍入误差。

第四步的 rlist 对奇数 N 是整数序列,对偶数 N 是半整数序列,用 round(2*r)+1 统一映射到 cCos 的下标,这样奇偶两种情况用同一套索引逻辑,不用分开写分支。中心阵元取全值、对称阵元取半值,是因为展开式里 cos(rψ) 的系数对应的是“一对阵元合起来的贡献”。

注意:这个递推实现的上限大约在 N=24 到 N=28。超过之后 T_m 的系数和 x0^k 会一起变得很大,正负抵消时 double 的 53 位有效位不够用,算出来的系数会出现明显偏差甚至变号。N 超过这个量级就老老实实用 chebwin。

3.3 归一化、动态范围与量化位宽

系数算出来之后别急着画图,先看两个数:总和与动态范围比。总和归一化到 1 是为了让 AF(0)=1,方向图 dB 曲线的 0 dB 点就是主瓣峰值,后面测量旁瓣时不用再折腾参考电平。

动态范围比 DRR = max(w)/min(w) 才是决定工程可实现性的指标。SLL=-30 dB、N=16 时,DRR 大约在 12~15 dB;SLL 压到 -40 dB,DRR 会跳到 20 dB 以上;-50 dB 时可能到 30 dB。这个数字直接对应功放的线性区要求:中心阵元激励是边缘阵元的几百倍,如果收发通道只有 30 dB 的线性动态范围,边缘通道的信噪比会被压得很惨。

做数字波束形成时还要多算一步量化。如果通道是 8 位 ADC,满量程对应最大激励,边缘阵元的量化台阶就是最大激励除以 256,再乘上 1/DRR。用下面的小脚本快速估一下:

bits = 8; % ADC 位宽 drr = max(w)/min(w); % 动态范围比 lsb = 1/(2^bits - 1); % 满量程归一化后的一个 LSB edge_level = min(w)*drr*lsb; % 边缘通道的量化台阶占比 fprintf('DRR %.1f dB,边缘通道量化台阶约为满量程的 %.4f%%\n', ... 20*log10(drr), 100*edge_level);

如果这个百分比小到跟噪声底差不多,说明旁瓣指标压得太狠、通道精度跟不上,实测算出来的旁瓣根本到不了仿真值。这时候要么降指标,要么换泰勒加权(等旁瓣但边缘电流上升更缓),要么给边缘通道单独加衰减器。

4. 方向图仿真与指标测量:从加权向量到 -3 dB 波束宽度

4.1 阵因子计算与角度采样密度

方向图计算本身只有三行,但采样密度是个容易被忽略的坑。主瓣很窄的时候,如果角度网格只取 0.1°,波束宽度误差可能到 5% 以上,旁瓣峰值会漏检——因为峰值点恰好落在两个采样点之间。

N = 16; d_lambda = 0.5; sll = 30; w = chebwin(N, sll).'; w = w / sum(w); theta = linspace(-90, 90, 18001); % 0.01° 网格,兼顾精度和速度 psi = 2*pi*d_lambda*sind(theta); % 空间相位 nvec = (0:N-1).'; AF = w * exp(1j*nvec*psi); % 1×M 复阵因子 AF = abs(AF); AF = AF / max(AF); % 归一化到主瓣峰值 1 AF_dB = 20*log10(max(AF, 1e-12)); % 加下限,避免 log10(0) 出 -Inf

exp(1jnvecpsi) 这一步生成的是 N×M 的矩阵,nvec 是列向量、psi 是行向量,MATLAB 的隐式扩展会自动做外积。这里用的参考相位在阵元 0 上,没有挪到阵列中心,所以 AF 是个复数,取 abs 之后相位因子 e^{j(N-1)ψ/2} 被消掉,结果不受影响。但如果后面要做和差波束或者单脉冲测角,相位必须保留,那时候就得把参考点移到中心,否则和差通道的相位关系会整体偏一个线性项。

18 万点的网格跑起来大概几十毫秒,N 再大也扛得住。如果做优化循环要反复调用,可以降到 9001 点(0.02°),精度损失在 0.1% 量级,速度翻倍。

4.2 四种加权同图对比:均匀、二项式、切比雪夫、泰勒

单看一条切比雪夫曲线没有参照系,把四种典型加权画在一张图上,差异一眼就能看出来。

% 四种加权系数 w_uni = ones(1, N) / N; % 均匀加权 w_bin = nchoosek(N-1, 0:N-1); w_bin = w_bin/sum(w_bin); % 二项式 w_cheb = chebwin(N, 30).'; w_cheb = w_cheb/sum(w_cheb); % 切比雪夫 -30 dB % 泰勒加权,nbar=4 控制近区旁瓣个数 if exist('taylorwin', 'file') w_tay = taylorwin(N, 4, -30).'; w_tay = w_tay/sum(w_tay); else w_tay = w_cheb; % 没装工具箱时退化处理,仅保证脚本能跑 end figure; hold on; grid on; plot(theta, 20*log10(abs(w_uni * exp(1j*nvec*psi)) + 1e-12), 'LineWidth', 1.1); plot(theta, 20*log10(abs(w_bin * exp(1j*nvec*psi)) + 1e-12), 'LineWidth', 1.1); plot(theta, 20*log10(abs(w_cheb * exp(1j*nvec*psi)) + 1e-12), 'LineWidth', 1.4); plot(theta, 20*log10(abs(w_tay * exp(1j*nvec*psi)) + 1e-12), 'LineWidth', 1.1); xlabel('角度 \theta (deg)'); ylabel('归一化幅度 (dB)'); ylim([-80 0]); legend('均匀','二项式','切比雪夫 -30dB','泰勒 -30dB','Location','south');

二项式系数用 nchoosek 一次生成,它是所有 N 元加权里主瓣最宽、旁瓣为零的那一个,常被拿来当“上界”参照。泰勒加权和切比雪夫的区别在于:切比雪夫所有旁瓣严格等高,泰勒让靠近主瓣的几个旁瓣保持等幅、远处旁瓣逐渐衰减,代价是主瓣略宽一点点,但边缘电流上升更缓,DRR 通常小 2~4 dB。工程上如果指标只要求“第一旁瓣低于 -30 dB”而对远区旁瓣没硬性要求,泰勒往往更划算。

四种加权的典型指标对照如下,N=16、d=0.5λ、正扫:

加权方式第一旁瓣 (dB)-3 dB 波束宽度系数 DRR (dB)特点
均匀-13.26.4°0增益最高,旁瓣最差
二项式无(单调下降)10.8°约 24无旁瓣但主瓣最宽
切比雪夫 -30 dB-30.09.1°约 13.5旁瓣严格等高
泰勒 -30 dB-30.08.6°约 11远区旁瓣递减

表里的数字跟 N 和 d 强相关,换参数要重新测,不能直接套。

4.3 指标自动测量:旁瓣、波束宽度与零点

肉眼看图不够,做参数扫描或者批量对比时必须自动测。三个指标各写一小段。

第一旁瓣用局部极大值找,排掉主瓣位置后取最大:

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进