多径信道下OFDM-DCSK误码率优化与Matlab实现

简介:本资源为Matlab实现多径信道下OFDM-DCSK调制的仿真程序,面向通信工程、电子信息、计算机及数学等专业的学生与教师,可用于课程设计、期末大作业或毕业设计,帮助理解OFDM与DCSK结合后的系统通信过程与性能表现。压缩包内共1个文件,为m脚本文件,整体约1KB,可直接在Matlab环境中运行,兼容2014、2019a及2024a等版本。程序采用参数化编程,子载波数量、OFDM符号长度、DCSK扩频因子等关键参数均可方便修改,代码注释清晰,便于新手快速上手并替换数据开展实验。目前已有333人学习下载,适合需要搭建多径信道仿真、分析OFDM-DCSK调制性能或完成相关课题的读者参考使用。

1. 多径信道下 OFDM-DCSK 到底难在哪:一次把误码率打下来的思路

多径信道下 OFDM-DCSK 调制的 Matlab 实现,是很多做水声通信、电力线载波和短距无线的人绕不开的一道坎。OFDM 负责把宽带频率选择性信道切成一片片平坦子载波,DCSK(差分混沌键控)负责把信息藏进混沌参考段与信息段的差分相关里,两者拼起来,理论上既能抗多径又能省掉信道估计。但真动手就会发现,多径时延一超过循环前缀,子载波间干扰和符号间干扰同时上来,误码率曲线直接躺平,这时候你调 FFT 点数、调混沌映射、调 CP 长度,全是玄学。

这篇笔记面向的是已经懂 OFDM 基本框图、也听说过混沌键控,但卡在“怎么把两者拼成一个能跑出 BER 曲线的 Matlab 工程”的从业者。我会按“信号怎么生成 → 多径怎么建模 → 接收端怎么解调 → 参数怎么扫 → 坑在哪”的顺序,把一套可复现的流程拆开。所有代码都是脚本级、可直接粘进 Matlab 跑的,不依赖任何工具箱里冷门的函数。你照着走一遍,至少能得到一条随信噪比下降的误码率曲线,而不是一条平线。

2. 从比特到混沌样点:OFDM-DCSK 发射端怎么搭

2.1 为什么选 DCSK 而不是普通差分调制

普通差分调制(比如 DQPSK)靠相邻符号的相位差携带信息,接收端不需要信道估计,但它在低信噪比下相位噪声敏感,而且扩频增益有限。DCSK 的思路不一样:它把每个信息比特拆成前后两段,前一段发一段混沌序列当参考,后一段发同一段混沌序列或者它的反相,接收端用延迟相关器把两段做相关,相关值的正负就是比特。这样做的代价是速率减半,好处是抗多径和抗窄带干扰的能力明显更强,因为混沌序列本身是宽带的,相关峰很尖。

在多径信道下,DCSK 的参考段和信息段会经历相同的信道响应,只要多径时延扩展小于参考段与信息段之间的保护间隔,相关器就能把信道的影响抵消掉。这也是为什么 OFDM-DCSK 要把 DCSK 放到每个子载波上,而不是直接在时域做。子载波上的符号周期被拉长,多径时延相对符号周期变小,差分相关更稳。

2.2 混沌序列生成:Logistic 映射的定点化处理

最常用的混沌序列来自 Logistic 映射:x(n+1) = r * x(n) * (1 - x(n)),r 取 4 时进入混沌态。但直接浮点迭代在长序列上会出现精度退化,Matlab 里 double 精度大概迭代几千点后就会落入周期窗口。我的做法是每生成一段就做一次归一化,并且把 r 稍微偏离 4,比如 3.99,避开周期窗口。

function seq = gen_logistic(len, x0, r) % 生成 Logistic 混沌序列,长度 len % x0 初值,建议 0.1~0.9 之间,避开 0.5 % r 控制参数,取 3.99 比 4 更稳 seq = zeros(1, len); x = x0; for n = 1:len x = r * x * (1 - x); % 每 500 点做一次扰动,防止落入周期窗口 if mod(n, 500) == 0 x = x + 1e-6 * randn(); x = min(max(x, 1e-9), 1 - 1e-9); end seq(n) = x; end % 去均值并归一化到单位功率 seq = seq - mean(seq); seq = seq / sqrt(mean(seq.^2)); end

这段代码里len是每个 DCSK 符号需要的混沌样点数,通常等于子载波上承载的样点数。x0不要取 0.5,因为 0.5 是不动点。r取 3.99 而不是 4,是为了在浮点精度下保持混沌性。最后的去均值和归一化很关键,DCSK 相关器对直流分量敏感,不去均值会导致相关值有偏。

2.3 子载波映射与 IFFT:把 DCSK 符号放到频域

OFDM-DCSK 的发射端有两种做法:一种是把 DCSK 符号直接放在时域,然后 OFDM 调制;另一种是把 DCSK 的参考段和信息段分别映射到相邻子载波上。我一般用后者,因为频域映射更容易控制子载波间隔和 CP 长度。具体流程是:每个信息比特生成一段混沌序列,复制成两份,一份作为参考,一份根据比特取正或取反,然后把这 2*N 个样点按子载波顺序排好,做 IFFT。

Nfft = 256; % FFT 点数 Ncp = 32; % 循环前缀长度 Nsub = 128; % 实际使用的子载波数 M = 2; % 每个 DCSK 符号占用的子载波块数(参考+信息) bits = randi([0 1], 1, 50); % 50 个信息比特 % 生成混沌序列,每个比特对应 Nsub/M 个样点 Lc = Nsub / M; tx_freq = zeros(1, Nfft); for k = 1:length(bits) ref = gen_logistic(Lc, 0.3 + 0.01*k, 3.99); if bits(k) == 1 info = ref; else info = -ref; end % 映射到子载波,这里简单按顺序放,实际可加交织 idx = (k-1)*M + 1; tx_freq(idx) = ref(1); tx_freq(idx+1) = info(1); % 剩余样点循环放入,保持功率 for m = 2:Lc tx_freq(idx) = tx_freq(idx) + ref(m); tx_freq(idx+1) = tx_freq(idx+1) + info(m); end end % 共轭对称,保证 IFFT 后是实数 tx_freq_full = [tx_freq(1:Nfft/2), conj(tx_freq(Nfft/2:-1:1))]; tx_time = ifft(tx_freq_full, Nfft); tx_cp = [tx_time(end-Ncp+1:end), tx_time];

这里Nfft取 256 是折中,太小频率分辨率不够,太大对多径时延敏感。Ncp取 32,对应 12.5% 的 CP 开销,一般要求 CP 长度大于信道最大时延扩展。Nsub取 128,留一半子载波做保护带。注意最后做了共轭对称,这样 IFFT 出来是实数,方便在基带仿真。如果你要做复数基带,可以省掉这一步,但后续相关器要改成复数相关。

3. 多径信道建模:从抽头延迟线到误码率曲线

3.1 多径信道怎么用 Matlab 表示才不翻车

多径信道最常用的模型是抽头延迟线:y(n) = sum(h_i * x(n - tau_i)) + w(n)。在 Matlab 里可以用filter或者手动卷积。但很多人翻车的地方是:信道抽头的功率归一化没做,导致接收信噪比和设定值对不上。我的习惯是先把抽头功率归一化到 1,再按目标 SNR 加高斯白噪声。

function [rx, ch] = multipath_channel(tx, snr_db, delays, gains) % tx: 发射信号 % snr_db: 目标信噪比 % delays: 各径时延(样点数) % gains: 各径复增益 % 归一化增益功率 gains = gains / sqrt(sum(abs(gains).^2)); ch = zeros(1, max(delays)+1); ch(delays+1) = gains; % 通过信道 rx_clean = filter(ch, 1, tx); % 按信号功率加噪声 sig_pow = mean(abs(rx_clean).^2); noise_pow = sig_pow / 10^(snr_db/10); noise = sqrt(noise_pow/2) * (randn(size(rx_clean)) + 1j*randn(size(rx_clean))); rx = rx_clean + noise; end

delays是各径相对首径的样点延迟,gains是复增益。归一化那一步是血泪经验:不归一化的话,你设 SNR=10dB,实际接收信噪比可能是 3dB 也可能是 20dB,曲线根本没法看。filter函数会自动处理延迟,但注意它输出长度是length(tx)+length(ch)-1,后续去 CP 时要对应截取。

3.2 接收端去 CP 与 FFT:别把相位转丢了

接收端先去 CP,再做 FFT,得到频域符号。这里容易踩的坑是:去 CP 的起始位置必须和发射端 CP 对齐,否则会引入额外的相位旋转。在多径下,首径到达时间不确定,通常用滑动相关或者能量检测做粗同步。仿真里我一般假设理想同步,直接按发射端的 CP 位置截取。

% 假设 rx 是接收信号,长度和 tx_cp 一致 rx_no_cp = rx(Ncp+1:Ncp+Nfft); rx_freq = fft(rx_no_cp, Nfft); % 取有效子载波 rx_sub = rx_freq(1:Nsub);

rx_freq是频域符号,rx_sub取前Nsub个,和发射端对应。注意这里没有做信道均衡,因为 DCSK 的差分相关会抵消信道影响。但前提是信道在参考段和信息段上保持一致,也就是信道变化要慢于 DCSK 符号周期。

3.3 差分相关解调:相关值正负就是比特

解调时,把每个比特对应的参考段和信息段分别取出,做相关:corr = sum(ref .* info)。如果 corr > 0,判为 1;否则判为 0。这里ref和info都是接收到的频域样点,经历了相同的信道响应,所以相关值里信道的影响被平方后抵消。

decoded = zeros(1, length(bits)); for k = 1:length(bits) idx = (k-1)*M + 1; ref_rx = rx_sub(idx); info_rx = rx_sub(idx+1); corr_val = real(ref_rx * conj(info_rx)); decoded(k) = corr_val > 0; end ber = sum(decoded ~= bits) / length(bits);

这里用了real(ref_rx * conj(info_rx)),因为频域样点是复数。如果你发射端做了共轭对称,接收端也可以只取实部。corr_val的符号就是判决依据。注意这里每个子载波只放了一个样点,实际中一个 DCSK 符号会占用多个子载波,相关要在多个子载波上累加,做法类似。

4. 参数扫描与性能验证:把 BER 曲线跑出来

4.1 信噪比扫描:从 -5dB 到 15dB 的循环怎么写

要得到 BER 曲线,需要在外层循环信噪比,内层循环蒙特卡洛次数。我的习惯是每个 SNR 点至少跑 1000 个比特,低 SNR 时跑 10000 个,否则误码率统计不准。

snr_list = -5:2:15; ber_list = zeros(size(snr_list)); for si = 1:length(snr_list) snr_db = snr_list(si); err_cnt = 0; total_bits = 0; for trial = 1:20 bits = randi([0 1], 1, 200); % 发射端生成 tx_cp % ...(省略重复代码,实际封装成函数) % 多径信道 delays = [0 3 7]; gains = [1 0.5*exp(1j*pi/3) 0.3*exp(-1j*pi/4)]; [rx, ~] = multipath_channel(tx_cp, snr_db, delays, gains); % 接收端解调 % ...(省略) err_cnt = err_cnt + sum(decoded ~= bits); total_bits = total_bits + length(bits); end ber_list(si) = err_cnt / total_bits; fprintf('SNR=%d dB, BER=%.4e\n', snr_db, ber_list(si)); end semilogy(snr_list, ber_list, 'o-'); grid on; xlabel('SNR (dB)'); ylabel('BER');

snr_list从 -5 到 15,步长 2,覆盖了 DCSK 的工作区间。trial循环 20 次,每次 200 比特,总共 4000 比特,低 SNR 下误码率在 1e-2 量级,统计误差可接受。如果你要测 1e-4 的误码率,比特数要加到 1e6 以上,跑起来会慢,可以用parfor加速。

4.2 关键参数对 BER 的影响:CP 长度和子载波数

CP 长度是 OFDM-DCSK 最敏感的参数。CP 太短,多径时延超过 CP,子载波间干扰上来,BER 曲线出现误码平台;CP 太长,频谱效率下降,但 BER 改善有限。我一般按信道最大时延扩展的 1.2 到 1.5 倍取 CP。子载波数Nsub影响扩频增益,Nsub越大,每个 DCSK 符号占用的子载波越多,相关增益越大,但符号周期变长,对信道时变更敏感。

参数典型值影响
Nfft256太小频率分辨率差,太大对时延敏感
Ncp32需大于最大时延扩展,否则误码平台
Nsub128越大扩频增益越高,但速率下降
混沌序列长度64越长相关峰越尖,但计算量增加

这张表是我在多次仿真后总结的折中值,具体场景要微调。比如水声信道时延扩展几十毫秒,CP 要相应加长,Nfft 也要加大到 1024 以上。

4.3 和理论 BER 的对比:什么时候仿真不可信

DCSK 在 AWGN 下的理论 BER 近似为 0.5 * exp(-Eb/(2*N0)),但在多径下没有闭式解。我一般把 AWGN 下的仿真曲线和理论曲线画在一起,如果偏差超过 1dB,说明混沌序列的自相关特性不好,或者相关器实现有问题。多径下就看有没有误码平台,如果有,优先查 CP 长度和同步。

5. 避坑与排查:OFDM-DCSK 仿真里最常见的 5 个翻车点

5.1 误码率曲线是一条平线,不随 SNR 下降

现象:SNR 从 -5 加到 15,BER 一直在 0.3 到 0.5 之间,像没加噪声一样。原因通常是混沌序列的自相关特性被破坏,比如序列太短、或者去均值没做,导致相关值被直流分量主导。解决:把混沌序列长度加到 128 以上,确认seq = seq - mean(seq)这行没被注释掉,并且检查相关器里用的是conj还是直接乘。

5.2 高 SNR 下 BER 反而上升

现象:SNR 超过 10dB 后,BER 从 1e-3 反弹到 1e-2。原因一般是信道抽头功率没归一化,或者噪声功率计算时用了发射信号功率而不是接收信号功率。解决:在multipath_channel里先算rx_clean的功率,再按这个功率加噪声,不要用tx的功率。另外检查gains有没有做sqrt(sum(abs(gains).^2))归一化。

5.3 去 CP 后 FFT 出现频谱泄漏

现象:接收星座图发散,解调误码率比预期高 3dB 以上。原因是去 CP 的起始位置偏了,或者 CP 长度小于信道时延。解决:在仿真里先做理想同步,把接收信号的 CP 起始位置和发射端对齐;如果做实际同步,用滑动相关找相关峰。CP 长度按最大时延扩展的 1.5 倍取。

5.4 蒙特卡洛次数不够,低 SNR 下 BER 抖动大

现象:同一个 SNR 点跑两次,BER 差一倍。原因是低 SNR 下误码率高,需要的样本数更多。解决:低 SNR 段每个点至少 1e4 比特,高 SNR 段可以降到 1e3。用fprintf打印每个点的误码数,如果误码数小于 10,说明统计不可信,要加次数。

5.5 混沌映射参数 r 取 4 导致序列周期化

现象:长序列的自相关出现多个峰,相关器判决出错。原因是 Logistic 映射在 r=4 时,浮点精度下迭代几千次后会落入周期窗口。解决:把 r 改成 3.99,并且每 500 点加一个微小扰动,或者换用 Tent 映射、Chebyshev 映射。我一般用 Logistic 加扰动,够用且简单。

6. 进阶技巧:用频域差分相关把计算量降一半

前面讲的解调是在频域取参考段和信息段做相关,每个比特要做一次复数乘加。如果子载波数多,计算量不小。一个实用的技巧是把差分相关放到时域做,利用混沌序列的时域自相关特性,把接收信号和延迟一个 DCSK 符号周期的信号做相关,这样一次相关就能解调所有比特。具体做法是:接收信号去 CP 后,取前Nfft/2个样点作为参考,后Nfft/2个作为信息,做点乘求和。

% 时域差分相关,假设一个 OFDM 符号内包含参考段和信息段 rx_no_cp = rx(Ncp+1:Ncp+Nfft); ref_t = rx_no_cp(1:Nfft/2); info_t = rx_no_cp(Nfft/2+1:Nfft); corr_t = sum(ref_t .* info_t); bit_est = corr_t > 0;

这个做法省掉了 FFT,但要求参考段和信息段在时域上严格对齐,且多径时延不能超过 CP。在时不变多径下,时域相关和频域相关等价,但时域少了一次 FFT,计算量降一半。代价是对同步误差更敏感,适合信道变化慢、同步做得好的场景。

另一个进阶方向是自适应 CP 长度:根据信道估计的时延扩展动态调整 CP,在时延小的时候用短 CP 提高速率,时延大的时候用长 CP 保误码率。实现上可以在接收端做信道估计,把最大时延反馈给发射端。这个在慢变信道里很有效,但在快变信道里反馈延迟会抵消收益。

我自己的习惯是:先把频域差分相关的版本跑通,得到一条可信的 BER 曲线,再换时域版本对比,确认两者在理想同步下差不超过 0.5dB,才敢用时域版本做实时仿真。这个对比步骤帮我抓过好几次同步偏移的 bug,省了后面调参的后悔药。希望帮到你。

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

相关新闻

AI文献综述工具实测:从选题到成稿效率提升3倍

AI文献综述工具实测:从选题到成稿效率提升3倍

先问一个问题:你上一次写文献综述,从选题到成稿用了多久?我见过太多博士在读的朋友,文献综述拖了两个月连初稿都没影;也见过写项目申请书的人,被十几页“国内外研究现状”卡到失眠。最近我把七款 AI 文献综…

2026/10/20 19:34:06 阅读更多 →
通用AI Agent难落地?外贸垂直场景的破局之道

通用AI Agent难落地?外贸垂直场景的破局之道

1. 通用AI Agent为什么卖不动:我看到的三个死结过去一年,我见过不少做AI Agent的朋友,从满怀希望到被迫转型,几乎走的是同一条路:先做一个"什么都能干"的通用助手,再花几个月把演示视频里的效果复…

2026/10/20 19:33:04 阅读更多 →
Python循环嵌套从入门到精通:执行顺序、缩进与break归属

Python循环嵌套从入门到精通:执行顺序、缩进与break归属

写 Python 代码不卡壳的,十个里有九个都倒在循环嵌套上。单个 for 循环谁都会写,闭着眼睛都能遍历一个列表;一旦变成两层甚至三层循环,脑子就开始转不过弯来:到底哪层先跑,哪层后跑,缩进一格两格…

2026/10/20 19:33:04 阅读更多 →

最新新闻

Linux挂载NTFS报独占错误?排查链路与解决方案全解析

Linux挂载NTFS报独占错误?排查链路与解决方案全解析

1. 这个报错到底在说什么如果你在 Linux 或 macOS 上挂载一块 Windows 格式(NTFS)的移动硬盘,突然蹦出这么一行字:Mount is denied because the NTFS volume is already exclusively opened. The volume may be already mounted, …

2026/10/20 23:42:34 阅读更多 →
彻底搞懂反弹Shell:原理、常见姿势、流量检测与防御加固

彻底搞懂反弹Shell:原理、常见姿势、流量检测与防御加固

干网络安全这一行的人,早晚都会碰到一个词:反弹Shell。不管你是刚入行的新人,还是已经打过不少授权攻防演练的老手,这个名字几乎会出现在每一次渗透测试、应急响应甚至红蓝对抗里。简单讲,反弹Shell是一种让目标机器主…

2026/10/20 23:42:34 阅读更多 →
DellEMC定制版ESXi 6.7镜像安装与硬件配置实战指南

DellEMC定制版ESXi 6.7镜像安装与硬件配置实战指南

简介:VMware ESXi 6.7.0 Update 3 的 Dell EMC 定制版安装包,面向使用 Dell 服务器的虚拟化运维与管理员,解决在 Dell 硬件上部署或升级裸机虚拟化平台时的驱动兼容与稳定性问题。包内共 157 个文件,以 154 个 VIB 驱动与组件包为…

2026/10/20 23:42:34 阅读更多 →
从CSV到MP4:动态图表视频制作全流程解析

从CSV到MP4:动态图表视频制作全流程解析

做数据可视化项目久了,你会慢慢发现一个规律:真正折磨人的从来不是画图那一下,而是数据本身。CSV 文件看着简单,三五列数据,几万行记录,一旦进入图表环节,各种问题就全冒出来了。缺失值、重复记…

2026/10/20 23:42:34 阅读更多 →
核电设备管理:为什么必须先EAM后ERP

核电设备管理:为什么必须先EAM后ERP

简介:本资源是一份深度剖析核电行业信息化演进路径的行业实践报告,面向电力系统信息化建设者、EAM/ERP实施顾问、能源行业IT管理者及高校能源管理专业师生。文档以大亚湾核电站为全球首个核电EAM落地案例切入,系统阐述其“先EAM后ERP”的渐进…

2026/10/20 23:42:34 阅读更多 →
AF_XDP 实战指南:Ubuntu 24.04 上基于 eBPF 的高性能包处理

AF_XDP 实战指南:Ubuntu 24.04 上基于 eBPF 的高性能包处理

1. 项目概述:AF_XDP 到底解决什么问题碰上 AF_XDP 这个技术点的人,多半是已经在 Linux 上做高性能包处理,或者被 DPDK 的运维成本折腾过之后,想在内核生态里找个折中方案。AF_XDP 不是一个框架,而是 Linux 内核提供的地…

2026/10/20 23:41:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →