尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OFDM-CDMA基带仿真Matlab工程:从扩频原理到误码率曲线

OFDM-CDMA基带仿真Matlab工程:从扩频原理到误码率曲线 简介本资源是一份面向通信工程专业本科生及无线通信方向初学者的MATLAB仿真源码聚焦OFDM与CDMA融合系统的建模与性能分析解决多用户环境下抗多径干扰、频谱效率提升与多址接入协同设计等核心问题。压缩包为ZIP格式内含1个MATLAB脚本文件.m代码精炼仅3KB完整实现了信号生成、Walsh码扩频、IFFT/FFT调制解调、循环前缀添加与信道加噪等关键流程结构清晰、注释充分便于理解OFDM-CDMA联合机制及参数调优逻辑。已有31人学习下载适合用于课程设计、毕设仿真或通信原理进阶实验。读者可直接运行复现系统端到端流程快速掌握扩频与多载波调制的耦合实现方法并基于代码灵活修改子载波数、调制方式或信道模型支撑性能对比与算法验证。 做通信仿真的人一定绕不开OFDM绕不开CDMA更绕不开Matlab。而这个“正交频分复用cdma.zip”解压开之后就是一套把三者串起来的完整基带仿真工程。你可以在里面看到一句话的 OFDM 收发链路看到沃尔什扩频码怎么叠加多个用户看到误码率曲线怎么随信噪比下降也能直接改参数观察系统性能变化。这个项目最适合两类人一类是正在做通信课程设计或毕业设计、需要快速拿出一套可跑通、可讲解的物理层仿真代码的学生另一类是刚接触基带算法、想把OFDM和扩频通信从公式变成实际代码的工程师。它解决的问题很明确——把教科书里的OFDM-CDMA原理落到一个能看到图形、能统计误码、能扩展修改的Matlab工程里。下面我按自己的思路把这个工程拆开讲从设计思路到每一段核心代码再到我调过的坑尽量一次说透。1. OFDM-CDMA仿真项目整体思路拆解1.1 这个仿真到底在仿什么先说清楚这包代码做了什么。它模拟的不是某个具体协议而是一条完整的点对点物理层链路多个用户的二进制比特流先经过基带调制映射成复数符号再用CDMA的扩频码把不同用户区分开叠加到OFDM的子载波上发送接收端做反向操作FFT还原频域数据再用同一个扩频码解扩出想要的用户信号最后解调、统计误码率。整套流程可以用一句话概括比特进比特出中间是OFDM-CDMA的调制解调和加噪信道。这也是通信仿真最经典的学习路径——不纠结协议栈上层的东西把物理层最核心的调制、扩频、多径、信噪比这些概念全部可视化地跑一遍。具体到包里一般会包含这几样东西一个主脚本比如main_OFDM_CDMA.m控制参数、循环信噪比、统计误码发射端处理模块比特生成、QAM映射、沃尔什扩频、子载波映射、IFFT、加循环前缀信道模型AWGN高斯白噪声以及可选的简单多径信道接收端处理模块去循环前缀、FFT、信道均衡、解扩、QAM解映射绘图代码星座图、误码率曲线用来和理论值对比。这些东西本身都不复杂难的是把它们按正确的顺序接起来。很多新手拿到仿真代码第一反应是“先跑通再说”但我强烈建议先搞清楚整条链路的数据流方向再去看代码否则一旦输出不对你根本不知道是哪一级出了问题。1.2 为什么把OFDM和CDMA放在一起单独看OFDM它解决的是多径衰落问题。多径会让同一个符号的多个延迟副本叠加在一起产生符号间干扰而OFDM通过串并转换把高速数据流分成多路低速子流分别调制到不同子载波上传输每个子载波上的符号周期被拉长了很多倍再配合循环前缀多径造成的干扰就能被大幅度抑制。单独看CDMA它解决的是多用户接入问题。每个用户用一组正交或准正交的扩频码把窄带信号扩展成宽带信号多个用户共享同一段频谱接收端靠本地码的相关性把目标用户“捞”出来。OFDM-CDMA把两者合起来逻辑很自然先用CDMA扩频让多用户共存再把扩频后的码片放在OFDM的各个子载波上传输。这样你既享受了OFDM抗多径的好处又保留了CDMA用户灵活接入的优点。虽然实际4G/5G没有直接用这个方案但它作为一项经典的混合多址技术在通信教学和学术对比中一直很有价值尤其是验证“扩频多载波”这条技术路线时这个仿真平台几乎是必备的。1.3 方案选型先调制再扩频频域合并做OFDM-CDMA仿真时有一个关键选择是让CDMA扩频在时域做还是在频域做。常见做法是先做QAM调制再在频域做沃尔什扩频最后把所有用户在子载波上叠加起来我推荐的也是这个方案。原因有三点直观每个用户扩频后的码片直接对应OFDM的一个子载波你画频域图时能清楚看到“哪些子载波属于哪个用户”。便于教学演示扩频、叠加、解扩这些操作都在频域体现调试时可以通过FFT后的星座图直接定位问题。天然契合OFDM的IFFT/FFT流程OFDM本来就是在频域放符号、时域发射波形把CDMA扩频放在频域完全不需要额外的时频变换。在这个框架下N个子载波被分成U个用户组每个用户组包含S个码片。每个用户的一比特数据经过QAM调制后复制或扩展成S个码片与用户对应的沃尔什码逐位相乘再映射到该用户组的S个子载波上。所有用户完成后同一子载波上的码片直接相加这就是CDMA的“多址叠加”。2. 核心模块原理与参数设计2.1 子载波、扩频因子与用户数怎么定参数设计是整个仿真里最需要想清楚的一步因为它决定了系统容量和信号结构。我实际用的参数组合如下参数值说明FFT点数/子载波总数 N64必须是2的幂保证FFT高效扩频因子 S8每个用户占用8个子载波用户数 U88个用户 × 8个码片 64正好占满数据子载波数64满映射本仿真不保留空子载波简化处理循环前缀 CP16采样点数约等于符号长度的1/4基带调制16QAM每个符号携带4比特信道编码无仿真重点在调制解调不涉及FEC为什么N取64因为FFT必须要求2的幂64在仿真速度、代码可读性、可视化清晰度之间比较平衡。为什么不取256或1024当然可以但子载波多了单次仿真的符号块变大误码率统计需要的帧数会下降反而不利于观察每一个OFDM符号的细节。课程设计级别的演示64点FFT非常合适。扩频因子S和用户数U的乘积等于子载波总数这是频域CDMA满负荷工作的前提。你可以把S理解成“每个用户摊到多少个子载波”把U理解成“系统同时服务多少个用户”。满映射的好处是每个子载波都有信号频谱利用率最高星座图上能看到完整的叠加效果。如果你把U改成4而S保持8那总占用就是32个子载波剩下32个可以补零或者放导频也是一个玩法但误码率曲线会略有变化因为信噪比的定义基数变了。循环前缀CP取16个采样点这来自一个实际约束CP要大于最大多径时延对应的采样数。在Matlab里如果用[1 0.5]这种两径信道时延差只有1个采样点理论上CP取1都够但为了模拟更常见的无线环境我习惯把CP放宽到16给后续扩展多点余量。CP太长会损失频谱效率CP太短会在多径信道下产生载波间干扰这个度要自己根据信道模型把握。2.2 沃尔什扩频码的生成与正交条件CDMA的关键在扩频码。这里用的是沃尔什码也就是从哈达玛矩阵里取的行向量。Matlab里生成方式极其简单W hadamard(S); % S阶沃尔什矩阵S8这个矩阵的特点是每一行都是一个长度为S的 ±1 序列任意两行之间的内积为0即严格正交。举个例子8阶哈达玛矩阵的第一行是全1第二行是前4个1后4个-1依此类推。正交互补性保证了接收端在理想信道下解扩时其他用户的信号会被完全抑制不会干扰目标用户。使用时有几个容易踩的细节沃尔什码长度必须是2的幂也就是1、2、4、8、16这样不然hadamard会报错。不要把第0行和第1行搞混。MATLAB索引从1开始W(1,:)是全局不翻转的码W(2,:)才开始有翻转部分。解扩时要和发送端用同一个用户的同一行码否则相关值会变成0什么都解不出来。沃尔什码只有在码片同步对齐的情况下才严格正交。如果仿真里加了随机的符号偏移正交性会被破坏形成多址干扰。这个点后面调试问题时会专门再提。沃尔什码的一个局限是用户数不能超过码长S最多支持S个正交用户。这在单小区仿真里完全够用但如果你想模拟更多用户就得换伪随机序列加扰动那就是另一套玩法了。2.3 OFDM收发链路每一步在干什么OFDM链路的本质是把“在时域传一个高速符号流”改成“在频域并行传多个低速符号流”。接收端用FFT把时域波形重新转回频域拿到的是各个子载波上的复数符号再去做判决。整个过程可以拆成下面这些步骤发射端比特流经过QAM映射变成复数符号复数符号按用户分配到对应的子载波上这里和CDMA扩频联动所有子载波的值组成一个长度为N的频域向量对这个向量做IFFT得到长度为N的时域采样把时域采样的末尾CP个点复制到开头加上循环前缀并串转换送入信道。接收端串并转换把收到的采样数据重新分成一个个OFDM符号去掉每个符号开头的循环前缀对剩下的N个采样做FFT得到频域子载波值频域信道均衡如果有多径按子载波映射关系取出不同用户的码片用沃尔什码解扩恢复每个用户的调制符号QAM解映射得到比特统计误码。用生活类比来理解OFDM相当于把一条很宽的河上所有货物分成很多条窄船同时运送互相不干扰循环前缀就是每条船之间留的间隔防止前船的尾浪拍打到后船。CDMA则是给每条船刷上不同的颜色到岸后用颜色过滤器把不同用户的货物分开。两个机制叠加起来就是OFDM-CDMA。2.4 EbN0与噪声功率的换算避坑第一步做通信仿真最容易翻车的点就是信噪比单位没搞清楚。很多人直接把awgn函数的SNR参数当成EbN0用结果画出来的误码率曲线和理论值差了十万八千里。要区分两个量Eb/N0每比特能量与噪声功率谱密度的比值是衡量数字通信系统性能的公平指标和调制阶数、码率都脱钩了。SNR码片级或符号级单个采样或单个符号的信号功率与噪声功率的比值它和Eb/N0相差一个“调制符号携带的比特数”因子。在这套OFDM-CDMA仿真里我采用的方法是手动加噪声完全控制噪声功率。设定发射信号平均功率归一化为1那么每个子载波上码片的信号能量为Es 1 / N因为总功率分散到N个子载波IFFT后时域总功率保持不变子载波符号幅度对应关系要仔细推。在16QAM下每个调制符号携带k log2(16) 4比特所以每比特能量为Eb Es / k 1 / (N * 4)需要加的复噪声每个采样点的方差为sigma2 k / (N * 10^(EbN0_dB / 10))为什么要这样算因为如果我们设发射信号平均功率为1那么噪声方差sigma2直接等于码片级SNR的倒数。把EbN0按上面的公式转换成噪声功率就能保证横轴是标准的每比特信噪比曲线可以和16QAM的AWGN理论误码率对齐。我给的参数N64、k4时公式直接简化成sigma2 1 / (16 * 10^(EbN0_dB / 10));这个式子很短但背后是完整的能量换算。如果你用了awgn(x, snr, measured)就得非常小心它内部替你做的那一套SNR衡量标准很容易和EbN0搞混所以我建议初期先用手动加噪把链路逻辑调通再考虑要不要换库函数。3. 完整实操从零搭一个OFDM-CDMA仿真链路3.1 代码文件怎么组织我不建议把所有逻辑塞进一个脚本里那样调试一次要滚几百行。更好的做法是拆成主脚本加辅助函数ofdm_cdma_sim/ ├── main_ofdm_cdma.m % 主脚本控制参数和信噪比扫描 ├── ofdm_tx.m % 发射端函数 ├── ofdm_rx.m % 接收端函数 ├── add_channel.m % 信道函数 └── ber_awgn_theory.m % 理论误码率计算可选用函数封装的好处是你可以单独给发射端喂一段随机比特看频域星座图也可以单独给接收端喂一段信号看解调结果。链路某一环出了问题只需要对那一个函数测试。Matlab版本方面R2018b以后跑这个工程基本没问题hadamard、qammod、qamdemod、fft都是基础函数。如果你用的是R2022b或更后面的版本注意qammod的默认符号顺序和旧版有差异建议显式指定符号映射方式比如qammod(x, M, gray)避免相位旋转导致的误判。3.2 发射端代码实现先定义系统参数% 参数定义 N 64; % 子载波总数 CP 16; % 循环前缀长度 S 8; % 扩频因子 U 8; % 用户数 M 16; % 16QAM k log2(M); % 每符号比特数16QAM为4 numSymbolsPerFrame 20; % 每帧OFDM符号数发射端函数可以这样写。参数里传入所有用户的比特矩阵行代表用户列代表该帧内每个用户要发送的比特。为了方便演示我这里每个用户每帧只处理一个调制符号然后整帧跑多个OFDM符号function [tx_signal, params] ofdm_tx(bits_per_user, W, params) % bits_per_user: U × k 矩阵每行是一个用户的待发送比特 % W: S × S 沃尔什码矩阵 % 返回时域发射信号以及频域符号用于调试 U params.U; S params.S; N params.N; CP params.CP; M params.M; % 1. QAM调制得到每个用户的复数符号 syms qammod(bits_per_user, M, gray, InputType, bit, UnitAveragePower, true); % syms 是 U×1 的列向量 % 2. 频域扩频叠加生成N个子载波 tx_freq zeros(N, 1); for u 1:U % 用户u的扩频把用户符号复制扩展乘以沃尔什码对应行 spread_syms syms(u) * W(u, :).; % S×1 % 映射到该用户占用的S个子载波上 subcarrier_idx ((u-1)*S 1) : (u*S); tx_freq(subcarrier_idx) spread_syms; end % 3. IFFT转到时域 tx_time ifft(tx_freq, N); % 4. 加循环前缀 tx_cp [tx_time(end-CP1 : end); tx_time]; tx_signal tx_cp; params.tx_freq tx_freq; % 调试用 end需要注意qammod里的UnitAveragePower, true。这个参数让调制后的符号平均功率为1这样我们后续的噪声功率换算才能直接使用前面推导的公式。如果省略这个参数Matlab默认的QAM符号幅度可能不是1会干扰整个能量标定。扩频部分我用了syms(u) * W(u,:).也就是把用户的复数符号乘到沃尔什码的 ±1 序列上。由于沃尔什码是±1这个操作只是把原符号的相位翻转或不翻转功率不改变。S个码片正好占S个子载波映射逻辑非常清晰。所有用户叠加完成后tx_freq的长度就是N64。接下来对这个频域向量做IFFT得到时域信号。这里一定要用ifft而不是自己写IDFT因为ifft带 1/N 归一化因子能保持频域和时域功率关系正确。加循环前缀时我取时域信号的末尾CP个采样放在开头而不是取前CP个这是标准做法千万别搞反。3.3 信道与接收端代码实现信道部分我做了两层第一层是AWGN第二层是可选的两径多径信道。AWGN加噪部分不是简单的库函数调用而是严格按前面的能量公式算噪声方差function rx_signal add_channel(tx_signal, EbN0dB, params) N params.N; k params.k; % 噪声方差推导发射信号平均功率为1 EbN0 10^(EbN0dB / 10); sigma2 k / (N * EbN0); % 复高斯噪声实部虚部方差各为 sigma2/2 noise sqrt(sigma2/2) * (randn(size(tx_signal)) 1j * randn(size(tx_signal))); rx_signal tx_signal noise; end如果你加多径信道可以在加噪前先让信号经过一个FIR滤波器。例如% 两径信道第二径幅度0.5相位随机 tap1 1; tap2 0.5 * exp(1j * pi/3); h [tap1, tap2]; % 经过多径信道线性卷积 rx_multipath filter(h, 1, tx_signal);接收端拿到信号后需要做去CP、FFT、均衡、解扩、判决。这里的关键是接收端必须先知道信道状态信息才能做均衡。在仿真里我可以让接收端直接“知道”真实的信道冲激响应h这是理想信道估计实际系统里这一步是由导频估计得到的但仿真阶段可以简化。function [bits_est, params] ofdm_rx(rx_signal, W, h, params) U params.U; S params.S; N params.N; CP params.CP; M params.M; % 1. 去掉循环前缀取N个有效采样 rx_time rx_signal(CP1 : CPN); % 2. FFT变换回频域 rx_freq fft(rx_time, N); % 3. 信道均衡频域单抽头均衡 H_freq fft(h, N); % 信道频率响应 rx_eq rx_freq ./ H_freq.; % 4. 按用户解扩 syms_est zeros(U, 1); for u 1:U subcarrier_idx ((u-1)*S 1) : (u*S); chip_rx rx_eq(subcarrier_idx); % 解扩乘本地码累加除以S做幅度归一化 syms_est(u) (chip_rx. * W(u, :).) / S; end % 5. QAM解映射 bits_est qamdemod(syms_est, M, gray, OutputType, bit, UnitAveragePower, true); end解扩的核心就是chip_rx. * W(u, :).。由于沃尔什码的正交性目标用户的码片在累加时会线性叠加出S倍的信号幅度而其他用户的码片因为正交内积为0被抑制掉。除以S是为了把幅度恢复回原来的水平。这一步做完得到的syms_est的星座图应该基本还原成16QAM原始星座。如果噪声为0极高信噪比解扩后的星座点和发射端的星座点几乎完全重合。如果有多径但没有均衡或者CP不够长星座点会散开甚至旋转这个现象特别适合用来解释OFDM为什么需要循环前缀和均衡。3.4 主脚本与误码率统计主脚本负责把发射机、信道、接收机串联起来并在多个Eb/N0点上统计误码率。我习惯的做法是在每个信噪比点发送多个OFDM帧累积所有用户的总比特数和错误比特数再计算BER。% main_ofdm_cdma.m clear; clc; % 参数 N 64; CP 16; S 8; U 8; M 16; k log2(M); numFrames 20000; % 每个信噪比点的帧数 EbN0dB_list 0:2:16; % 沃尔什码 W hadamard(S); % 理论BER曲线16QAM AWGN EbN0Lin 10.^(EbN0dB_list/10); ber_theory 4*(1-1/sqrt(M))/log2(M) * qfunc(sqrt(3*log2(M)*EbN0Lin/(M-1))); % 存储 ber_sim zeros(size(EbN0dB_list)); for idx 1:length(EbN0dB_list) EbN0dB EbN0dB_list(idx); totalBits 0; totalErrors 0; for frame 1:numFrames % 生成每个用户的随机比特U × k bits_tx randi([0 1], U, k); % 发射 [tx_signal, params] ofdm_tx(bits_tx, W, struct(N,N,CP,CP,S,S,U,U,M,M,k,k)); % 信道 rx_signal add_channel(tx_signal, EbN0dB, struct(N,N,k,k)); % 接收先用平坦信道h[1,0] h [1]; [bits_rx, ~] ofdm_rx(rx_signal, W, h, struct(N,N,CP,CP,S,S,U,U,M,M,k,k)); % 统计 errors sum(sum(bits_tx ~ bits_rx)); totalBits totalBits numel(bits_tx); totalErrors totalErrors errors; end ber_sim(idx) totalErrors / totalBits; fprintf(EbN0 %.1f dB, BER %.2e\n, EbN0dB, ber_sim(idx)); end % 画图 semilogy(EbN0dB_list, ber_theory, r-, LineWidth, 1.5); hold on; semilogy(EbN0dB_list, max(ber_sim, 1e-6), bo-, LineWidth, 1.5); grid on; legend(16QAM理论,OFDM-CDMA仿真); xlabel(Eb/N0 (dB)); ylabel(误码率 BER);统计时要注意一个细节每个信噪比点都要跑足够多的比特才能让低信噪比区域的误码率曲线平滑。numFrames20000时每帧比特数是U*k32总共64万比特可以让BER统计到1e-5左右仍比较可信。如果你只想快速看趋势可以降到2000帧但曲线会毛糙很多。帧数选择有个经验法则实际统计到的错误比特数至少要达到30~100个否则BER估计值方差很大。比如在Eb/N014dB时16QAM的理论BER大约1e-464万比特里平均只有64个错误勉强够看。如果你要画到1e-5以下就得跑更多帧或者用停止准则累计错误达到100个就提前跳出循环。% 更高效的停止准则写法 targetErrors 100; maxBitsPerPoint 2e7; ... if totalErrors targetErrors totalBits 1e4 break; end这样既保证了统计精度又不会在低误码率时浪费大量时间。4. 常见问题排查与调试技巧实录4.1 误码率曲线异常的原因清单我见过的最多问题是曲线“掉不下去”或者“整体往右偏”。这里把典型现象和原因做成一个速查表方便大家对号入座现象最可能的原因排查方法信噪比增大但BER不下降出现地板循环前缀长度不够或接收端去掉CP时定位错误检查发射端CP是否加在了开头CP长度是否大于多径时延采样数曲线比理论值往右偏3dB左右把符号SNR当成了Eb/N0在加噪用文中推导的sigma2公式手动加噪确认每比特能量换算高信噪比时星座图转了一个角度没有做信道均衡或者QAM映射方式不匹配加h[1]时应该不需要均衡多径时必须使用H_freq归一化所有用户解出来都接近0解扩时用了错误的沃尔什行或对W的矩阵方向求反检查W(u,:)是否与发射端完全一致并用单用户模式自测误码率在0dB就接近0.5却不像正常曲线比特与解调符号对不上映射解映射顺序出了问题先在20dB下逐帧检查bits_tx和bits_rx是否逐比特一致多径信道下性能奇差AWGN下正常循环前缀太短或均衡时信道频率响应没对齐子载波增大CP打印H_freq的前几个值检查是否合理无噪声时依然有误码可能存在滤波器延迟导致符号偏移多径信道使用filter(h,1,tx_signal)后需要在接收端做群延迟补偿4.2 多用户场景下的细节如果你把U8改成U4并且不调整S8那总共有32个子载波是空的剩下的32个承载数据。这种情况下误码率曲线会怎么变很多人第一反应是“用户少了干扰少了BER应该更好”。实际在AWGN信道下由于沃尔什码正交多用户之间本来就没有干扰少用户不会显著改变BER。真正变化的是每个用户占用的带宽和信号总功率分布如果噪声是按整段频谱叠加的留给空子载波的部分也不会去干扰数据子载波所以单用户BER几乎不变。这里有一个物理直觉要建立起来在正交扩频的理想情况下多用户的代价主要体现在带宽和功率资源上而不是误码率上。CDMA的抗多址干扰能力靠的就是正交码的数学性质。如果你想看非正交干扰的效果可以把沃尔什码换成随机±1序列或者人为给不同用户加不同的符号定时偏移这时候多址干扰才会真实出现BER会随用户数增加而恶化。4.3 我踩过的坑和调试经验第一个坑是IFFT/FFT归一化。Matlab的ifft会除以Nfft不除。刚开始我图省事自己写IDFT结果少了 1/N 因子整个发射信号幅度被放大噪声功率换算全乱了。后来我统一用库函数再也不自己手写变换。第二个坑是沃尔什码的索引方向。W(u,:)是行向量W(u,:).转成列向量后和子载波向量相乘时维度要完全匹配。一旦用成W(:,u)用户索引和码片索引就错位了解出来全是乱码。第三个坑是多径均衡的相位问题。在单径信道h[1]时H_freq fft(h, N)是一个全1向量除不除都一样。但加上第二径后如果不做均衡FFT后的星座图会扭曲得很严重而且不是简单平移是整个星座绕着原点旋转缩放。我当时一度怀疑是沃尔什码矩阵写错了后来才发现是忘了均衡。第四个坑是QAM符号功率标定。Matlab的qammod在未指定UnitAveragePower时符号坐标是整数网格平均功率不是1比如16QAM的平均功率是10。如果沿用“功率为1”的公式去加噪实际噪声偏小曲线会异常“好”。反过来如果你给定了UnitAveragePowertrue所有符号的平均功率严格为1噪声公式才成立。这个细节可能是最容易踩但又最容易忽略的。最后的调试建议不要一上来就跑完整曲线。我自己的流程是先在20dB高信噪比下跑单帧把发射端tx_freq、接收端rx_eq、解扩后syms_est的星座图画出来确认链路连通。然后把发射比特和接收比特逐位对比如果完全一致就说明流程没问题。最后再跑信噪比扫描。这个过程看起来多花两分钟但能帮你剩下两个小时查bug的时间。这套工程的功能不仅仅在“跑通”而已。你把基本的OFDM-CDMA链路搭好后后面再往里加信道编码、加导频估计、加同步算法都是在现成的数据通路上打补丁。它是我觉得最适合做通信物理层入门的实验平台没有之一。本文还有配套的精品资源点击获取
返回列表