OFDM链路级仿真MATLAB实战:从帧结构到BER曲线
简介这份MATLAB OFDM链路级仿真程序面向无线通信初学者与工程研究人员用于在MATLAB环境中搭建并验证完整的OFDM收发链路。资源以m脚本为主体共12个文件压缩包约7KB涵盖主流程入口、OFDM调制解调、加窗与重叠处理、串并转换、比特映射及信道相关模块结构紧凑、便于逐文件阅读与二次修改。读者可据此理解IFFT/FFT实现、循环前缀与预编码、AWGN与瑞利衰落信道建模、同步偏差影响、功率分配以及QPSK/16QAM/64QAM调制解调等关键环节并通过调整信噪比、子载波数量等参数观察系统误码率与频谱效率变化。已有256人学习下载适合作为课程设计、毕业设计或科研入门的参考脚本帮助快速建立对OFDM系统各环节的直观认识与仿真排错思路。1. OFDM 链路级仿真从一份 MATLAB 压缩包说起很多人第一次接触 OFDM 链路级仿真是在课程设计或毕设开题阶段手里拿到一个MATLAB 关于ofdm的链路级仿真程序简单可用.zip解压后看到几个.m文件却不知道从哪一行读起。链路级仿真的核心目标很明确在比特级和符号级之间把发送端、信道、接收端这条链路完整跑一遍用误码率BER或误块率BLER衡量系统在不同信噪比下的表现。它不涉及网络层调度也不管多用户资源分配只关心一条链路的物理层能不能扛住噪声和衰落。适合谁通信工程本科生做课程设计、研究生跑算法对比基线、工程师验证某个均衡或同步模块的改动。这份压缩包的价值在于“简单可用”——代码量不大参数集中能让你在半小时内看到第一条 BER 曲线而不是陷在几万行的商用仿真器里找入口。2. OFDM 基带链路拆解从比特到波形的六个模块2.1 为什么链路级仿真要先固定帧结构OFDM 链路级仿真的第一步不是写代码而是定帧结构。帧结构决定了子载波数量、循环前缀长度、导频位置和符号数。常见做法是FFT 点数取 64、256、1024 或 2048循环前缀长度取 FFT 点数的 1/4 到 1/8。比如 FFT64CP16那么一个 OFDM 符号的有效时长是 64 个采样点加 CP 后变成 80 个采样点。导频一般按块状或梳状插入块状导频适合慢衰落梳状导频适合快衰落。帧结构一旦定下来后面所有模块的维度都跟着确定。我一般会在脚本开头用一个结构体param把所有参数集中管理避免后面改一个数要翻十个文件。param.fft_len 64; % FFT 点数 param.cp_len 16; % 循环前缀长度 param.num_sym 100; % 每帧 OFDM 符号数 param.mod_order 4; % QPSK 调制 param.num_subc 48; % 实际使用的子载波数 param.pilot_int 8; % 每 8 个子载波插一个导频 param.snr_db 0:2:20; % 信噪比扫描范围这段代码把帧结构参数集中定义。fft_len和cp_len决定符号时长num_sym决定一帧有多少个 OFDM 符号mod_order为 4 表示 QPSK为 16 表示 16QAM。num_subc小于fft_len是为了留保护带避免带外泄漏。pilot_int控制导频密度值越小导频越多信道估计越准但频谱效率越低。snr_db是外层循环的扫描点。2.2 发送端星座映射、IFFT 与 CP 添加发送端的顺序是随机比特生成 → 星座映射 → 子载波分配 → IFFT → 加 CP → 并串转换。星座映射把 0/1 比特映射成复数符号QPSK 时每两个比特映射一个符号。子载波分配要把数据符号放到实际使用的子载波上导频位置放已知符号直流子载波置零。IFFT 把频域符号变成时域波形。加 CP 是把每个 OFDM 符号末尾的cp_len个采样点复制到符号开头用来对抗多径时延扩展。function [tx_signal, data_sym] ofdm_tx(param) num_bits param.num_sym * param.num_subc * log2(param.mod_order); bits randi([0 1], num_bits, 1); data_sym qammod(bits, param.mod_order, InputType, bit, UnitAveragePower, true); data_sym reshape(data_sym, param.num_subc, param.num_sym); grid zeros(param.fft_len, param.num_sym); data_idx setdiff(1:param.fft_len, [1:6, param.fft_len-5:param.fft_len]); pilot_idx data_idx(1:param.pilot_int:end); data_idx setdiff(data_idx, pilot_idx); grid(data_idx, :) data_sym(1:length(data_idx), :); grid(pilot_idx, :) 1 1j; tx_signal ifft(grid, param.fft_len); tx_signal [tx_signal(end-param.cp_len1:end, :); tx_signal]; tx_signal tx_signal(:); endqammod的UnitAveragePower设为 true 保证符号平均功率为 1方便后面按 SNR 加噪声。data_idx用setdiff去掉直流和保护带pilot_idx从数据子载波里按间隔抽取。ifft默认对每列做变换所以grid的列对应 OFDM 符号。加 CP 用矩阵拼接实现最后(:)把二维矩阵拉成一维时域信号。注意pilot_idx的导频符号这里简单设为11j实际系统会用伪随机序列或 Zadoff-Chu 序列。2.3 信道模型AWGN 与多径衰落的切换逻辑链路级仿真最常用的信道是 AWGN 和瑞利衰落。AWGN 只加高斯白噪声用来验证基带链路本身是否正确。瑞利衰落用多径抽头模拟每个抽头是复高斯随机变量功率按指数衰减。我一般先跑 AWGNBER 曲线和理论值对得上再换瑞利信道。瑞利信道的抽头数和功率延迟谱要跟 CP 长度匹配最大时延扩展不能超过 CP 长度否则符号间干扰ISI会严重恶化 BER。function rx_signal channel_model(tx_signal, param, snr_db, channel_type) signal_power mean(abs(tx_signal).^2); noise_power signal_power / 10^(snr_db/10); noise sqrt(noise_power/2) * (randn(size(tx_signal)) 1j*randn(size(tx_signal))); if strcmp(channel_type, awgn) rx_signal tx_signal noise; elseif strcmp(channel_type, rayleigh) delay_taps [0 4 8]; power_db [0 -3 -6]; tap_power 10.^(power_db/10); tap_power tap_power / sum(tap_power); h sqrt(tap_power/2) .* (randn(1, length(delay_taps)) 1j*randn(1, length(delay_taps))); rx_signal zeros(size(tx_signal)); for k 1:length(delay_taps) delayed [zeros(delay_taps(k),1); tx_signal(1:end-delay_taps(k))]; rx_signal rx_signal h(k) * delayed; end rx_signal rx_signal noise; end endsignal_power从发送信号实测得到noise_power按 SNR 反推。瑞利信道用三个抽头时延分别是 0、4、8 个采样点功率按 0、-3、-6 dB 衰减。h是复高斯抽头系数每个抽头独立。多径卷积用循环移位加求和实现注意delayed的长度要和tx_signal一致。这里没有做多普勒扩展适合低速场景。如果要做快衰落需要给每个抽头加时间相关性常见做法是用 Jakes 模型或滤波高斯噪声。2.4 接收端同步、去 CP、FFT 与信道估计接收端顺序和发送端相反去 CP → FFT → 信道估计 → 均衡 → 解调。同步在链路级仿真里通常简化处理假设理想定时只做去 CP 和 FFT。信道估计用导频位置的最小二乘LS估计然后插值到所有子载波。均衡用估计出的信道响应做迫零或 MMSE 均衡。解调用qamdemod得到比特再和发送比特对比算 BER。function [ber, rx_bits] ofdm_rx(rx_signal, param, tx_bits, channel_type) rx_signal reshape(rx_signal, param.fft_len param.cp_len, param.num_sym); rx_signal rx_signal(param.cp_len1:end, :); rx_grid fft(rx_signal, param.fft_len); data_idx setdiff(1:param.fft_len, [1:6, param.fft_len-5:param.fft_len]); pilot_idx data_idx(1:param.pilot_int:end); data_idx setdiff(data_idx, pilot_idx); if strcmp(channel_type, awgn) h_est ones(param.fft_len, 1); else h_pilot rx_grid(pilot_idx, :) ./ 1; h_est interp1(pilot_idx, mean(h_pilot, 2), 1:param.fft_len, linear, extrap); h_est h_est(:); end rx_eq rx_grid(data_idx, :) ./ h_est(data_idx); rx_bits qamdemod(rx_eq(:), param.mod_order, OutputType, bit, UnitAveragePower, true); [~, ber] biterr(tx_bits, rx_bits); endreshape把接收信号还原成矩阵去 CP 后做 FFT。AWGN 信道下信道响应设为全 1瑞利信道下用导频位置估计再插值。interp1的extrap处理保护带边缘。均衡用逐元素除法h_est(data_idx)取出数据子载波对应的信道响应。qamdemod的UnitAveragePower要和调制端一致。biterr返回误比特数和 BER。注意导频符号在接收端要除以发送端已知的导频值这里发送导频是11j所以直接除。3. 参数怎么设FFT 点数、CP 长度与 SNR 扫描的取舍3.1 FFT 点数与子载波间隔的对应关系FFT 点数决定子载波间隔。采样率fs固定时子载波间隔Δf fs / fft_len。fft_len 越大子载波间隔越小对频率偏移越敏感但频谱效率越高。常见配置fft_len64 对应 20 MHz 采样率时子载波间隔 312.5 kHzfft_len1024 对应 15 kHz。链路级仿真里我一般先用 64 或 256 跑通再换 1024 看性能差异。fft_len 增大后IFFT/FFT 计算量增加但 MATLAB 的ifft对 1024 点仍然很快不用太担心速度。3.2 CP 长度与多径时延扩展的匹配CP 长度必须大于信道最大时延扩展。如果信道抽头最大时延是 8 个采样点CP 至少取 8实际取 16 留余量。CP 太长会浪费频谱效率太短会引入 ISI。我一般按信道最大时延的 2 倍取 CP。如果做的是 3GPP 标准信道比如 EPA、EVA、ETU它们的最大时延分别是 0.4 μs、2.5 μs、5 μs换算成采样点后 CP 要覆盖。注意 CP 长度和 fft_len 的比例影响 CP 开销CP16、fft_len64 时开销 25%CP16、fft_len1024 时开销 1.5%。3.3 SNR 扫描范围与 BER 曲线读法SNR 扫描范围一般从 0 dB 到 20 dB步长 2 dB。QPSK 在 AWGN 下 BER 到 10^-4 大约需要 8-9 dB16QAM 需要 12-13 dB。瑞利信道下同样 BER 需要更高 SNR因为衰落导致部分符号深度衰减。读 BER 曲线时注意曲线下降斜率反映分集阶数斜率越陡分集越好曲线在低 SNR 段的平台可能是导频估计误差或同步误差导致。我一般会同时画理论 BER 曲线做对比AWGN 下 QPSK 理论 BER 是0.5*erfc(sqrt(10^(snr/10)))。snr_db 0:2:20; ber_awgn zeros(size(snr_db)); ber_rayleigh zeros(size(snr_db)); for i 1:length(snr_db) [tx_signal, tx_bits] ofdm_tx(param); rx_awgn channel_model(tx_signal, param, snr_db(i), awgn); ber_awgn(i) ofdm_rx(rx_awgn, param, tx_bits, awgn); rx_ray channel_model(tx_signal, param, snr_db(i), rayleigh); ber_rayleigh(i) ofdm_rx(rx_ray, param, tx_bits, rayleigh); end semilogy(snr_db, ber_awgn, b-o, snr_db, ber_rayleigh, r-s); grid on; xlabel(SNR (dB)); ylabel(BER); legend(AWGN, Rayleigh);外层循环遍历 SNR每个 SNR 点重新生成发送信号和比特保证独立性。semilogy画对数纵轴。注意每个 SNR 点只跑一帧BER 曲线会有波动实际要跑多帧取平均。我一般每个 SNR 点跑 100 帧以上BER 低于 10^-3 时跑 1000 帧。帧数不够时 BER 曲线会出现“断崖”或“平台”那是统计样本不足不是算法问题。4. 避坑与排查链路级仿真里最容易翻车的五件事4.1 BER 曲线不下降一直停在 0.5现象跑完仿真BER 在所有 SNR 下都是 0.5 左右等于随机猜。原因最常见的是星座映射和解调的顺序不一致比如发送用qammod的bit输入接收用qamdemod的llr输出或者调制端做了reshape而解调端没做对应逆变换。另一个原因是导频位置在发送和接收端不一致导致均衡时除错了信道响应。解决在发送端和接收端分别打印data_idx和pilot_idx确认完全一致用 AWGN 信道且 SNR20 dB 时BER 应该接近 0如果还是 0.5先检查调制解调是否配对。4.2 瑞利信道下 BER 比 AWGN 还低现象换到瑞利信道后BER 反而比 AWGN 低违反直觉。原因多径抽头的功率没有归一化导致接收信号总功率大于发送功率等效 SNR 被抬高。或者抽头时延超过了 CP 长度但代码里没有做 ISI 消除反而因为多径叠加产生了意外增益。解决检查tap_power tap_power / sum(tap_power)是否执行确保多径总功率为 1检查最大时延是否小于cp_len如果大于要么增大 CP要么在接收端加时域均衡。4.3 信道估计插值后边缘子载波发散现象均衡后靠近保护带的子载波解调错误率明显高于中间子载波。原因interp1在边缘做外推时导频点不够线性外推会放大误差。解决把interp1的extrap换成extrap但限制范围或者改用spline插值但注意过冲更稳妥的做法是保护带子载波不参与解调只解调导频覆盖范围内的子载波。我一般把data_idx限制在第一个和最后一个导频之间边缘子载波直接丢弃。4.4 帧数太少导致 BER 曲线抖动现象BER 曲线在相邻 SNR 点之间上下跳动低 BER 区域尤其明显。原因每个 SNR 点只跑了一帧误比特数太少统计不收敛。解决每个 SNR 点跑多帧帧数按1 / (BER_target * num_bits_per_frame)估算。比如目标 BER10^-4每帧 4800 比特至少跑 100 帧才能看到 48 个错误比特。我一般设最小错误比特数 100达不到就继续加帧同时设最大帧数 10000 防止死循环。4.5 MATLAB 版本差异导致qammod报错现象在旧版 MATLAB 上运行报错提示qammod参数不识别。原因UnitAveragePower和InputType参数在 R2018a 之后才完善更早版本用qammod的旧语法。解决用comm.QAMModulator系统对象替代或者手动实现星座映射。手动实现 QPSK 映射很简单(2*bits(1:2:end)-1) 1j*(2*bits(2:2:end)-1)再除以sqrt(2)。这样不依赖工具箱跨版本兼容。5. 进阶技巧用多帧平均和理论曲线验证仿真正确性跑通基本链路后下一步是验证仿真结果是否可信。我习惯做两件事一是把 AWGN 下的仿真 BER 和理论 BER 画在同一张图上二是用多帧平均把 BER 曲线磨平。理论 BER 对 QPSK 是0.5*erfc(sqrt(10^(snr/10)))对 16QAM 是(3/8)*erfc(sqrt(0.4*10^(snr/10)))。如果仿真曲线和理论曲线在 0.5 dB 以内重合说明基带链路、噪声功率计算、解调都没有问题。如果偏差超过 1 dB优先查噪声功率计算noise_power signal_power / 10^(snr_db/10)里的signal_power是发送信号功率不是接收信号功率瑞利信道下接收信号功率会因衰落变化所以 SNR 定义要明确是发送 SNR 还是接收 SNR。snr_lin 10.^(snr_db/10); ber_theory_qpsk 0.5 * erfc(sqrt(snr_lin)); ber_theory_16qam (3/8) * erfc(sqrt(0.4 * snr_lin)); figure; semilogy(snr_db, ber_awgn, b-o, snr_db, ber_theory_qpsk, b--); grid on; xlabel(SNR (dB)); ylabel(BER); legend(Simulation QPSK, Theory QPSK);多帧平均的做法是在每个 SNR 点内层加一个帧循环累加误比特数和总比特数最后算总 BER。帧循环里每次重新生成信道和噪声但发送比特可以复用同一组也可以重新生成。我一般重新生成保证统计独立。帧数动态调整先跑 10 帧如果误比特数小于 100再跑 10 帧直到误比特数达到 100 或帧数达到 10000。这样低 SNR 点很快跑完高 SNR 点自动加帧整体耗时可控。还有一个容易忽略的点biterr的输入顺序。biterr(tx_bits, rx_bits)返回的是tx_bits和rx_bits不同比特的数量如果两个向量长度不一致会报错。解调输出的比特数应该等于发送比特数如果不一致检查qamdemod的输出维度。qamdemod对矩阵输入默认按列解调输出是列向量如果发送端做了reshape接收端也要做对应的reshape再拉平。我一般在接收端解调后加一句rx_bits rx_bits(:)确保和tx_bits维度一致。最后说一个我踩过的坑randi和randn的随机种子。如果不设种子每次跑的结果略有不同调试时很难复现。我一般在脚本开头加rng(42)固定种子。但做多帧平均时固定种子会导致每帧的信道和噪声相同统计不独立。正确做法是外层设一次种子内层帧循环不再重置种子让随机数自然推进。这样既能复现整体结果又保证帧间独立。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

技术参考资源整理指南:分类筛选与高效使用方法

技术参考资源整理指南:分类筛选与高效使用方法

1. 为什么“参考资源”这一章最容易被跳过,却最不该被跳过做技术内容这些年,我见过太多人翻书、翻文档、翻教程时,看到“参考资源”四个字就直接翻页。理由也很统一:不就是一堆链接和书名吗,能有什么营养?说…

2026/10/12 11:05:17 阅读更多 →
深度拆解Attention机制:QKV、缩放点积与多头注意力实现

深度拆解Attention机制:QKV、缩放点积与多头注意力实现

Attention机制这几年几乎成了AI算法领域的基础设施。做自然语言处理的人在研究它,做计算机视觉的人在改造它,做推荐系统的人在引入它,做多模态的人在靠它对齐不同模态的信息。很多第一次接触Transformer的朋友,几乎都会被Q、K、V这…

2026/10/12 11:05:17 阅读更多 →
读取手机通讯录:用 TaoToken 统一 Key 打通权限申请与数据解析链路

读取手机通讯录:用 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/12 11:05:14 阅读更多 →

最新新闻

PYNQ PS定时器中断实战:从UIO到内核模块的微秒级调度

PYNQ PS定时器中断实战:从UIO到内核模块的微秒级调度

1. 从裸机到异构:为什么PS定时器中断值得单独拎出来讲做过嵌入式开发的人都有一个共识:中断这东西,入门容易精通难。尤其在异构平台上,比如带有ARM处理器和可编程逻辑的SoC架构,中断的分配、路由、响应路径比传统单片机…

2026/10/12 12:07:09 阅读更多 →
FPGA时钟资源全解析:从PLL到BUFG,搞定时序收敛

FPGA时钟资源全解析:从PLL到BUFG,搞定时序收敛

做FPGA设计的人,总有一天会被“时钟资源”这四个字卡住。尤其是当你把工程从仿真搬到板子上,发现时序收敛不了、采样老出错、PLL怎么都锁不上,翻来覆去排查半天,根子往往就在时钟资源的规划和使用上。这篇文章想围绕FPGA时钟资源这…

2026/10/12 12:07:09 阅读更多 →
Qt自定义日志系统实战:从qDebug到生产级log文件

Qt自定义日志系统实战:从qDebug到生产级log文件

1. 为什么Qt项目必须自己搭日志系统&#xff0c;而不是依赖 qDebug()刚接手一个某跨平台系统时&#xff0c;我看到代码里满屏的qDebug() << "xxx"&#xff0c;运行时日志全堆在 Qt Creator 的 Application Output 窗口里。上线前做压力测试&#xff0c;某次连续…

2026/10/12 12:07:09 阅读更多 →
ROP入门核心:栈布局、调用约定与gadget控制原理

ROP入门核心:栈布局、调用约定与gadget控制原理

1. 为什么“简单ROP”不是入门捷径&#xff0c;而是检验栈溢出理解的试金石很多人看到“栈溢出学习&#xff08;三&#xff09;之简单ROP”这个标题&#xff0c;第一反应是&#xff1a;“终于到实战了&#xff01;”、“可以绕过NX/DEP保护了&#xff01;”、“离pwn题拿分不远…

2026/10/12 12:07:09 阅读更多 →
iOS Block底层原理深度解析:从结构体到内存管理

iOS Block底层原理深度解析:从结构体到内存管理

1. 从一道面试题说起&#xff1a;Block到底是不是对象很多人准备iOS面试时&#xff0c;看到"Block的本质"这几个字&#xff0c;第一反应就是背答案&#xff1a;Block是带有自动变量值的匿名函数&#xff0c;是OC对象&#xff0c;底层是结构体。背得滚瓜烂熟&#xff…

2026/10/12 12:07:09 阅读更多 →
C++Builder 2010安装与注册码实战:老工控机环境重建指南

C++Builder 2010安装与注册码实战:老工控机环境重建指南

简介&#xff1a;这份资源面向需要在 Windows 环境下搭建 CBuilder 2010 开发环境的程序员与学习者&#xff0c;尤其适合初次安装或反复安装失败、被注册与激活环节卡住的人群。内容围绕安装与注册流程整理&#xff0c;包含安装包与破解工具的版本号说明及详细操作记录&#xf…

2026/10/12 12:06:08 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

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