简介:面向通信工程与电子信息类本科毕业设计,这份PDF论文完整呈现了基于MATLAB的扩频通信系统仿真研究。内容涵盖直接序列扩频、跳频扩频等理论基础,并利用SIMULINK搭建系统仿真模型,详细讲解信号扩频、解扩及干扰处理等模块设计,还通过仿真实验分析了扩频增益与输出端信噪比的关系,验证了增大扩频增益可提升系统抗干扰能力。压缩包为单个PDF文件,大小3.58MB,包含中英文摘要、目录、正文、参考文献等规范结构,符合理工科毕业设计撰写要求。目前已有267人学习下载,适合需要参考完整论文框架、学习SIMULINK建模仿真方法或撰写扩频通信方向毕业设计的读者,可作为选题论证、建模思路和仿真分析的实用参考资料。
1. 扩频通信系统仿真的核心前提:用带宽换信噪比
扩频通信不是一种调制方式,而是一种传输策略。它先把信息频谱展宽几十倍甚至上百倍,再在接收端用本地伪随机码做相关解扩,把有用信号重新压回窄带,同时把进入通带的干扰功率摊薄。这套机制的数学基础是Shannon信道容量公式:信道容量一定时,带宽B和信噪比S/N可以互换。也就是说,带宽多付出一些,系统就能在更低的信噪比下工作,这就是扩频系统能在负信噪比环境下维持通信的原因。
对做毕业设计或者刚接触通信物理层的工程师来说,最容易踩的坑是把扩频当成加密或者简单加扰。实际上扩频的本质是处理增益,Gp等于扩频信号带宽与信息带宽之比。Gp越大,抗干扰容限越高,但占用频谱也越宽,同步和捕获的难度同步上升。本文围绕基于MATLAB/Simulink的直序扩频(DSSS)仿真来展开,重点解决三件事:m序列怎么设计、Simulink模型每个模块怎么配参、仿真结果如何用误码率和信噪比曲线来验证理论。这套模型既能支撑毕业论文的结论,也能直接改造成后续研究跳频、CDMA的基础平台。
2. 直序扩频的理论骨架与m序列的MATLAB实现
2.1 直序扩频的数学模型
直序扩频的发送端流程可以抽象为:信源比特与PN码做模2加(等价于双极性相乘),再送入PSK调制器。接收端做相反操作,先解调得到扩频信号,再与同步后的PN码做第二次相关处理,完成解扩。
从信号处理角度看,设信息码为d(t),取值为±1,码元宽度为Tb;PN码为c(t),取值为±1,码片宽度为Tc。扩频后的信号为s(t) = d(t)·c(t)·cos(ω0t)。因为Tc远小于Tb,s(t)的带宽由PN码的码片速率决定,这就是频谱扩展的来源。接收端恢复出d(t)后,再用一个窄带滤波器把信噪比拉回来,因为解扩后的信号带宽是Tb的量级,而干扰在白化后散落在整个Tc带宽上,窄带滤波恰好只保留有用信号的能量。
用MATLAB验证这组关系时,不需要立刻上Simulink。先用m脚本把扩频-解扩的数学过程跑通,确认底层逻辑无误,再进Simulink搭模块,排查问题时可以区分是算法概念错误还是模块配置错误。
% 扩频与解扩的数学验证脚本 Fs = 1000; % 采样率,单位Hz Tb = 0.1; % 信息码元宽度,单位s Tc = 0.01; % 码片宽度,单位s,扩频增益 = Tb/Tc = 10 % 生成信息码和PN码 data = sign(randn(1, 10)); % 10个随机信息比特 pn = sign(randn(1, length(data) * 10)); % PN码,码片速率是信息速率的10倍 pn = pn(:); % 扩频:每个信息比特重复10次后与PN码点乘 data_up = reshape(repmat(data, 10, 1), [], 1); % 上采样 tx = data_up .* pn; % 扩频 % 模拟解扩:用相同PN码点乘,再按10个码片累加判决 rx = tx .* pn; % 相关解扩 rx_sum = reshape(rx, 10, []); rx_decision = sign(sum(rx_sum, 1)); % 求和后判决 fprintf('误码率:%d\n', sum(rx_decision ~= data));这段代码里最关键的是reshape的维度安排。repmat(data, 10, 1)让每个信息比特沿时间轴重复10次,对应一个信息码元内填充10个码片。sign(randn(...))生成双极性随机序列,用来模拟信源和PN码最简单直接。解扩侧的判决是累加而非取平均,因为符号只取决于累加结果的正负,取平均反而多一步运算。输出误码率为0,说明在理想信道下扩频-解扩过程不引入信息损失。
2.2 m序列的生成与自相关验证
m序列,全称最长线性反馈移位寄存器序列,是PN码里工程上最常用的一类。它的生成依赖本原多项式。N级移位寄存器能输出的m序列周期为2^N - 1。选择不同的反馈抽头,得到的序列性质完全不同,所以不能随意接反馈线。
用MATLAB生成m序列时,常见做法是构造移位寄存器状态向量,每个时钟周期做一次抽头反馈。以级数N=7为例,采用本原多项式x^7 + x^3 + 1,对应反馈抽头取第7级和第3级。生成代码可以这样写:
% 生成周期为127的m序列 N = 7; % 移位寄存器级数 reg = ones(1, N); % 寄存器初态,全1是常用做法 len = 2^N - 1; % m序列周期 mseq = zeros(1, len); for i = 1:len mseq(i) = reg(N); % 输出取最后一级 fb = xor(reg(N), reg(3)); % 本原多项式 x^7 + x^3 + 1 reg = [fb, reg(1:N-1)]; % 反馈值移入第一级 end % 计算自相关 ac = xcorr(mseq, 'normalized'); plot(ac); title('m序列自相关函数'); xlabel('移位'); ylabel('归一化自相关幅值');初态全1和初态其余非零状态生成的序列只是相位不同,周期和伪随机统计特性一致。自相关曲线在零移位处出现周期脉冲峰,峰值等于周期127,其余移位处幅值接近-1/127。如果你的自相关图出现多个相等的高峰,那不是正常的m序列特征,通常是反馈多项式没有取本原多项式,序列退化为短周期。排查方法是打印序列长度,若周期小于2^N - 1,说明反馈抽头选择有误。
2.3 扩频增益的定量计算
扩频增益Gp的定义是扩频后的射频带宽B与信息带宽ΔF之比。对于DS/BPSK系统,B近似等于PN码码片速率Rc,ΔF近似等于信息码速率Rb,因此Gp = Rc / Rb = Tb / Tc。用上面的代码,Tb=0.1s,Tc=0.01s,Gp=10,换算成dB值约10dB。
在Simulink参数配置时,扩频增益的值直接来自PN Sequence Generator的码片速率和Random Integer Generator的采样周期。如果信息速率是100Hz,PN码速率是1000Hz,那么每个信息比特对应10个PN码片,Gp=1000/100=10。需要警惕的是,实际系统里的滤波器、同步偏差、调制滚降都会引入损耗,最终系统输出端的信噪比改善不会完整达到Gp值,这在论文的结果分析里需要合理解释。
3. Simulink直序扩频模型的分模块搭建与参数配置
3.1 模型总览与信号流向
Simulink搭建扩频系统模型,推荐按信号流向逐级构建。整个DSSS仿真链路包含信源、PN码发生器、扩频乘法器、BPSK调制器、AWGN信道、BPSK解调器、解扩乘法器、积分判决器和误码率统计模块。Simulink模型文件建立后,信号流是:Random Integer Generator产生0/1序列,经过双极性变换(0映射为-1,1映射为1),与PN Sequence Generator输出的±1序列相乘完成扩频;扩频信号进M-PSK Modulator Passband完成载波调制;过AWGN Channel后由M-PSK Demodulator Passband解调回基带;再与本地PN码相乘做解扩,通过Relay或Sign模块判决,最后进Error Rate Calculation和Display统计误码率。
下面是一个可以直接对照搭建的模块清单,参数按典型配置给出。
| 模块名称 | 关键参数 | 推荐配置值 | 作用 |
|---|---|---|---|
| Random Integer Generator | Sample time / Initial seed | 0.01s / 37 | 产生基带信息码 |
| PN Sequence Generator | Generator polynomial / Initial states | x^10+x^3+1 / 全1 | 产生扩频码 |
| Product | Number of inputs | 2 | 信息码与PN码相乘完成扩频 |
| M-PSK Modulator Passband | M-ary number / Carrier freq | 2 / 1000Hz | BPSK调制,把基带搬到频带 |
| AWGN Channel | Mode / SNR(dB) | Signal to noise ratio / 10 | 叠加高斯白噪声,模拟信道 |
| M-PSK Demodulator Passband | M-ary number / Carrier freq | 2 / 1000Hz | BPSK相干解调回基带 |
| Relay | Switch on point / Switch off point | 0.0 / 0.0 | 判决解扩后的信号为正还是负 |
| Error Rate Calculation | Receive delay | 0 | 对比发送信息和恢复信息,统计误码 |
| Display | 无 | 无 | 显示误码率数值 |
各模块信号的采样率必须匹配。如果信源采样周期0.01s,PN码速率1000Hz即采样周期0.001s,二者相乘后每个信息码元内包含10个PN码片,扩频增益正好为10。采样周期不匹配会导致信号错位或报维度错误,建议在模型里手动指定各模块Sample time,不要依赖默认值。
3.2 PN序列发生器设计要点
PN Sequence Generator是扩频链路的核心。双击模块后,主要配置两个参数:Generator polynomial和Initial states。Simulink中的生成多项式用加号连接,指数项按降序排列。比如选择10级移位寄存器,多项式写为x^10+x^3+1,生成周期长度是2^10-1=1023的m序列。Initial states设置寄存器初态,常用1 1 1 1 1 1 1 1 1 1。
Output mask用于选择输出抽头。在基本直接扩频系统里,用单个输出抽头即可,不需要配置mask。值得注意的是,PN序列发生器的输出是0/1逻辑值,而扩频乘法器需要的是±1双极性信号,所以需要在PN模块后再接一个Gain模块,增益为2,再加一个Bias模块,偏置为-1。0映射为-1,1映射为1。跳步这步,乘法器输出会混入直流分量,导致后续PSK调制信号的频谱出现载波泄漏。
3.3 M-PSK调制解调与AWGN信道配置
M-PSK Modulator Passband是Simulink通信工具箱里的带通调制模块。M-ary number设为2即BPSK,相位偏移Phase offset取0,载波频率Carrier frequency取1000Hz。采样时间Inspf由输入信号速率决定,保持与前级一致。
AWGN Channel的配置影响仿真结果的可靠性。Mode下拉框里有Signal to noise ratio、Eb/N0和Es/N0三种模式。对扩频系统研究,用Eb/N0模式更合适,因为Eb/N0直接对应数字通信理论曲线的横轴,扩频增益对它不产生名义变化。换句话说,Eb/N0只反映每个信息比特的能量与噪声功率谱密度之比,而扩频增益通过带宽扩展降低实际干扰功率。既然要研究扩频增益和输出信噪比的关系,比较合理的做法是固定Eb/N0,通过改变PN码速率来改变扩频增益,观察系统输出端的信噪比变化。
Input signal power参数根据扩频信号的实际功率设置。建议先用一个Scope观察调制器输出信号幅值,计算均方根后填入。常见的做法是填1W,前提是信号幅度归一化。AWGN Channel模块的随机种子参数(Random seed)也很关键,不改默认值34的情况下,每次仿真都会用同样的噪声序列,这对调试阶段是好事,便于对比不同扩频增益下的结果;而需要蒙特卡洛统计时,则要改为randi函数生成随机种子,或者直接接受多次运行的结果平均。
提示:Simulink里模型仿真时间和采样周期要协调。信源码元周期0.01s,仿真时长至少设5s,才能输出500个信息比特,误码率统计才有意义。若需要误码率低于10^-3量级,至少仿真10000个比特,此时仿真时长要拉到100s以上,可以通过调整仿真加速模式来换取时间。
3.4 解扩与判决模块的搭建
接收端的解扩和判决模块是最容易出错的地方。解扩乘法器和扩频乘法器结构一样,把接收信号与本地PN码相乘即可。关键是本地PN码的同步时延。实际通信系统里,接收端需要通过同步电路估计发射端PN码的相位偏移,然后调整本地PN码的起始时刻。在Simulink仿真里,通常假设理想同步,即从模型启动时刻就对齐,PN序列发生器的初态与发射端一致。
Relay模块代替理论上的积分判决器。设置Switch on point为0.0,Switch off point为0.0,输出端正负阈值都为0。当输入大于0输出1,小于0输出-1,实现符号判决。但Relay的输出是±1,而误码率统计的Error Rate Calculation模块通常接收0/1逻辑值,所以Relay后面的信号还得再过一个Gain=0.5,Bias=0.5的组合,把±1映像回1/0。整套链路:解扩输出→积分/?判决→电平转换→误码率比对。
更加严谨的做法是配上Integrator模块做码元积分。解扩后的信号在一个信息码元内累加,累加结果送到Relay判决。这样更贴近理论模型:相关接收机输出端的信噪比提升来自累加过程把各个码片的信号能量相干叠加,而噪声是非相干叠加,处理增益在这一步体现得最直观。
4. 仿真结果分析与扩频增益对信噪比的影响验证
4.1 运行结果波形判读
模型搭建完成后,在Scope模块上观察四个关键节点:信源输出、扩频后信号、调制输出、解扩后信号。信源波形是周期为0.01s的矩形脉冲序列;扩频后信号的跳变速率明显变快,单个信息码元内有10个PN码片跳变;调制输出是相位在0和π之间跳变的BPSK载波;解扩后信号又恢复成宽脉冲序列。
一个值得留意的现象是,解扩后信号波形并不完全等同于信源波形。原因是AWGN信道引入了噪声,即使解扩处理把大部分噪声扩展出信号频带,残存的噪声仍然会使波形边缘出现毛刺。如果Relay判决阈值设置得不好,例如阈值大于0导致小幅正噪声被判为负,就会产生误码。这就是为什么理论判决阈值是0而不要调整的原因。
display显示的误码率值,可以用于定量验证。假设设置AWGN信道的Eb/N0为5dB,扩频增益10,理论上BPSK在5dB时的误码率约为1.2×10^-3量级。如果display显示的误码率明显偏离这个量级,需要优先检查解扩用的PN码和发射端PN码是否同步。常见错误是把PN Sequence Generator的Initial states改为随机数导致接收端本地码相位不匹配,此时约一半的比特会被判错。
4.2 保持相同误码率时扩频增益与输出信噪比的关系
为了复现毕业设计里的结论,需要设计一个对照实验。固定信息速率不变,分别设置扩频增益Gp为7、15、31,再分别调节AWGN信道的Eb/N0,使系统误码率保持在相同的目标值,例如10^-3附近。记录每次达到该误码率时,解扩后信号输出端的信噪比。
随着Gp增大,达到相同误码率所需的Eb/N0会下降。换成输出信噪比来看,相同误码率下,Gp越大,输出端信噪比越高。这个现象的理论解释是:更大扩频增益意味着更宽的信号带宽,在接收端相关处理中能收集的信号能量更多,噪声经过解扩后功率被摊薄,于是系统抗干扰能力更强。
可以写一个简单的参数扫描脚本来完成这组实验:
% 扫描扩频增益与输出信噪比的关系 gp_list = [7, 15, 31]; fori = 1:length(gp_list) gp = gp_list(i); % 计算扩频码片速率和信息速率的关系 % 在Simulink中通过set_param修改PN Sequence Generator的Sample time % 例如:码片周期 = 信息码元周期 / gp fprintf('当前扩频增益: %d dB\n', 10*log10(gp)); end脚本中核心的Simulink控制逻辑是嵌套在注释里的两条关键命令:set_param('模型名/PN Sequence Generator', 'SampleTime', num2str(Tb/gp)),用于动态修改PN模块采样周期;sim('模型名')用于执行仿真。仿真结束后从workspace读取误码率,判断是否需要调整Eb/N0继续迭代。
4.3 仿真中的抗干扰性能观察
在Simulink模型中加入Single-Tone干扰源,比如用Sine Wave模块产生一个频率落在扩频信号带宽内的强单音干扰,叠加到接收信号上,观察误码率变化。窄带系统遇到这种干扰时会大幅恶化,而扩频系统因为干扰在解扩时被扩展到整个扩频带宽上,经过窄带滤波器后干扰功率只剩下1/Gp。这正好对应毕业论文提到的结论:扩频系统能在负信噪比下工作,依靠的是处理增益支撑的抗干扰容限M_j = Gp - (S/N)_out - L_s,其中L_s是系统损耗。
这个实验也给论文提供了很好的实测数据:未加扩频的BPSK链路在干扰/信号比为10dB时误码率超过10^-1,而扩频增益31的系统在同等条件下误码率仍在10^-3量级。这一对比放在毕业论文的结果分析一章,比单纯抛公式有说服力得多。
5. 仿真加速与从单点仿真到曲线扫描的工程技巧
5.1 加速长仿真的三组设置
当误码率目标为10^-4以下时,需要的比特数超过40000个,此时仿真时间会明显拉长。Simulink默认的变步长求解器在通信系统仿真里效率偏低,建议手动调整。
首先将仿真求解器改为固定步长discrete,步长取PN码片周期的1/20左右。其次在模型配置参数里勾选代码生成加速模式,Simulink把模型编译成C代码执行,比解释执行的速度提升一个量级。第三,关掉不必要的数据记录。Scope模块、To Workspace模块的面积大,频繁写内存会拖慢仿真。建议只保留Monitor,或者用To Workspace手工抽取需要分析的信号。
使用加速模式时有一处容易踩坑:模型内所有模块必须支持代码生成。比如用于可视化的Scope不会参与,不确定时先点击模型配置里的检查模型兼容性,提前排查掉不支持的模块。仿真完成后注意清空workspace的中间变量,避免大数组累积拖慢后续迭代。
5.2 误码率曲线扫描的自动化脚本
单次仿真只能得到一个工作点的误码率,毕业论文需要的是误码率曲线。曲线横轴是Eb/N0,纵轴是误码率。写自动化脚本时,外层循环遍历Eb/N0,内层循环做多次蒙特卡洛仿真取平均,每次随机化AWGN种子。
% 自动扫描误码率曲线 ebn0_list = 0:2:12; ber_out = zeros(size(ebn0_list)); for k = 1:length(ebn0_list) ebn0 = ebn0_list(k); % 修改AWGN信道的Eb/N0值 set_param('dsss_model/AWGN Channel', 'EbN0', num2str(ebn0)); % 运行模型,读取误码率结果 simOut = sim('dsss_model', 'StopTime', '10'); ber_out(k) = mean(simOut.get('BER')); end semilogy(ebn0_list, ber_out, 'o-'); grid on; xlabel('Eb/N0 (dB)'); ylabel('误码率');脚本里需要注意的细节是,Simulink模型的输入输出变量格式会因版本不同而有差异。新版Simulink推荐用SimulationOutput对象接收结果,通过simOut.get('变量名')取出数据。如果模型里Error Rate Calculation模块的输入端接了Display,数据默认不写入workspace,需要手动加一个To Workspace模块或者用simOut的日志功能。误码率统计模块输出的第一个元素是总误码数,第二个元素是总比特数,实际误码率用这两个值相除得到,而不是直接读Display上的数字。
5.3 从Simulink回到m脚本的双轨验证
Simulink模型调试完毕后,我还建议把同样的链路用m脚本实现一遍,做双轨验证。因为Simulink模型里有许多隐藏的模块延迟,比如Rate Transition模块、滤波器的群延迟,这些延迟在误码率模型中可能造成几个比特的偏移,导致Error Rate Calculation的比对出现假误码。而m脚本的链路完全由自己控制延迟,更不容易出现这类系统误差。
具体做法是:Simulink模型和m脚本使用完全相同的PN码、相同的信息序列,信道噪声用相同随机种子的randn生成。对比两边的误码率曲线,理论上应该重合。如果Simulink曲线整体右移或左移3dB以上,优先怀疑信号功率设置有误,比如Input signal power填了信号平均功率的一半值,导致实际SNR偏移3dB。这种细节判断在答辩时也能体现工程素养。
最终的交付物,建议包含三样东西:完整的Simulink模型文件、m脚本版的扩频通信仿真、自动绘制误码率曲线的分析脚本。这样论文里的每一个仿真图都能溯源到具体的配置参数,评审问起来也能快速定位问题。需要的话,还可以在m脚本里加入BPSK理论误码率曲线ber = 0.5*erfc(sqrt(10.^(Ebn0/10)))作为对照,让仿真结果和理论值之间的偏差一目了然。
本文还有配套的精品资源,点击获取