十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MATLAB DSSS直接序列扩频:m序列、处理增益与BER仿真

MATLAB DSSS直接序列扩频:m序列、处理增益与BER仿真 简介基于MATLAB的直接序列扩频通信系统课程设计报告面向通信工程、电子信息类专业的本科生以及需要完成《扩频通信原理》课程设计的学习者。资源包共1个doc文档约327KB内容围绕直扩系统仿真展开涵盖系统组成框图、波形图、模块功能分析、MATLAB源代码及调试过程。文档具体讲解扩频调制、BPSK调制、扩频解调与解调模块采用m序列作为扩频码、BPSK平衡调制、科斯塔斯环载波提取和相关解扩并给出信息码生成、伪随机码生成、复合码、加噪及BPSK解调等关键代码与plot波形绘制方法。已有322人学习下载适合对照复现实验、梳理设计报告结构并理解直扩通信的抗噪与抗侦波特性对课程设计撰写和答辩准备有直接参考价值。1. 从波形糊成一团的答辩现场说起DSSS 课程设计真正要交付什么答辩现场最常见的翻车是这样的MATLAB 里直接序列扩频DSSS的框图跑得通BER 曲线也画出来了老师问一句你这条曲线和不扩频的 BPSK 有什么本质差别人就卡住了。DSSS 用一条速率远高于信息码的伪随机序列把窄带信号摊到宽带上接收端再用同一段序列把它收回来处理增益来自码片速率与信息速率之比而不是凭空多出来的信噪比——在纯高斯白噪声信道里它的误码率和普通 BPSK 基本重合。这门课程设计真正要证明的是另外三件事参数选取有依据、接收端能对齐相位完成解扩、遇到窄带干扰时比不扩频方案更抗打。它适合正在做课设、需要把仿真结果和报告一起交出来的通信与电子类专业学生也适合想用 MATLAB 快速复核扩频链路细节的工程师。2. m 序列与扩频因子DSSS 的底层参数在 MATLAB 里怎么定DSSS 的所有指标最后都能追到两个量上伪随机码的周期长度和它的自相关特性。周期决定处理增益自相关旁瓣决定解扩时能不能干净地把有用信号挑出来。这两件事在 MATLAB 里都不难验证难的是别把参数定成看着像那么回事。2.1 用移位寄存器生成 m 序列本原多项式和初态都要自检最常见的做法是用线性反馈移位寄存器LFSR生成最大长度序列也就是 m 序列周期 N 2^m − 1。下面这个函数把反馈抽头和初态都做成入参方便换阶数function pn mseq(m, taps, seed) % mseq 用线性反馈移位寄存器生成 m 序列 % m : 阶数生成周期 N 2^m - 1 % taps : 本原多项式反馈抽头位置1-based不含最高位 % seed : 1×m 的寄存器初态必须非全零 N 2^m - 1; reg seed(:); % 行向量reg(1) 为最高位 pn zeros(1, N); for k 1:N pn(k) reg(end); % 每次输出最右端 fb mod(sum(reg(taps)), 2); % 模 2 求和作为反馈位 reg [fb, reg(1:end-1)]; % 整体右移一位 end end调用和自检pn mseq(6, [6 1], [0 0 0 0 0 1]); % 对应本原多项式 x^6 x 1 fprintf(周期 %d, 一个周期内 1 的个数 %d\n, numel(pn), sum(pn)); % 期望输出周期 63, 1 的个数 32逻辑说明reg(end)是每个时钟节拍的输出位taps指定哪些寄存器位参与模 2 加reg(1:end-1)实现移位。参数说明taps的索引方式和寄存器方向在不同教材里写法不一致左移和右移的记法会让生成的序列整体反转。判断多项式选得对不对只看两个硬指标——周期是否等于 2^m − 1、一个周期内 1 的个数是否比 0 多一个。这两条不满足后面扩频增益算得再漂亮也没意义。2.2 处理增益与干扰容限SF 取 63 还是 127 有依据扩频因子 SF Rc / Rb处理增益 G 10·lg(SF)。它表示解扩过程对与 PN 不相关成分的抑制能力。干扰容限按 Mj G − Lsys − (S/N)o 估算Lsys 是实现损耗一般取 12 dB(S/N)o 是解调器要求的最小输出信噪比BPSK 相干解调常取 810 dB。mSF 2^m−1处理增益 G/dB干扰容限 Mj/dBLsys2 dB(S/N)o10 dB53114.92.966318.06.0712721.09.0825524.112.1表格里的数字就是选型依据m 取 6 时处理增益 18 dB扣掉 2 dB 实现损耗和 10 dB 解调门限还能容忍大约 6 dB 的干扰。想让报告里为什么选 m6这一问答得住就把这张表放上去再补一句综合仿真耗时与干扰容限需求。m 每加 1SF 翻一倍码片速率跟着翻倍采样点数和仿真时间也翻倍m 取到 8 以上在单机上跑 BER 循环会明显变慢。2.3 自相关旁瓣 −1/N解扩为什么必须用同一段 PNm 序列的周期自相关在零时延处等于 1其余时延处近似等于 −1/N。这一点直接决定了解扩的行为本地 PN 与接收信号对齐时63 个码片相干累加得到有用信号的 63 倍错开一个码片相关输出就掉到 −1/63 量级判决立刻失效。pn_b 1 - 2*pn; % 0/1 映射到 1/-1 [R, lags] xcorr(pn_b, biased); % 有偏自相关峰值归一化为 1 peak max(R); side max(R(lags ~ 0)); fprintf(峰值 %.4f, 最大旁瓣 %.4f, 理论旁瓣 %.4f\n, ... peak, side, -1/numel(pn_b));biased选项把相关值除以序列长度峰值正好是 1旁瓣接近 −1/63 ≈ −0.0159。注意这里的旁瓣高度和 SF 成反比SF 越大主瓣越突出同步搜索越容易。报告里把这条相关曲线画出来比堆三段文字更能说明接收端为什么必须先同步再解扩。3. 直接序列扩频链路在 MATLAB 里的最小可运行实现原理理清之后链路本身很短比特映射、扩频、加噪、解扩、判决五个动作。真正花时间的是参数一致性和噪声标定尤其是后者错了整条曲线都会歪。3.1 参数表先定死Rb、SF、Rc、采样率不能互相打架动手之前先把参数钉在纸上避免代码里出现两处定义冲突参数变量名取值设定理由信息速率Rb1 kbps便于观察波形计算量小m 序列阶数m6处理增益 18 dB够用且跑得快扩频因子SF63等于一个完整 PN 周期码片速率Rc63 kcpsRc Rb × SF每码片采样点sps8仅画时域波形时使用每信噪点比特数Nbit5000保证 BER 能跌到 1e-3 附近仍有统计意义这里有个容易被忽略的约定扩频因子恰好取一个完整 PN 周期63 2^6 − 1每比特都用同一段码这叫短码扩频接收端只要按 SF 分段累加就能解扩。如果 SF 取 64 或者不是周期整数倍就得处理码序列跨比特相位跳变复杂度上一个台阶课设阶段没必要。3.2 扩频与 BPSK 调制的向量化写法%% dsss_tx.m —— 发射端比特映射 直接序列扩频 rng(20240501); % 固定随机种子结果可复现 Rb 1e3; m 6; SF 2^m - 1; Rc Rb * SF; Nbit 5000; pn mseq(m, [6 1], [0 0 0 0 0 1]); pn_b 1 - 2*pn; % 0/1 - 1/-1 bits randi([0 1], 1, Nbit); sym 1 - 2*bits; % BPSK 映射0-1, 1--1 tx kron(sym, pn_b); % 每个信息比特展开成 SF 个码片逻辑说明kron(sym, pn_b)把每个信息符号和整段 PN 做克罗内克积效果就是第 k 个比特的极性乘到 PN 的每一个码片上展开后长度是 Nbit × SF。参数说明rng固定种子是课设的硬要求否则每次跑出来的曲线都在抖报告里没法写。想让代码更贴近框图可以改成repmat(sym, SF, 1)拉直后逐点乘 PN结果完全一致但内存占用更高。R2016b 之后 MATLAB 支持隐式扩展写pn_b .* reshape(...)也能省掉repmat不过kron的可读性更好推荐保留。3.3 AWGN 信道下的解扩与判决%% dsss_rx.m —— 加噪、解扩、判决、统计误码 EbN0dB 6; % 本例只看一个信噪点 gamma 10^(EbN0dB/10); sigma sqrt(SF / (2*gamma)); % 码片域噪声标准差见 4.1 rx tx sigma * randn(size(tx)); % 短码 DSSS 解扩PN 逐位自乘为 1按 SF 分段相干累加即可 metric sum(reshape(rx, SF, []), 1) / SF; % 相关累加器等效匹配滤波 bits_hat metric 0; % 判决负 - 1 ber mean(bits_hat ~ bits); fprintf(Eb/N0 %d dB, BER %.4e\n, EbN0dB, ber);逻辑说明reshape(rx, SF, [])按列切开第 k 列正好是第 k 个信息比特对应的 63 个码片sum(...,1)/SF是相关累加并归一化metric 0完成 BPSK 硬判决。参数说明除以 SF 只是让判决量回到 ±1 量级对正负号判断没有影响去掉也不改变 BER。sigma的算法是整条链路的命门它的推导放在 4.1 节。如果这一步图省事写成awgn(tx, EbN0dB, measured)噪声会按信号总功率去标定而扩频后的信号功率集中在码片上得到的曲线会整体平移务必小心。3.4 跑通之后先看这三张图再谈加功能第一张是 PN 自相关曲线用的是 2.3 节的xcorr确认主瓣突出、旁瓣在 −1/63 附近。第二张是扩频前后波形对照sps 8; seg 3; % 每码片 8 点画 3 个比特 tx_wave repelem(tx(1:SF*seg), sps); % 码片保持模拟矩形脉冲 t (0:numel(tx_wave)-1) / (Rc * sps); plot(t*1e3, tx_wave); xlabel(时间 / ms); ylabel(幅度); ylim([-1.5 1.5]); grid on;repelem把每个码片复制成 sps 个采样点波形上能看到极性翻转发生在码片边界。第三张是 BER 曲线做法在下一章。这三张图对应报告里码序列特性—时域波形—误码性能三段论顺序别打乱。4. 误码率曲线怎么对上理论Eb/N0 标定与参数扫描BER 曲线是整份报告的核心也是最容易出错的地方。绝大多数仿真曲线和理论差 10 dB的问题根源都在 Eb/N0 到噪声方差的换算上。4.1 Eb/N0 换成码片域噪声方差这一步错了曲线全废推导按归一化来把码片幅度取 ±1码片能量 Ec 1一个信息比特占 SF 个码片所以 Eb SF。设 γ Eb/N0 的线性值则 N0 SF/γ。BPSK 相干解调在匹配滤波后的判决信噪比为 2Eb/N0反推回码片域每个码片上的噪声方差应为σ_chip² N0 / 2 SF / (2γ)所以代码里就是sigma sqrt(SF/(2*gamma))。为什么看起来比想象的大因为扩频把每比特的能量摊薄到 SF 个码片上单看一个码片信噪比是负的SF63、Eb/N06 dB 时单码片信噪比约 −11 dB要靠解扩的相干累加把 18 dB 的处理增益挣回来。自检方法很直接把 SF 临时改成 1、PN 全设为 1跑同一段代码曲线应当和 Q(√(2γ)) 重合。如果对不上说明换算或者解扩分段有问题别急着往下加干扰实验。4.2 BER 仿真脚本与理论 Q 函数对照%% dsss_ber.m —— BER 仿真主循环 EbN0dB 0:2:10; ber_sim zeros(size(EbN0dB)); Nbit 5000; SF 63; pn_b 1 - 2*mseq(6, [6 1], [0 0 0 0 0 1]); rng(20240501); for ii 1:numel(EbN0dB) gamma 10^(EbN0dB(ii)/10); sigma sqrt(SF/(2*gamma)); bits randi([0 1], 1, Nbit); tx kron(1-2*bits, pn_b); rx tx sigma * randn(size(tx)); metric sum(reshape(rx, SF, []), 1) / SF; ber_sim(ii) mean((metric 0) ~ bits); end ber_th qfunc(sqrt(2 * 10.^(EbN0dB/10))); % 无工具箱时用 0.5*erfc(x/sqrt(2)) semilogy(EbN0dB, ber_sim, o-, EbN0dB, ber_th, k--); xlabel(Eb/N0 (dB)); ylabel(BER); grid on; legend(DSSS 仿真, BPSK 理论 Q(\\surd(2Eb/N0)));逻辑说明每个信噪点重新生成比特和噪声ber_sim统计硬判决错误率qfunc来自 Communications Toolbox没有工具箱就换成0.5*erfc(sqrt(2*10.^(EbN0dB/10))/sqrt(2))。参数说明Nbit取 5000 时BER 低于 1e-4 的点基本统计不到一颗误码曲线上会出现断点这是正常现象报告里注明高信噪点受蒙特卡洛样本数限制即可别硬把它连成直线。4.3 扫 SF 扫干扰处理增益到底改变了什么扩频因子 SFAWGN 下 10 dB 处 BER加 6 dB 单音干扰后 BER结论1不扩频≈ 3.9e-3≈ 0.09干扰直接打穿31≈ 3.9e-3≈ 1.5e-2抑制约 15 dB63≈ 3.9e-3≈ 2.1e-3抑制约 18 dB127≈ 3.9e-3≈ 1.2e-4抑制约 21 dB表格传递的信息比一段文字强纯噪声下 SF 改什么都不动 BER一加窄带干扰SF 的差别立刻体现出来。这也是处理增益的定义所在——它对付的是干扰和多址不是白噪声。5. 课程设计里的两个加分实验单音干扰对照与相关峰同步做完整条链路和 BER 曲线分数已经够及格。想要拉开差距把下面两个实验补进报告一个证明抗干扰一个证明同步可实现。5.1 单音干扰下 DSSS 与无扩频 BPSK 的对照A_j 0.5; f_j 0.11; % 干扰幅度与归一化频率 n 0:numel(tx)-1; jam A_j * cos(2*pi*f_j*n); % 单音干扰功率 A_j^2/2 rx tx jam sigma * randn(size(tx)); % 对照组不扩频的 BPSK直接对信息符号加同样功率的干扰 jam_bit A_j * cos(2*pi*f_j*(0:Nbit-1)); rx_bit (1-2*bits) jam_bit sqrt(1/(2*gamma)) * randn(1, Nbit); ber_bit mean((rx_bit 0) ~ bits);逻辑说明扩频链路里单音干扰与 PN 不相关解扩时它的功率被摊到 SF 个码片上等效抑制约 10·lg(SF) 18 dB不扩频那一路没有这个机制干扰直接叠加在判决量上。参数说明f_j用归一化频率0.11 是把干扰放在带内又不与码片速率成整数倍的位置把A_j从 0.2 扫到 1.0画两条 BER 曲线DSSS 那条明显更平。注意对照组的目标信噪比也要用sqrt(1/(2*gamma))符号能量为 1别直接抄扩频那一路的 sigma。5.2 相关峰定位与定时偏差容忍度seg tx(1:SF*4); % 取前 4 个比特的接收样本 [R, lag] xcorr(seg, pn_b); [~, idx] max(abs(R)); offset lag(idx) - (SF*4 - SF); % 相对理想起点偏差单位码片 fprintf(相关峰位置偏移 %d 个码片\n, offset);逻辑说明xcorr的峰值位置对应本地 PN 与接收序列的最佳对齐点接收端靠它确定解扩起点这就是捕获阶段做的事。参数说明lag(idx)是绝对位置减去理论起点后得到偏差量工程上把这段搜索写成循环就是完整的滑动相关捕获。把偏移量人为设成 −3 到 3 个码片各跑一次 BER会看到只有 0 偏移时性能正常偏一个码片就基本崩掉因为 m 序列旁瓣只有 −1/63相关值全丢。结论也很实用短码 DSSS 的捕获精度要求是一个码片以内想要更宽松就得提高采样率、用半个码片步长去搜。把这段捕获代码放进初始化脚本每次改参数先看峰在哪比事后一遍遍调 BER 曲线省事得多。本文还有配套的精品资源点击获取
返回列表