WINNER II信道模型MATLAB实战:从链路预算翻车到MIMO波束赋形验证
简介本资源面向无线通信仿真方向的研究生、工程师及科研人员提供WINNER II信道模型的MATLAB实现代码可视为3GPP SCM信道模型的增强版本适用于MIMO系统建模、链路级仿真与信道特性分析等场景。压缩包共47个文件约639KB以41个.m脚本为核心涵盖信道核心计算、天线阵列与极化响应、路径损耗、角度扩展、场景映射及参数配置等模块另含4个.p文件、1份PDF说明文档与1个txt版本记录便于理解代码结构与调用流程。目前已有1655人学习下载说明其在相关领域具备一定参考价值。读者可借助配套文档与示例脚本快速掌握WINNER II信道的参数设置、场景配置与信道矩阵生成方法并在此基础上开展二次开发与算法验证。1. 从一次链路预算翻车说起WINNER II 信道模型到底能干什么去年帮一个做室内覆盖的团队看仿真报告他们用自由空间路损加瑞利衰落跑出来的覆盖图和现场实测差了将近 12 dB。问题不在发射功率也不在天线增益而是信道模型选错了——自由空间加瑞利只适合窄带、低相关场景而他们测的是 2.6 GHz 宽带 MIMO多径时延扩展和空间相关性完全没建模。换成 WINNER II 之后误差压到了 3 dB 以内。这就是 WINNER II 信道模型存在的意义它不是教科书里那个理想化的瑞利或莱斯而是一套面向宽带 MIMO 系统的几何随机信道模型能同时刻画时延扩展、角度扩展、多普勒谱和极化覆盖从室内热点到城市宏站再到农村宏站的完整场景谱系。这套 MATLAB 代码包做的事情很具体给定场景类型、载波频率、带宽、天线阵列配置和移动速度它输出信道系数矩阵你可以直接拿去做链路级仿真、波束赋形验证、MIMO 容量计算或者接收机算法测试。适合谁用做 5G/6G 物理层仿真的研究生、做基站或终端天线评估的射频工程师、以及需要给系统级仿真喂真实信道数据的链路预算人员。如果你只用过rayleighchan或者comm.RicianChannel那这套代码会让你第一次感受到“空间相关性”这四个字在 MIMO 里到底意味着什么。2. WINNER II 的建模逻辑为什么它不是“又一个瑞利信道”2.1 几何随机模型的核心把多径当成“簇”来处理WINNER II 和传统统计信道模型最大的区别在于它不直接假设包络服从某个分布而是从几何出发先随机撒一批散射体再计算每条路径的时延、角度和复增益最后叠加成信道冲激响应。具体来说它把多径分成若干“簇”每个簇内部又有多条子径。簇的时延服从某种分布簇内子径的角度偏移服从另一组分布所有这些参数都由场景决定。这种建模方式带来的直接好处是时延扩展和角度扩展是“自然涌现”的而不是你手动指定的。比如在城市宏站场景下基站高、终端低散射体主要集中在终端周围所以到达角扩展大、离开角扩展小。你不需要告诉模型“离开角扩展是 5 度”它自己会算出来。这也是为什么 WINNER II 在 MIMO 波束赋形仿真里比rayleighchan靠谱得多——后者根本没有角度维度。常见做法是先确定场景A1 室内热点、B1 城市微站、C1 城市宏站、D1 农村宏站等然后查表拿到该场景下时延扩展、角度扩展、阴影衰落的标准差等大尺度参数再用这些参数驱动几何随机过程。代码包里通常有一个winner2_core或类似名字的函数输入一个配置结构体输出信道系数。2.2 场景参数表选错场景比调错参数更致命很多人拿到代码直接跑默认配置结果发现仿真结果和实测对不上回头查代码才发现默认场景是 A1 室内热点而自己做的明明是 C1 城市宏站。WINNER II 的场景分类不是随便分的每个场景对应一组固定的大尺度参数这些参数来自大量实测数据的统计拟合。下面这张表是几个常用场景的关键参数对比数值来自 WINNER II 最终报告的标准表格场景时延扩展均值 (ns)阴影衰落标准差 (dB)基站天线高度适用频段A1 室内热点353天花板2-6 GHzB1 城市微站854低于屋顶2-6 GHzC1 城市宏站1808高于屋顶2-6 GHzD1 农村宏站3008高于屋顶2-6 GHz这张表里最容易被忽略的是阴影衰落标准差。C1 和 D1 都是 8 dB但 D1 的时延扩展是 C1 的近两倍。如果你做的是农村覆盖用 C1 的参数会导致时延扩展偏小均衡器设计过于乐观实测误码率会打脸。我一般会建议场景选完之后把时延扩展和角度扩展的分布类型也确认一遍WINNER II 里不同场景用的分布不一样有的是对数正态有的是均匀代码里通常用randn或rand配合变换实现。2.3 从配置结构体到信道系数一次完整的调用链代码包的核心接口通常是一个配置结构体字段包括场景名、载波频率、带宽、发射天线数、接收天线数、天线间距、移动速度、仿真时长等。下面是一个典型的调用示例我把它拆成三段来看% 第一段构建配置结构体 cfg struct(); cfg.scenario C1; % 场景城市宏站 cfg.fc 2.6e9; % 载波频率 2.6 GHz cfg.bw 20e6; % 带宽 20 MHz cfg.Nt 4; % 发射天线数 cfg.Nr 4; % 接收天线数 cfg.dt 0.5; % 发射天线间距波长倍数 cfg.dr 0.5; % 接收天线间距 cfg.v 30; % 移动速度 km/h cfg.T 0.01; % 仿真时长 秒 cfg.fs 30.72e6; % 采样率这段配置里dt和dr用波长倍数表示0.5 表示半波长间距这是 MIMO 里最常见的配置。v是移动速度直接影响多普勒频移。fs是采样率通常要大于等于带宽这里 30.72 MHz 是 LTE 的典型采样率。配置结构体建好之后调用核心函数% 第二段生成信道系数 [H, delay, angle] winner2_core(cfg); % H 维度Nr x Nt x Npath x Ntime % delay每条路径的时延 % angle每条路径的离开角和到达角H是四维矩阵四个维度分别是接收天线、发射天线、路径数和时间采样点。这个维度顺序很关键后面做波束赋形的时候如果搞反了得到的波束图会完全不对。delay和angle可以用来验证模型是否合理比如 C1 场景下最大时延不应该超过几微秒到达角扩展应该在几十度量级。% 第三段验证信道统计特性 H_flat squeeze(H(:,:,1,:)); % 取第一条路径 R H_flat * H_flat / size(H_flat,3); % 接收相关矩阵 eig_val eig(R); disp([条件数, num2str(cond(R))]);这段验证代码做的是取第一条路径的信道系数计算接收相关矩阵然后看条件数。条件数过大说明空间相关性太强可能是天线间距设得太小或者场景参数不对。我一般会要求条件数在 10 以内超过 20 就要回头检查配置。3. 把代码跑起来从环境准备到第一个信道系数3.1 环境依赖与文件结构别急着改代码先看依赖这套代码包通常包含几个核心文件主函数、场景参数表、天线阵列生成函数、以及一些辅助工具。在 MATLAB 里跑之前先确认你的版本支持randn的种子控制因为 WINNER II 的几何随机过程依赖随机数不同 MATLAB 版本的随机数生成器默认算法可能不同会导致结果不可复现。我一般会在脚本开头加一行rng(42)固定种子。文件结构上常见做法是把所有.m文件放在同一个目录下然后在脚本里addpath进去。不要试图把函数文件改成脚本文件WINNER II 的代码里有很多嵌套函数和持久变量改结构容易出玄学问题。另外如果你用的是 MATLAB R2016b 之前的版本注意string类型和struct的字段名大小写敏感问题场景名C1和c1在代码里可能被当成两个不同的场景。提示跑之前先用which winner2_core确认函数在路径里如果返回空说明addpath没生效。3.2 最小可运行示例四发四收城市宏站下面这个脚本是我自己常用的最小验证模板直接复制就能跑。它做了一件完整的事配置 C1 场景、生成信道、计算容量、画图。% winner2_minimal.m clear; clc; rng(42); % 配置 cfg.scenario C1; cfg.fc 2.6e9; cfg.bw 20e6; cfg.Nt 4; cfg.Nr 4; cfg.dt 0.5; cfg.dr 0.5; cfg.v 30; cfg.T 0.01; cfg.fs 30.72e6; % 生成信道 [H, delay, angle] winner2_core(cfg); % 计算遍历容量 SNR_dB 0:2:20; C zeros(size(SNR_dB)); for k 1:length(SNR_dB) snr 10^(SNR_dB(k)/10); for t 1:size(H,4) Ht H(:,:,:,t); Hsum sum(Ht, 3); % 合并所有路径 C(k) C(k) log2(det(eye(cfg.Nr) ... snr/cfg.Nt * Hsum * Hsum)); end C(k) C(k) / size(H,4); end % 画图 figure; plot(SNR_dB, C, b-o, LineWidth, 1.5); xlabel(SNR (dB)); ylabel(容量 (bps/Hz)); title(C1 场景 4x4 MIMO 遍历容量); grid on;这段代码的逻辑说明H的第四维是时间采样每个采样点对应一个信道实现。sum(Ht, 3)是把所有路径的贡献合并得到等效的窄带信道矩阵。容量公式用的是标准的 MIMO 容量表达式det里的eye(cfg.Nr)是接收端噪声协方差归一化后的结果。参数SNR_dB从 0 到 20步长 2覆盖了典型的蜂窝通信工作区间。跑完之后你会看到一条单调上升的曲线20 dB 时容量大概在 15-20 bps/Hz 之间。如果曲线明显偏低检查cfg.Nt和cfg.Nr是否和H的维度匹配如果曲线抖动特别大说明时间采样点太少把cfg.T加大或者cfg.fs提高。3.3 参数怎么改频率、带宽、天线数的联动关系改参数不是随便填数字有几个联动关系必须遵守。第一cfg.fs必须大于等于cfg.bw否则时域采样会欠采样信道系数会出现混叠。第二cfg.dt和cfg.dr用波长倍数表示如果你知道实际天线间距比如 0.1 米要先换算dt d / (c / fc)其中c是光速。第三cfg.v影响多普勒频移最大多普勒频移fd v * fc / c如果fd接近fs/2会出现多普勒混叠这时候要么降低v要么提高fs。我一般会先算一遍fd确认它远小于fs/2再跑仿真。比如v30 km/h、fc2.6 GHzfd大约是 72 Hz而fs30.72 MHz完全没问题。但如果做高铁场景v300 km/hfd就到 720 Hz 了虽然还是远小于fs/2但多普勒谱的形状会变得很重要WINNER II 里有多普勒谱的配置选项默认是经典谱高铁场景可能需要改成平坦谱。4. 避坑与排查那些让仿真结果对不上实测的细节4.1 现象容量曲线在高 SNR 段饱和原因天线相关性没配对有人跑完 4x4 容量发现 20 dB 时只有 10 bps/Hz远低于理论值。查了半天代码没报错最后发现是cfg.dt和cfg.dr都设成了 0.1天线间距太小空间相关性接近 1信道矩阵接近秩 1容量自然上不去。解决方法是把间距改到 0.5 波长以上或者显式检查相关矩阵的条件数。我一般会在生成信道后加一行cond(Hsum * Hsum)条件数超过 100 就说明相关性太强。4.2 现象时延扩展明显偏小原因场景参数表被覆盖WINNER II 的场景参数表通常是一个独立的.mat文件或函数里面存着每个场景的时延扩展、角度扩展等。如果你在脚本里不小心定义了一个同名变量或者修改了参数表但没保存模型会用一个默认值。更隐蔽的情况是参数表里的时延扩展是“均值”而模型实际用的是对数正态分布如果你只看均值不看分布可能会觉得时延扩展“应该更大”。解决方法是打印delay的最大值和标准差和场景参数表对照。4.3 现象不同 MATLAB 版本结果不一致原因随机数生成器变了MATLAB R2017a 之后默认随机数生成器从twister变成了simdTwister虽然都是梅森旋转但种子相同的情况下产生的序列不同。如果你的代码依赖randn生成几何随机散射体换版本后结果会变。解决方法是显式指定生成器rng(42, twister)。这个坑我在两个不同版本的 MATLAB 上复现过血泪经验是任何依赖随机数的仿真脚本开头必须固定生成器和种子。4.4 现象多普勒谱形状不对原因移动方向没设对WINNER II 默认假设移动方向是随机的但如果你做的是定向覆盖场景比如沿公路的基站移动方向应该固定。代码里通常有一个cfg.mobility_direction或类似字段默认是random。改成fixed并指定角度后多普勒谱会从经典 U 型变成偏移的 U 型。这个参数在高速场景下影响很大低速场景下不明显容易被忽略。4.5 现象跑大规模 MIMO 时内存爆了原因H 矩阵维度没控制H是四维矩阵维度是Nr x Nt x Npath x Ntime。如果你做 64x64 大规模 MIMONpath有几十条Ntime有几千个采样点内存占用会到 GB 级别。解决方法是分块生成每次只生成一个时间窗的信道处理完再生成下一个。代码包里通常有winner2_core_chunk或类似的分块接口如果没有可以自己写循环每次改cfg.T和起始时间。5. 进阶用法用信道系数验证波束赋形算法5.1 从 H 矩阵提取空间协方差矩阵波束赋形的核心是空间协方差矩阵。对于 WINNER II 生成的信道你可以按路径分别计算协方差也可以合并所有路径。我一般会先看第一条路径的协方差因为第一条路径通常是直射或最强径对波束方向影响最大。下面这段代码演示了如何提取并可视化% 提取第一条路径的接收协方差 H1 squeeze(H(:,:,1,:)); % Nr x Nt x Ntime Rr zeros(cfg.Nr, cfg.Nr); for t 1:size(H1,3) h H1(:,:,t); Rr Rr h * h; end Rr Rr / size(H1,3); % 特征分解 [V, D] eig(Rr); [~, idx] sort(diag(D), descend); V V(:, idx); % 画波束图 theta -90:0.5:90; w V(:,1); % 主特征向量 pattern zeros(size(theta)); for k 1:length(theta) a exp(1j * pi * (0:cfg.Nr-1) * sind(theta(k))); pattern(k) abs(w * a)^2; end figure; plot(theta, 10*log10(pattern/max(pattern)), LineWidth, 1.5); xlabel(角度 (度)); ylabel(归一化增益 (dB)); title(基于 WINNER II 信道的主特征波束); grid on;这段代码的逻辑Rr是接收协方差矩阵eig分解后取最大特征值对应的特征向量作为波束权重。a是均匀线阵的导向矢量sind(theta)里的theta是角度。画出来的波束图应该有一个明显的主瓣指向散射体集中的方向。如果主瓣不明显或者出现多个等高的瓣说明信道相关性太低可能是天线间距太大或者散射体太分散。5.2 用多普勒谱验证移动性建模WINNER II 的多普勒谱可以通过对时间维做 FFT 得到。下面这段代码计算并画出多普勒谱用来验证移动速度设置是否正确% 多普勒谱分析 h squeeze(H(1,1,1,:)); % 取第一根天线的第一条路径 L length(h); Hf fftshift(fft(h .* hanning(L), 1024)); f linspace(-cfg.fs/2, cfg.fs/2, 1024); figure; plot(f, 20*log10(abs(Hf)/max(abs(Hf))), LineWidth, 1.2); xlabel(频率 (Hz)); ylabel(归一化功率 (dB)); title(多普勒谱); xlim([-200 200]); grid on;跑完之后你会看到一个 U 型谱两个峰分别在正负最大多普勒频移处。如果谱是平的说明多普勒建模没生效检查cfg.v是否为零或者移动方向设置有问题。如果峰的位置和fd v * fc / c对不上检查fc和v的单位v是 km/h 还是 m/s代码里通常有换算但不同版本的换算系数可能不一样。5.3 一个我常犯的错误忘了归一化WINNER II 生成的信道系数默认是归一化的总功率为 1。但如果你手动合并路径或者做波束赋形很容易破坏归一化导致 SNR 定义混乱。我一般会在生成信道后加一行H H / sqrt(mean(abs(H(:)).^2))强制归一化。这个习惯是从一次翻车经历来的当时做容量对比两个场景的容量差了 3 dB查了一天才发现是其中一个场景的信道功率没归一化。从那以后我每次生成信道都强制走一遍归一化检查mean(abs(H(:)).^2)必须在 1 附近偏差超过 0.1 就要查原因。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Pure Live 花椒 H5 底层 API 审计:公开接口取证、现网差异决策与验证闭环

Pure Live 花椒 H5 底层 API 审计:公开接口取证、现网差异决策与验证闭环

音视频直播移动开发 【免费下载链接】pure_live 纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。 项目地址: https://gitcode.com/gh_mirrors/pur/pure_live 点击查看 免费下载 花椒(huajiao.com&…

2026/10/13 19:57:53 阅读更多 →
IDEA编译报错排查指南:找不到符号与包的解决路径

IDEA编译报错排查指南:找不到符号与包的解决路径

简介:这份PDF资料聚焦IntelliJ IDEA开发中常见的「找不到符号」与「找不到包」报错,面向Java初学者及日常使用IDEA的开发者,帮助其快速定位并排除编译障碍。内容围绕编码格式、JDK版本、编辑器设置、缓存、jar包依赖等方向展开,逐…

2026/10/13 19:57:53 阅读更多 →
数据结构查找算法全解析:从顺序查找到B+树与哈希表的选型指南

数据结构查找算法全解析:从顺序查找到B+树与哈希表的选型指南

1. 查找为什么值得单独拎出来做一章很多人学数据结构,学到查找这一章会有点“轻敌”——前面链表、树、图都啃下来了,查找不就是在一个集合里找个数吗?我一开始也这么想,直到有次做日志分析,要从几千万条记录里按时间戳…

2026/10/13 19:57:53 阅读更多 →

最新新闻

微信小程序点餐系统开发与优化实践

微信小程序点餐系统开发与优化实践

1. 项目背景与核心价值在餐饮行业数字化转型的大趋势下,咖啡店这类高频消费场景对点餐效率的要求越来越高。传统纸质菜单人工点单的模式存在三个痛点:高峰期排队时间长、人工记录易出错、会员营销难触达。我们团队开发的这套微信小程序点餐系统&#xff…

2026/10/14 9:04:46 阅读更多 →
主机游戏PC化:AnyPS5兼容层架构与JIT翻译全解析

主机游戏PC化:AnyPS5兼容层架构与JIT翻译全解析

1. 先说清楚:AnyPS5 到底解决什么问题1.1 从一次游戏崩溃讲起大概两年前,我手里一台定制机型在跑某款第五世代家用主机移植游戏时,开场第十分钟直接黑屏崩溃。问题不在于硬件,而在于当时的图形适配层对主机架构的某些底层调用处理…

2026/10/14 9:04:46 阅读更多 →
实时事件分析系统搭建:从埋点SDK到Flink与ClickHouse的实战指南

实时事件分析系统搭建:从埋点SDK到Flink与ClickHouse的实战指南

我第一次看到“rea”这个代号时,就意识到这肯定不是一个随手敲出来的缩写。团队内部通常有个习惯:新项目先起小名,再谈架构,后来小名变成全线文档里的关键词。rea是某个内部项目的代号,全称后来补成了实时事件分析系统…

2026/10/14 9:04:46 阅读更多 →
WPF TreeView 连接线样式实战:纯 XAML 实现与避坑指南

WPF TreeView 连接线样式实战:纯 XAML 实现与避坑指南

简介:这份资源面向WPF桌面开发初学者与需要美化树形控件的开发者,针对原生TreeView缺少连接线、层级关系不够直观的问题,通过自定义Style与ControlTemplate为TreeViewItem添加Line元素,实现父子节点间的连接线效果。包内共39个文件…

2026/10/14 9:04:46 阅读更多 →
Node.js微信小程序全栈开发实战:智慧迎新系统

Node.js微信小程序全栈开发实战:智慧迎新系统

1. 项目概述与核心价值这个Node.js智慧迎新小程序项目是典型的计算机专业毕业设计选题,涵盖了前后端全栈开发的核心技术栈。从项目标题中"白嫖源码演示录像"这个关键词就能看出,它瞄准的是急需毕业设计参考素材的大学生群体。实际上&#xff0…

2026/10/14 9:04:46 阅读更多 →
计算机网络第三章实操指南:从PPP到CSMA/CD的协议本质解析

计算机网络第三章实操指南:从PPP到CSMA/CD的协议本质解析

1. 这不是“抄答案”,而是吃透《计算机网络》第三章的实操路径你搜到“《计算机网络》第三章课后答案第七版谢希仁”,大概率正卡在某个题上:可能是子网划分算到一半发现掩码对不上,可能是ARP请求和响应流程画了三遍还是漏掉一个字…

2026/10/14 9:03:46 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →