窄带波束形成MATLAB仿真:常规波束形成与LMS自适应方向图验证
简介这份资源面向无线通信、雷达系统与阵列信号处理方向的学习者和工程师聚焦窄带波束形成的MATLAB仿真实现帮助读者理解从常规波束形成到自适应算法的完整技术脉络。压缩包共5个文件全部为m脚本体积约4KB分别对应常规波束形成、LMS与RLS自适应算法、LCMV约束最小方差以及Capon谱估计等典型方法覆盖预定义权值、动态权值调整与干扰抑制等核心环节。资源已有1414人学习下载说明其在教学与入门实践中具有一定参考价值。读者可借助这些脚本模拟多天线阵列、生成输入信号、计算并应用波束权值进而观察不同算法下的波束图案与旁瓣表现对比收敛速度与计算复杂度的差异。对于希望快速搭建实验平台、验证波束形成原理或改进现有策略的研究者而言这是一份便于上手且结构紧凑的实践素材。1. 窄带波束形成与常规波束形成从 MATLAB 仿真到方向图验证阵列信号处理里窄带波束形成是最先要啃下来的一块硬骨头。所谓窄带指的是信号带宽远小于载波频率各阵元接收到的同一信号只差一个相位包络基本不变——这个假设一旦成立后面所有的加权求和才有意义。常规波束形成CBF就是最朴素的实现给每个阵元乘一个相位补偿权值让期望方向的信号同相叠加其他方向相互抵消。听起来简单但真正动手写 MATLAB 的时候阵元间距怎么设、扫描角度怎么取、权值用共轭转置还是直接点乘每一步都有讲究。这份资源围绕窄带波束形成和常规波束形成的 MATLAB 实现展开适合正在做阵列信号处理课程设计、水声通信仿真或者雷达方向图验证的从业者。如果你手上有一组均匀线阵数据想快速跑出方向图、验证权值设计对不对接下来的内容能直接抄作业。2. 均匀线阵建模阵元间距、导向矢量与扫描角度的参数设定2.1 窄带假设下的信号模型怎么建窄带波束形成的核心假设是信号到达不同阵元的时间差只体现为载波相位的差异包络不变。数学上一个来自角度 θ 的远场窄带信号在第 m 个阵元上的接收可以写成 s(t)·exp(-j·2π·d·m·sinθ/λ)其中 d 是阵元间距λ 是波长。把所有阵元的相位因子排成一个列向量就是导向矢量 a(θ)。这个向量是后续所有波束形成操作的基石写错了后面全盘皆输。我一般会先确定三个参数阵元数 N、阵元间距 d、信号波长 λ。工程上 d 通常取半波长即 d λ/2目的是避免空间混叠——如果 d 大于半波长方向图会出现栅瓣把真实来波方向搞乱。扫描角度范围一般取 -90° 到 90°步长 0.1° 或 0.5° 看精度需求。下面这段代码把导向矢量矩阵建出来每一列对应一个扫描角度。% 均匀线阵导向矢量矩阵构建 N 16; % 阵元数 d 0.5; % 阵元间距单位波长 theta -90:0.1:90; % 扫描角度范围单位度 theta_rad deg2rad(theta); % 阵元位置索引从0到N-1 m (0:N-1).; % 导向矢量矩阵 A尺寸 N x length(theta) % 每一列对应一个角度的导向矢量 A exp(-1j * 2 * pi * d * m * sin(theta_rad));这段代码里m是列向量sin(theta_rad)是行向量两者相乘得到 N×L 的相位矩阵。注意指数上的负号——它对应的是阵列接收信号的相位延迟如果你在发射端做波束形成符号要反过来。d用波长归一化这样不用单独代入 λ 的具体数值换频率时只改 d 的物理值再归一化即可。theta的步长决定了方向图的分辨率0.1° 足够画出光滑曲线但如果你要做实时处理步长可以放到 1° 减少计算量。2.2 常规波束形成的权值计算与方向图合成常规波束形成的权值就是导向矢量的共轭。对于扫描角度 θ₀权值向量 w a(θ₀)/N除以 N 是为了归一化增益让主瓣峰值保持在 0 dB。把权值作用到导向矢量矩阵上得到的就是阵列响应B(θ) wᴴ·a(θ)。对所有扫描角度算一遍就得到方向图。% 常规波束形成扫描角度 theta0 处的权值 theta0 0; % 假设期望方向为0度 theta0_rad deg2rad(theta0); m (0:N-1).; % 期望方向的导向矢量 a0 exp(-1j * 2 * pi * d * m * sin(theta0_rad)); % 权值导向矢量共轭并归一化 w a0 / N; % 计算阵列响应 B w * A; % 1 x length(theta) 复数 B_db 20 * log10(abs(B) eps); % 转dB加eps防止log0 % 画方向图 figure; plot(theta, B_db, LineWidth, 1.5); xlabel(角度 (度)); ylabel(归一化幅度 (dB)); title(常规波束形成方向图); grid on; ylim([-40, 0]);这里w是共轭转置A是前面建的导向矢量矩阵。abs(B)取模得到幅度20*log10转成 dB。加eps是防止某些角度响应恰好为零时 log 报错。画出来的图主瓣在 0° 处峰值 0 dB第一副瓣大约 -13 dB——这是均匀加权线阵的固有特性想压低副瓣就得换窗函数比如切比雪夫窗或汉明窗那是后面进阶的事。提示如果你的方向图主瓣不在设定角度上先检查sin里的符号和m的起始值。阵元索引从 0 开始还是从 1 开始会影响相位参考点但不影响方向图形状只影响整体相位。2.3 阵元数、间距对方向图的影响怎么量化阵元数 N 决定主瓣宽度和增益。N 越大主瓣越窄阵列增益越高但计算量和硬件成本也上去了。阵元间距 d 影响栅瓣位置d λ/2 时无栅瓣d λ 时在 ±90° 附近出现栅瓣d λ 时栅瓣进入可见区。下面这张表把几个典型参数下的主瓣宽度和第一副瓣电平列出来方便选型时参考。阵元数 N阵元间距 d主瓣宽度-3dB第一副瓣电平80.5λ约 12.8°-13.2 dB160.5λ约 6.4°-13.2 dB320.5λ约 3.2°-13.2 dB161.0λ约 3.2°出现栅瓣主瓣宽度近似为 0.886·λ/(N·d) 弧度换算成度再除以 cosθ₀扫描到端射时会展宽。第一副瓣电平由加权方式决定均匀加权固定 -13.2 dB。如果你需要更低副瓣比如 -30 dB就得用切比雪夫加权代价是主瓣展宽。这些量化关系在写报告或做方案时直接引用比只贴一张图更有说服力。3. 从仿真到验证MATLAB 代码实现、LMS 自适应与常见翻车点3.1 完整可运行的窄带波束形成脚本把前面的片段串起来加上信号源和噪声就是一个完整的仿真脚本。我习惯把参数集中放在开头后面只引用变量名这样改参数不用满篇找。下面这个版本包含信号生成、阵列接收、波束形成和方向图绘制直接复制到 MATLAB 里就能跑。% 窄带波束形成完整仿真 clear; close all; clc; % 参数区 N 16; % 阵元数 d 0.5; % 阵元间距波长归一化 theta_s 20; % 信号来波方向度 theta_scan -90:0.1:90; % 扫描角度 SNR 10; % 信噪比 dB fs 1000; % 采样率 t (0:999)/fs; % 时间向量 f0 100; % 信号频率 % 信号生成 s exp(1j*2*pi*f0*t); % 窄带复指数信号 m (0:N-1).; a_s exp(-1j*2*pi*d*m*sind(theta_s)); % 信号方向导向矢量 X a_s * s; % N x T 阵列接收无噪声 % 加噪声 noise (randn(N, length(t)) 1j*randn(N, length(t))) / sqrt(2); noise noise * norm(X(:)) / norm(noise(:)) * 10^(-SNR/20); X X noise; % 常规波束形成 theta_rad deg2rad(theta_scan); A exp(-1j*2*pi*d*m*sind(theta_scan)); w exp(-1j*2*pi*d*m*sind(theta_s)) / N; % 指向信号方向 B w * A; B_db 20*log10(abs(B) eps); % 绘图 figure; plot(theta_scan, B_db, b, LineWidth, 1.5); hold on; xline(theta_s, r--, Signal Direction); xlabel(角度 (度)); ylabel(幅度 (dB)); title([常规波束形成方向图, N, num2str(N), , SNR, num2str(SNR), dB]); grid on; ylim([-50, 0]);这段脚本的关键点sind是直接输入角度制省去deg2rad噪声按信噪比缩放保证SNR参数真实有效w指向theta_s所以主瓣应该对准 20°。跑完你会看到主瓣在 20° 处副瓣在 -13 dB 左右。如果主瓣偏了检查theta_s和w里的角度是否一致。3.2 LMS 自适应波束形成怎么接进来常规波束形成的权值是固定的依赖来波方向已知。实际场景里方向可能估计不准或者有干扰。LMS最小均方自适应波束形成通过迭代更新权值让输出误差最小化不需要精确知道来波方向。核心迭代公式是 w(n1) w(n) μ·e*(n)·x(n)其中 μ 是步长e(n) 是期望信号与阵列输出的差。% LMS自适应波束形成 mu 0.001; % 步长 w_lms zeros(N, 1); % 初始权值 y zeros(1, length(t)); % 输出 e zeros(1, length(t)); % 误差 % 期望信号假设已知参考信号 d_ref d_ref s; % 这里直接用源信号作参考 for n 1:length(t) x_n X(:, n); % 当前快拍 y(n) w_lms * x_n; % 阵列输出 e(n) d_ref(n) - y(n); % 误差 w_lms w_lms mu * conj(e(n)) * x_n; % 权值更新 end % 用收敛后的权值画方向图 B_lms w_lms * A; B_lms_db 20*log10(abs(B_lms) eps); figure; plot(theta_scan, B_lms_db, r, LineWidth, 1.5); xlabel(角度 (度)); ylabel(幅度 (dB)); title(LMS自适应波束形成方向图); grid on; ylim([-50, 0]);步长mu的选取是 LMS 最玄学的地方太大收敛快但稳态误差大太小收敛慢但精度高。经验值是0 mu 1/(N·P_x)P_x 是输入信号功率。我一般先取 0.001 跑一遍看误差曲线是否单调下降如果震荡就减半。参考信号d_ref在实际中通常用训练序列仿真里直接用源信号。LMS 收敛后的方向图会在信号方向形成主瓣同时在干扰方向形成零陷——这是它比常规波束形成强的地方。3.3 避坑与排查方向图不对时先查这五条现象一方向图主瓣不在设定角度偏移了好几度。原因通常是sin和sind混用或者角度制转弧度时漏了deg2rad。MATLAB 的sin吃弧度sind吃角度混用必翻车。解决统一用sind/cosd或者在脚本开头把角度全部转弧度并注释清楚。现象二方向图出现多个大瓣分不清主副瓣。这是栅瓣原因是阵元间距 d 大于半波长。解决把 d 改回 0.5λ 以下或者用非均匀阵比如稀布阵打破周期性。如果必须用大间距扫描范围要限制在无栅瓣区间内。现象三LMS 误差曲线不收敛一直震荡。步长 mu 太大超过了稳定条件。解决按mu 1/(N·P_x)估算上限先取上限的十分之一跑稳定后再逐步加大。另外检查输入信号是否归一化量级太大也会导致发散。现象四方向图峰值不是 0 dB而是负数或正数。权值归一化没做对。常规波束形成里w a0/N除以 N 是为了峰值归一。如果你忘了除峰值会是 10*log10(N) dB。解决确认权值归一化因子或者画图前手动减掉最大值。现象五加噪声后方向图副瓣抬高主瓣变胖。这是正常的信噪比越低方向图越差。如果副瓣抬高到跟主瓣差不多说明 SNR 太低或者快拍数不够。解决提高 SNR、增加阵元数或增加快拍数做平均。单次快拍的方向图随机性很大通常要对多个快拍的自相关矩阵做平均再画图。注意仿真里用randn生成噪声每次结果略有不同。要复现完全一致的结果在脚本开头加rng(0)固定随机种子。4. 进阶技巧用自相关矩阵平均和窗函数压低副瓣4.1 多快拍自相关矩阵平均让方向图更稳单快拍方向图抖动大工程上更常用的是对多个快拍求自相关矩阵 R E[x·xᴴ]然后用 R 做波束形成。在 MATLAB 里用X * X / T估计 RT 是快拍数。基于 R 的常规波束形成权值不变但方向图用w * R * w计算输出功率画出来更平滑。% 多快拍自相关矩阵平均 T size(X, 2); R X * X / T; % N x N 自相关矩阵 % 基于R的波束形成输出功率 P_cbf zeros(1, length(theta_scan)); for k 1:length(theta_scan) a_k exp(-1j*2*pi*d*m*sind(theta_scan(k))); P_cbf(k) real(w * R * w); % 这里w仍指向theta_s end P_cbf_db 10*log10(P_cbf / max(P_cbf) eps); figure; plot(theta_scan, P_cbf_db, LineWidth, 1.5); xlabel(角度 (度)); ylabel(归一化功率 (dB)); title(基于自相关矩阵的波束形成); grid on; ylim([-50, 0]);注意这里用的是10*log10而不是20*log10因为 P 是功率量。real取实部是因为数值误差可能引入极小虚部。自相关矩阵平均后方向图副瓣更干净主瓣更稳定。快拍数 T 越大估计越准但计算量也越大。一般 T 取 100 到 1000 之间看信号变化快慢。4.2 切比雪夫窗加权把副瓣压到 -30 dB均匀加权的副瓣固定在 -13.2 dB很多场景不够用。切比雪夫窗可以在给定副瓣电平下让主瓣最窄。MATLAB 里用chebwin(N, atten)生成窗函数atten 是副瓣衰减 dB 数。把窗系数乘到权值上方向图副瓣就压下去了。% 切比雪夫加权 atten 30; % 副瓣衰减30dB win chebwin(N, atten); % 生成窗函数 w_cheb (a0 .* win) / N; % 加权权值 B_cheb w_cheb * A; B_cheb_db 20*log10(abs(B_cheb) eps); figure; plot(theta_scan, B_db, b--, theta_scan, B_cheb_db, r, LineWidth, 1.5); legend(均匀加权, 切比雪夫加权); xlabel(角度 (度)); ylabel(幅度 (dB)); title(窗函数加权对比); grid on; ylim([-60, 0]);跑出来你会看到切比雪夫加权的副瓣降到 -30 dB但主瓣比均匀加权宽了大约 1.5 倍。这就是副瓣与主瓣宽度的权衡没有免费午餐。atten参数可以调常见值 20、30、40 dB。注意chebwin返回的是列向量跟a0点乘时维度要匹配。如果 N 是奇数chebwin也能处理但中心阵元权值最大两边对称递减。4.3 验证方向图是否正确的三个硬指标写完代码别急着截图交差先过这三条验证第一主瓣峰值必须在 0 dB 附近偏差超过 0.5 dB 说明归一化有问题第二主瓣宽度跟理论值 0.886·λ/(N·d·cosθ₀) 对得上偏差超过 10% 检查扫描步长和角度定义第三副瓣电平跟加权方式匹配均匀加权 -13 dB切比雪夫按设定值。这三条过了方向图基本可信。我自己的习惯是每次改完参数先把theta_s设成 0°、30°、60° 各跑一遍看主瓣是否跟着移动、宽度是否随扫描角展宽。端射方向±90°附近主瓣会展得很宽这是正常物理现象不是代码 bug。从那以后我每次交报告前都强制走一遍这三条验证省得被导师问住。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

安全帽检测数据集实战:VOC转YOLO与YOLOv8训练避坑指南

安全帽检测数据集实战:VOC转YOLO与YOLOv8训练避坑指南

简介:安全帽检测数据集是一份面向工业安全监控场景的深度学习训练资源,适合研究人员、算法工程师及计算机视觉方向学习者用于目标检测模型的训练、验证与优化。压缩包内共2000个文件,以PNG图像和XML标注文件为主,整体大小约1.22GB…

2026/10/11 21:15:05 阅读更多 →
野生动物目标检测数据集实战:从解压到YOLOv8训练全流程

野生动物目标检测数据集实战:从解压到YOLOv8训练全流程

简介:这份野生动物目标检测数据集面向从事计算机视觉与生态监测的开发者、科研人员及学生,提供可直接用于YOLO系列等主流检测框架训练的标准数据。数据集共1768张图片,按训练集1240张、验证集355张、测试集173张划分,覆盖熊、骆驼…

2026/10/11 21:14:03 阅读更多 →
Relapse-Exploit 支持哪些 PS5 固件?7.00 到 13.60 全版本兼容性清单

Relapse-Exploit 支持哪些 PS5 固件?7.00 到 13.60 全版本兼容性清单

【免费下载链接】Relapse-Exploit Exploit chain for PS5 7.00 - 13.60 项目地址: https://gitcode.com/gh_mirrors/re/Relapse-Exploit 点击查看 免费下载 Relapse-Exploit 是一条面向 PS5 主机的开源浏览器利用链(Exploit Chain)&#xff…

2026/10/11 21:14:03 阅读更多 →

最新新闻

三菱ST编程数据类型终极对决:INT回绕与LREAL精度陷阱及防护

三菱ST编程数据类型终极对决:INT回绕与LREAL精度陷阱及防护

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:12:39 阅读更多 →
构建电源设计Agent的“三层权威”知识库架构

构建电源设计Agent的“三层权威”知识库架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:12:39 阅读更多 →
REA模型入门:资源-事件-代理三元建模原理与应用

REA模型入门:资源-事件-代理三元建模原理与应用

我无法根据当前输入生成符合要求的博文。原因如下:项目标题为单个字母组合“rea”,无明确语义指向,不属于任何可识别的技术术语、产品名、工具名、方法论或常见缩写(如REA在会计领域指Resource-Event-Agent模型,但该含…

2026/10/12 1:12:39 阅读更多 →
优质汽车零部件如何迁移至人形机器人量产

优质汽车零部件如何迁移至人形机器人量产

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:12:38 阅读更多 →
电源硬件设计自动化:三层权威知识库构建与实践

电源硬件设计自动化:三层权威知识库构建与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:12:38 阅读更多 →
基于Python的全球可持续发展绩效评估:SDRPI、SDGI与SDCI指数实战

基于Python的全球可持续发展绩效评估:SDRPI、SDGI与SDCI指数实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:11:38 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →