简介:本资源是北京邮电大学《移动网络仿真与规划》课程配套的实验一完整实践材料,面向通信工程、网络规划方向的本科生及仿真初学者,聚焦中心小区信干噪比(SINR)建模与蒙特卡洛仿真分析这一核心能力训练。压缩包共8个文件(7个MATLAB源程序.m + 1份Word实验报告.docx),总大小704KB;其中main1.m等主控脚本实现仿真流程调度,RandPOS.m、COST231Hata.m等模块分别完成用户随机布点、路径损耗建模,CCIR.m与AdjCel.m支撑干扰计算与邻区关系处理,实验报告则系统涵盖原理推导、参数设置、结果可视化与性能归因分析。已有543人学习下载,资源结构清晰、代码注释充分、理论与实现闭环,可直接运行复现SINR统计分布,为课程设计、课程实验及无线网络性能评估提供即用型参考方案。
1. 项目背景与核心目标:从“信干噪比”说起
如果你正在学习移动通信,或者对蜂窝网络规划感兴趣,那么“信干噪比”这个词一定不陌生。它几乎是衡量一个无线通信系统性能最核心的指标之一。简单来说,它衡量的是你想要的信号,在噪声和干扰的“夹击”下,还能有多强。这个比值直接决定了你的手机能不能流畅地刷视频、打电话会不会断断续续。这次我们要聊的,就是围绕这个核心指标展开的一次仿真实践——中心小区的信干噪比计算与规划。
这个项目源自经典的移动网络仿真课程设计。它的核心目标非常明确:在一个简化的蜂窝网络模型中,计算并分析位于网络中心那个小区的信干噪比分布情况。听起来好像只是算个数?但这里面门道可多了。你需要考虑基站怎么摆、信号怎么传、用户怎么分布、干扰从哪来。这不仅仅是写几行代码,更是对整个移动通信系统底层逻辑的一次深度模拟和验证。通过这个过程,你能把书本上那些关于路径损耗、阴影衰落、同频干扰的抽象公式,变成屏幕上直观的场强图和SINR分布图,这种从理论到实践的跨越,对于理解移动网络规划至关重要。
很多人拿到这种题目,第一反应可能就是去网上找段代码改改。但你会发现,要么代码跑不通,要么结果看不懂,报告更是无从下手。这正是这个项目的价值所在——它逼着你从零开始,理解每一个参数的意义,设计每一个计算的步骤,最终得到一份能清晰阐述“为什么这么算”以及“结果说明了什么”的完整成果。接下来,我就结合自己多次指导这类项目的经验,把其中的关键环节、容易踩的坑以及如何写出高质量报告的心得,详细拆解一遍。
2. 仿真环境搭建与模型定义:一切计算的基础
在动手写代码之前,我们必须先把“舞台”搭好。这个舞台就是我们的仿真环境,包括网络拓扑、信道模型以及各种参数。这一步如果定义模糊,后面的所有计算都将失去意义。
2.1 蜂窝网络拓扑结构设计
最经典的模型是六边形蜂窝网络。我们通常模拟一个由多层六边形小区环绕中心小区的结构,例如3层(19个小区)或4层(37个小区)。中心小区(编号为0)就是我们本次分析的重点。
关键设计决策与理由:
- 小区半径(R):这是最基本的参数,通常设为500米或1000米。它决定了小区的覆盖范围。选择时需要考虑仿真场景是密集城区还是普通郊区。
- 基站位置:每个六边形的中心放置一个基站。这里有个计算技巧:假设六边形中心为原点(0,0),那么其六个顶点的坐标可以通过R和60度间隔的三角函数轻松算出。而相邻小区的基站坐标,则是基于六边形网格的向量叠加。例如,沿着60度方向,移动距离为
sqrt(3)*R。 - 用户分布:用户在小区内如何分布?通常采用均匀随机分布。这意味着我们需要在正六边形区域内生成均匀的随机点。一个常见错误是直接在半径为R的圆形内生成随机点,这会导致六边形边缘的用户密度偏低。正确的方法是在一个外接矩形内生成点,然后判断该点是否在正六边形内。
% 示例:在正六边形内生成一个随机用户点(假设六边形中心在(0,0),一个顶点在(R,0)) % 先生成在包围矩形内的点 x_temp = (rand - 0.5) * 2 * R; % 矩形宽度为2R y_temp = (rand - 0.5) * 2 * R * sind(60); % 矩形高度为2R*sin60 % 判断点是否在六边形内(通过判断到六条边的距离) % 此处简化,可采用旋转判断法。更简单的方法是生成大量点再筛选,但效率低。 % 一个实用技巧:利用六边形的对称性,将点映射到第一象限的菱形区域进行判断。2.2 无线信道传播模型
信号从基站传到用户,强度会衰减。我们用一个模型来刻画这种衰减,这就是路径损耗模型。对于这类仿真,Okumura-Hata模型或其简化版本COST231-Hata模型(适用于城市环境)是非常经典的选择。
以简化的Hata模型为例,路径损耗PL(d)(单位:dB)的计算公式通常为:PL(d) = A + B * log10(d)其中,d是距离(公里),A和B是与频率、天线高度等相关的参数。例如,在2GHz频段,市区环境可能取A=140,B=35左右。
但这里有一个至关重要的细节:我们还需要考虑阴影衰落。阴影衰落建模为对数正态分布,它反映了由于建筑物、地形等遮挡造成的随机信号波动。因此,用户接收到的信号功率(dBm)应该是:Prx = Ptx - PL(d) + X_sigma其中,Ptx是基站发射功率(dBm),X_sigma是均值为0、标准差为σ(通常取8dB)的正态分布随机变量。
% 示例:计算从基站到用户的路径损耗(含阴影衰落) function PL = calculatePathLoss(d_km, fc_MHz, hb_m, hm_m, scenario) % d_km: 距离(公里) % fc_MHz: 载频(MHz) % hb_m: 基站天线高度(米) % hm_m: 用户天线高度(米) % scenario: 'urban', 'suburban'等 % 1. 计算基础Hata模型路径损耗(此处为简化公式,实际需查表或完整公式) A = 69.55 + 26.16*log10(fc_MHz) - 13.82*log10(hb_m) - (1.1*log10(fc_MHz)-0.7)*hm_m + 1.56*log10(fc_MHz)-0.8; B = 44.9 - 6.55*log10(hb_m); PL_hata = A + B*log10(d_km); % 2. 根据场景调整(如郊区需减去修正因子) if strcmp(scenario, 'suburban') PL_hata = PL_hata - 2*[log10(fc_MHz/28)]^2 - 5.4; end % 3. 添加对数正态阴影衰落 shadowing_sigma = 8; % 标准差8dB shadowing = shadowing_sigma * randn; % 生成一个随机阴影衰落值 PL = PL_hata + shadowing; end注意:阴影衰落随机数
randn的生成,在每次仿真运行时(尤其是蒙特卡洛仿真)需要管理随机种子,以确保结果可复现。可以使用rng(seed)函数固定随机数生成器。
2.3 干扰源的定义
对于中心小区的用户,其接收到的干扰主要来自使用相同频率的其他小区基站,即同频干扰。在我们的多层六边形模型中,所有小区通常复用相同的频率组(频率复用因子为1),因此除了服务基站(中心基站)外,其他所有基站的信号都是干扰。
因此,总干扰功率I(线性值,如mW)是所有同频干扰基站信号到达该用户处的功率之和。计算每一个干扰源的过程与服务基站信号的计算过程完全一样:确定距离d,计算路径损耗PL(d)(含阴影衰落),然后用发射功率减去PL(d)得到接收功率(dBm),再转换为线性值相加。
一个关键点:噪声功率。噪声通常指热噪声,计算公式为:N = k * T * B,其中k是玻尔兹曼常数,T是绝对温度(通常取290K),B是系统带宽(Hz)。将结果转换为dBm:N_dBm = 10*log10(k*T*B*1000)。对于典型的LTE系统带宽(如10MHz),噪声功率大约在-104dBm量级。
至此,我们有了服务信号功率S(线性值),总干扰功率I(线性值)和噪声功率N(线性值)。那么信干噪比SINR(通常用dB表示)就是:SINR_dB = 10 * log10( S / (I + N) )
3. 核心算法流程与MATLAB实现要点
有了清晰的模型,我们就可以用MATLAB将整个仿真流程串起来。这个过程本质上是一个蒙特卡洛仿真,因为用户位置和阴影衰落都是随机的。我们需要通过多次随机“撒点”(即生成用户)来统计SINR的分布特性。
3.1 主程序逻辑框架
一个结构清晰的主程序应该包含以下模块:
- 初始化参数模块:定义所有常量,如小区半径R、频率fc、基站发射功率Ptx、噪声功率N、阴影衰落标准差σ、仿真次数(用户数)num_drops等。
- 生成网络拓扑模块:计算所有基站的坐标,存储在一个Nx2的矩阵中(N为基站总数)。
- 主循环(蒙特卡洛仿真): a.生成用户:在中心小区(编号0)的六边形区域内,随机生成一个用户的位置坐标。 b.计算服务信号:计算该用户到中心基站(0号基站)的距离,调用
calculatePathLoss函数,得到接收信号功率S。 c.计算总干扰:遍历除0号基站外的所有其他基站。对每个干扰基站,计算用户到它的距离和路径损耗,得到该干扰源的接收功率。将所有干扰源的功率(线性值)累加,得到总干扰I。 d.计算SINR:将S和I转换为线性值(功率单位,如mW),代入公式SINR = S_linear / (I_linear + N_linear),再转换为dB值存储。 - 数据分析与可视化模块:仿真结束后,对收集到的所有SINR样本进行统计分析,如绘制CDF(累积分布函数)曲线、计算边缘SINR(如5%最差用户的SINR)、绘制SINR地理分布图等。
%% 主程序示例框架 clear; clc; close all; % 1. 初始化参数 R = 500; % 小区半径,米 fc = 2000; % 载频,MHz Ptx_dBm = 43; % 基站发射功率,dBm num_hex_rings = 3; % 六边形环数,3环对应19个小区 num_drops = 10000; % 蒙特卡洛仿真次数(用户数) shadowing_std = 8; % 阴影衰落标准差,dB bandwidth = 10e6; % 系统带宽,10MHz kT_dBm_Hz = -174; % 热噪声谱密度,dBm/Hz N_dBm = kT_dBm_Hz + 10*log10(bandwidth); % 噪声功率,dBm N_linear = 10^(N_dBm/10); % 噪声功率,线性值(mW) % 2. 生成基站坐标(假设有现成函数generateHexGrid) bs_positions = generateHexGrid(R, num_hex_rings); % 返回19x2矩阵 center_bs_index = 10; % 假设中心基站是第10个(根据生成顺序) num_bs = size(bs_positions, 1); % 3. 预分配数组存储结果 sinr_results = zeros(num_drops, 1); % 4. 主仿真循环 for drop = 1:num_drops % 4.1 在中心小区内生成一个随机用户位置 user_pos = generateRandomUserInHexagon(R, bs_positions(center_bs_index, :)); % 4.2 计算服务基站(中心基站)的信号功率 dist_to_serving = norm(user_pos - bs_positions(center_bs_index, :)) / 1000; % 转换为公里 pathloss_serving = calculatePathLoss(dist_to_serving, fc, 30, 1.5, 'urban'); Prx_serving_dBm = Ptx_dBm - pathloss_serving; Prx_serving_linear = 10^(Prx_serving_dBm / 10); % 4.3 计算所有干扰基站的信号功率之和 interference_linear = 0; for bs = 1:num_bs if bs == center_bs_index continue; % 跳过服务基站 end dist_to_interferer = norm(user_pos - bs_positions(bs, :)) / 1000; pathloss_interferer = calculatePathLoss(dist_to_interferer, fc, 30, 1.5, 'urban'); Prx_interferer_dBm = Ptx_dBm - pathloss_interferer; Prx_interferer_linear = 10^(Prx_interferer_dBm / 10); interference_linear = interference_linear + Prx_interferer_linear; end % 4.4 计算SINR sinr_linear = Prx_serving_linear / (interference_linear + N_linear); sinr_results(drop) = 10 * log10(sinr_linear); end % 5. 后续分析与绘图...3.2 性能优化与常见错误
直接使用上述双重循环(用户循环内嵌套干扰基站循环)在用户数或基站数很大时效率会很低。MATLAB是矩阵运算语言,应尽量避免循环。
优化技巧1:向量化计算干扰。我们可以一次性计算用户到所有基站的距离和路径损耗。
% 假设user_pos是1x2向量,bs_positions是Nx2矩阵 % 计算用户到所有基站的距离向量(单位:公里) dist_vector = sqrt(sum((user_pos - bs_positions).^2, 2)) / 1000; % 计算所有路径损耗(向量化操作,需要重写calculatePathLoss以支持向量输入) pathloss_vector = calculatePathLossVectorized(dist_vector, fc, 30, 1.5, 'urban'); % 计算所有基站的接收功率(dBm) Prx_all_dBm = Ptx_dBm - pathloss_vector; % 转换为线性值 Prx_all_linear = 10.^(Prx_all_dBm / 10); % 服务信号功率 S_linear = Prx_all_linear(center_bs_index); % 总干扰功率(求和所有线性值,再减去服务信号) I_linear = sum(Prx_all_linear) - S_linear; % 计算SINR sinr_linear = S_linear / (I_linear + N_linear);这样就将一个内层循环替换为高效的矩阵运算,速度可提升数十倍。
常见错误1:单位混淆。这是最易出错的地方。路径损耗公式中的距离d单位通常是公里(km),而我们从坐标计算出的距离单位是米(m)。忘记除以1000会导致路径损耗计算错误高达几十dB。同样,发射功率Ptx是dBm,在加减路径损耗(dB)后得到接收功率Prx(dBm)。但在计算SINR线性值时,必须先将dBm转换为毫瓦(mW)或瓦(W),即P_linear = 10^(P_dBm/10)。最后SINR的dB值又是10*log10(S_linear/(I_linear+N_linear))。整个过程中dB和线性值的转换必须时刻清醒。
常见错误2:忽略噪声功率。在干扰较强的区域(比如小区中心),I远大于N,噪声影响不大。但在小区边缘,信号S很弱,干扰I也可能相对较小,此时噪声N就不能忽略了。严谨的仿真必须包含噪声项。
常见错误3:阴影衰落的独立性。服务链路和每个干扰链路的阴影衰落应该是独立同分布的随机变量。这意味着在每次用户“撒点”时,服务基站和每个干扰基站到该用户的阴影衰落值都需要独立生成。不能用一个随机数代表所有链路的阴影衰落。
4. 结果分析与可视化:从数据到洞察
仿真的结果是一堆SINR数据,如何从中提炼出有价值的信息,是报告能否出彩的关键。单纯给出一个平均SINR是远远不够的。
4.1 核心性能指标:CDF曲线与边缘SINR
累积分布函数(CDF)曲线是分析无线信道性能的黄金标准。它直观地展示了SINR的统计分布。横轴是SINR(dB),纵轴是概率(或百分比)。曲线上任意一点(x, y)表示:有y%的用户,其SINR小于等于x dB。
从CDF曲线上,我们可以读出几个关键指标:
- 中值SINR(50%点):代表典型的用户体验。
- 边缘SINR(通常看5%或10%点):代表网络中最差那部分用户的体验。这是网络规划的硬性指标,必须保证边缘SINR高于某个门限(例如,对于QPSK调制,可能需要-3dB以上;对于64QAM,可能需要20dB以上),否则边缘用户将无法使用高阶调制,速率会急剧下降。
- SINR分布范围:曲线从陡峭到平缓的跨度,反映了网络覆盖的均匀性。跨度越小,说明覆盖越均匀。
在MATLAB中绘制CDF曲线非常简单:
figure; [f, x] = ecdf(sinr_results); % 计算经验CDF plot(x, f, 'LineWidth', 2); grid on; xlabel('SINR (dB)'); ylabel('CDF'); title('中心小区用户SINR CDF曲线'); % 标注边缘SINR(5%) edge_sinr = prctile(sinr_results, 5); hold on; plot([edge_sinr, edge_sinr], [0, 0.05], 'r--'); plot([min(x), edge_sinr], [0.05, 0.05], 'r--'); text(edge_sinr, 0.05, sprintf(' 5%%边缘SINR=%.2f dB', edge_sinr), 'VerticalAlignment','top');4.2 地理分布可视化:SINR热力图
CDF曲线告诉我们整体分布,但不知道SINR差的具体位置。SINR地理分布热力图可以完美解决这个问题。我们可以在中心小区内划分一个精细的网格,计算每个网格点处的SINR,然后用imagesc或pcolor函数绘制出来。
% 定义网格 [x_grid, y_grid] = meshgrid(linspace(-R, R, 100), linspace(-R*sqrt(3)/2, R*sqrt(3)/2, 100)); sinr_map = zeros(size(x_grid)); % 遍历网格点(这里可以优化,但逻辑清晰优先) for i = 1:size(x_grid, 1) for j = 1:size(x_grid, 2) user_pos_temp = [x_grid(i,j), y_grid(i,j)]; % 判断点是否在中心六边形内(略去判断代码) if ~isPointInCenterHexagon(user_pos_temp, R) sinr_map(i,j) = NaN; % 非小区内区域设为NaN continue; end % 调用之前写好的函数计算该点的SINR(注意,这里通常不考虑该点的阴影衰落随机性,或者取均值) sinr_map(i,j) = calculateSINRAtPosition(user_pos_temp, bs_positions, center_bs_index, Ptx_dBm, fc, N_linear, 0); % 最后一个参数0表示阴影衰落标准差设为0,看平均情况 end end figure; pcolor(x_grid, y_grid, sinr_map); shading interp; colorbar; axis equal tight; xlabel('X (米)'); ylabel('Y (米)'); title('中心小区平均SINR地理分布(无阴影衰落)'); hold on; % 可以叠加画出六边形边界和基站位置 plot(bs_positions(:,1), bs_positions(:,2), 'k^', 'MarkerSize', 10, 'MarkerFaceColor', 'w');这张图能清晰显示:小区中心SINR最高,越靠近六边形顶点(即与其他小区的交界处),SINR越低,这是因为这些点距离干扰基站更近。这直观验证了同频干扰的影响模式。
4.3 参数敏感性分析
一份优秀的报告不能只展示一组参数下的结果。你需要进行参数敏感性分析,即改变某个关键参数,观察系统性能(如边缘SINR)如何变化。这体现了你对系统理解的深度。
典型的分析维度包括:
- 基站发射功率:将Ptx从30dBm增加到46dBm,观察边缘SINR的变化。你会发现,增加功率在初期能显著提升SINR,但到一定程度后,提升会变得非常缓慢甚至停滞。因为当你增强服务信号时,干扰信号也同步增强了(所有基站同频同功率),这就是同频干扰受限系统的典型特征。这个分析能有力说明,单纯靠“加大功率”来改善覆盖是有限度的。
- 频率复用因子:将模型从“全复用”(所有小区同频)改为“3复用”(每3个小区一组频率)。这时,只有部分相邻小区是同频干扰源。你需要修改干扰计算逻辑,只累加同频小区的干扰。结果会显示边缘SINR大幅提升,但代价是频谱效率降低。这个对比能深刻揭示蜂窝网络“频率复用”这一核心思想的内在权衡。
- 阴影衰落标准差:将σ从0dB(理想情况)增加到12dB(恶劣环境)。观察CDF曲线的变化。标准差增大会导致SINR分布范围变宽,尾部变长,即出现更多极好和极差的点。边缘SINR(5%)通常会恶化。这说明了无线环境随机性对网络覆盖可靠性的影响。
将不同参数下的关键指标(如边缘SINR、中值SINR)制成表格或绘制成曲线图,能让你的报告分析层次立刻丰富起来。
| 参数名称 | 参数值 | 中值SINR (dB) | 5%边缘SINR (dB) | 备注 |
|---|---|---|---|---|
| 基准场景 | Ptx=43dBm, 全复用, σ=8dB | 15.2 | -1.5 | |
| 提高发射功率 | Ptx=46dBm | 16.1 | -0.8 | 改善有限 |
| 3频率复用 | 复用因子=3 | 22.7 | 8.4 | 干扰减少,提升显著 |
| 增大阴影衰落 | σ=12dB | 15.0 | -3.2 | 分布变差,边缘恶化 |
5. 实验报告撰写精髓与避坑指南
源代码跑通了,图也画漂亮了,最后一步是把所有工作整理成一份逻辑清晰、内容充实的报告。很多同学代码写得不错,但报告写得像实验说明书,这是非常可惜的。
5.1 报告的核心结构
一份好的课程设计报告,应该像在讲述一个完整的故事:
- 引言:简要说明移动网络规划的意义,引出信干噪比(SINR)这个核心指标,并明确本实验的目标——通过仿真分析中心小区的SINR分布。
- 系统模型:这是报告的理论基础。必须详细说明:
- 网络拓扑:几层六边形?小区半径多少?图文并茂。
- 信道模型:使用了哪个路径损耗模型(写出具体公式和参数取值)?阴影衰落如何建模(分布、标准差)?
- 干扰模型:同频干扰是如何定义的?考虑了哪些干扰源?
- 噪声模型:热噪声功率是如何计算的(给出公式和参数值)?
- 仿真设计与实现:
- 仿真流程:用流程图(可以用Visio或PPT画,然后截图插入)清晰地展示从初始化、用户生成、功率计算到SINR统计的完整过程。
- 关键参数表:将所有仿真参数(R, fc, Ptx, σ, 带宽,温度等)整理成一个表格,一目了然。
- 程序结构说明:简要介绍主程序、各个函数(如
generateHexGrid,calculatePathLoss)的功能和接口。不需要贴全部代码,只需贴关键算法的代码片段(如向量化计算干扰的部分),并加以解释。
- 结果与分析:这是报告的重头戏。
- 展示结果图:CDF曲线图、SINR地理分布热力图必须清晰、规范(有坐标轴标签、图例、标题)。图下面要紧跟文字分析,解读图中反映的现象(如“从CDF曲线可以看出,5%的用户SINR低于-1.5dB...”,“从热力图可以看出,干扰主要来自六边形顶点方向...”)。
- 参数分析:展示并分析改变发射功率、频率复用因子等对SINR的影响。用图表对比,并解释其背后的物理/系统原理(如“功率提升的边际效应递减是因为系统是干扰受限的”)。
- 结论归纳:基于以上分析,总结出几条核心结论。例如:“在本仿真设定下,中心小区边缘用户SINR为负,无法保证基本业务需求”、“采用3频率复用可大幅提升边缘SINR至8dB以上,但频谱效率降至1/3”、“阴影衰落增大会显著恶化网络覆盖的可靠性”。
- 总结与心得体会:不要写空话套话。写你在这个过程中遇到的实际困难(比如单位换算错误导致结果异常),以及如何解决的。写你对蜂窝网络干扰的理解是如何从模糊变清晰的。写如果时间允许,你还想从哪些方面扩展这个仿真(比如加入快衰落、考虑用户移动性、仿真吞吐量映射等)。这部分是体现你思考和收获的地方。
5.2 必须避免的“坑”
- 只有代码截图,没有解释:报告不是代码清单。你需要解释为什么这样设计算法,为什么选择这些参数。例如,解释为什么用蒙特卡洛方法,为什么阴影衰落要独立生成。
- 结果描述空洞:不要说“从图可以看出SINR很好”。要说“中值SINR为15dB,这意味着超过一半的用户处于信道条件较好的状态,可能支持64QAM高阶调制;但5%边缘SINR为-2dB,这部分用户可能只能使用QPSK甚至无法连接”。
- 分析缺乏深度:做完参数变化仿真后,要解释变化背后的原因。功率提升效果不显著?因为同频干扰也同步增加了。频率复用提升明显?因为从根本上减少了干扰源的数量。把现象和理论联系起来。
- 图表质量差:MATLAB生成的图默认字体可能较小,线条较细。在插入报告前,务必调整图形属性:加大字体(如
set(gca, 'FontSize', 12))、加粗线条('LineWidth', 2)、使用清晰的图例。确保在黑白打印时,不同曲线也能区分(使用不同线型:'-','--',':')。 - 忽视对比与参考文献:在引言或模型部分,可以简要提一下经典的蜂窝网络仿真研究或教科书,说明你的模型是建立在哪些经典工作之上的。在分析时,将自己的结果与理论预期或常识进行对比,增强说服力。
最后,把源代码作为附录完整地附在报告后面。确保代码有清晰的注释、合理的缩进和函数封装。一个干净、可读的源代码,本身就是报告质量的重要组成部分。
通过这样一个从模型构建、算法实现、结果分析到报告撰写的完整流程,你收获的不仅仅是一个课程的分数,更是一套解决实际通信系统仿真问题的完整方法论。当你下次再看到“SINR”、“同频干扰”、“蜂窝规划”这些词时,你的脑海里浮现的将不再只是枯燥的公式,而是一幅幅动态的、可交互的仿真图景。这才是工程学习的真正乐趣所在。
本文还有配套的精品资源,点击获取