ARTICLE DETAIL

资讯详情

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

基于Matlab的码分复用仿真:正交码与误码率分析

基于Matlab的码分复用仿真:正交码与误码率分析 简介面向通信工程学生的一份课程设计文档围绕简单码分复用技术及其Matlab仿真展开讲解CDM/CDMA的基本原理、多址技术分类与仿真实现。文档从FDMA、TDMA、CDMA、SDMA四类多址方式入手比较不同接入技术的适用场景与频谱利用特点重点分析CDMA利用编码序列区分用户的机制、相干解调与非相干解调的实现差异以及抗干扰性强、保密性好、容量大等优势并说明其在CDMA2000、WCDMA等系统中的应用。仿真部分结合工程设计思路给出信号生成、信道建模、信号传输、接收端处理与性能评估的完整流程涉及扩频码选择与功率控制等参数优化并附有Matlab仿真结果与方案对比。资源为1个doc文件压缩包约613KB已有156人学习。文档按摘要、引言、复用技术、码分复用原理、Matlab仿真等章节编排适合通信相关专业本科生巩固CDMA理论也可为课程设计或毕业设计中的扩频通信仿真提供参考。1. 码分复用最容易让人迷惑的点恰恰值得用 Matlab 跑一遍码分复用CDM最反直觉的地方在于不同信号可以同时同频地混在同一条物理线路上接收端靠一串“暗号”把属于自己的信号捞出来。对做过无线通信的人来说这是 CDMA/WCDMA 的底层逻辑对刚接触通信仿真的人来说与其被公式绕晕不如在 Matlab 里跑通一个最小系统两路用户、两组正交扩频码、一次叠加、一次相关解扩最后画出误码率曲线。这篇就按这个最小系统展开先说明正交码为什么能分离信号再用 Matlab 搭出完整的发射-叠加-接收链路最后讨论码长、用户数和同步偏差这些参数怎么影响结果。适合想验证码分复用原理也需要一套可复现仿真模板的工程师和学生。2. 码分复用的数学基础正交码、相关解扩和用户分离2.1 从“同时同频还能分开”说起传统复用思路里频分复用把频率切成几段时分复用把时间切成几段接收端按频率或时间把信号切开。码分复用换了一个维度所有用户在同一时刻、同一频率上发送但每个用户用一个彼此“垂直”的码型携带信息。这里的“垂直”不是几何上的直观垂直而是向量内积为零。把一路信号看成一个向量另一路信号看成另一个向量。如果两向量内积为零接收端用其中一路的码型去和叠加信号做内积另一路的贡献会直接变成零只有自己能留下。这就是码分复用能成立的数学前提。2.2 用 Walsh 码生成一组正交扩频码通信里常用的正交码有很多种最简单的是一组由 Walsh-Hadamard 矩阵得到的行向量。Walsh 矩阵的每一行都是一个合法码型行与行之间两两正交并且行数是 2 的幂。Matlab 里可以自己写一个递归生成函数不依赖额外工具箱function H walsh_gen(m) % 生成 N 2^m 阶 Walsh-Hadamard 矩阵 % m 2 时得到 4 阶矩阵对应 4 个长度为 4 的正交码 H 1; for k 1:m H [H H; H -H]; % 递归扩展右上复制右下取反 end end这段代码从H 1开始每次把当前矩阵复制成四块右下角取反。新生成的矩阵行数翻倍行与行之间的正交性在数学上可以递归证明。以m 2为例得到的 4 阶矩阵是码编号码型与 1 号码的内积1[1 1 1 1]42[1 -1 1 -1]03[1 1 -1 -1]04[1 -1 -1 1]0从这个表能直观看到只要码型不同逐位相乘后相加的结果都是 0。这个性质是后面所有仿真成立的基础。2.3 相关解扩的运算本质发送端把每个比特变成一个码片序列。假设用户 1 的码是c1用户 2 的码是c2某时刻两个用户分别发送b1和b2到达接收端的干净信号是r b1 * c1 b2 * c2接收端要恢复用户 1 的数据就用c1和r做内积r · c1 b1 * (c1 · c1) b2 * (c1 · c2)由于c1 · c2 0后一项消失结果只留下b1 * (c1 · c1)。只要c1和自己的内积不为零就能判决出原始比特。这个过程叫相关解扩本质上是一个匹配滤波。实际仿真里常见做法是把码归一化每个码除以sqrt(N)让c1 · c1 1。这样相关解扩输出直接就是原始比特加噪声不需要再额外除一个N也方便和 BPSK 理论误码率对比。2.4 码分复用与直序扩频的关系码分复用和直接序列扩频其实是同一套机制。原始比特速率较低乘上一个高速码型后被展宽N倍每个比特变成了N个码片占用的带宽也相应变宽。区别只在于视角扩频强调单个信号抗干扰、抗截获码分复用强调多个正交信号共享同一信道。这里有一个容易误解的点扩频本身并不会提高 AWGN 信道下的误码率性能。理想同步、正交码理想正交时相关解扩把信号能量和噪声方差同比例压缩等效信噪比和未扩频的 BPSK 一样。这个结论可以直接用作仿真正确性的判据。3. 用 Matlab 搭一个最小码分复用仿真链路两用户一套代码3.1 给仿真先定好参数码长、用户数、信噪比仿真最忌讳一上来写长代码。先把参数定清楚再动手。下面这套参数是我做原理验证时常用的最小配置参数取值说明码长 N16Walsh 矩阵阶数为 4即有 16 个正交码用户数2只取前两行便于观察正交性每用户比特数20000保证误码率统计不跳得太厉害调制方式BPSK判决门限为 0统计简单信噪比定义用户级符号信噪比与 BPSK 理论误码率曲线可直接对比这里把码长定为 16而不是 4是为了让码片波形在叠加后看起来更明显也方便后面调整参数时看到差异。用户数只取 2是为了数学上干净两路正交信号叠加接收端的干扰应该严格为零。3.2 发射端比特转极性、扩频、多路叠加发射端代码可以分成三步产生随机比特、把比特 0/1 转成极性正负 1、用正交码扩频后叠加。rng(2024); % 固定随机种子保证结果可复现 N 16; % 码长 nUsers 2; % 用户数 nBits 20000; % 每用户比特数 H walsh_gen(log2(N)); codeSet H(1:nUsers, :) / sqrt(N); % 归一化正交码 bits randi([0 1], nUsers, nBits); bitsPolar 2 * bits - 1; % 0 - -11 - 1 tx zeros(nUsers, N * nBits); for u 1:nUsers tx(u, :) reshape(codeSet(u, :). * bitsPolar(u, :), 1, []); end txSum sum(tx, 1); % 两路信号在同一信道上叠加这段代码的关键在reshape展开方式。codeSet(u,:).是N x 1的码向量bitsPolar(u,:)是1 x nBits的比特行向量两者相乘得到一个N x nBits矩阵。矩阵第 j 列就是第 j 个比特对应的N个码片。按列展开成一行后物理含义就是“先发第 1 个比特的 16 个码片再发第 2 个比特的 16 个码片”。txSum是两路信号直接相加的结果。由于两个码型正交理想情况下相加后不会产生彼此干扰。实际信道里还要加高斯白噪声这一步放到接收端之前做。3.3 接收端按码片矩阵重排、相关判决、统计误码接收端先对整段接收波形做reshape再分别用每个用户的码做相关解扩。判决门限取 0因为发送的极性是正负 1。SNRdB 6; noiseVar 10^(-SNRdB / 10); % 噪声方差与归一化码长匹配 rx txSum sqrt(noiseVar) * randn(size(txSum)); chipSeq reshape(rx, N, nBits); % 每列对应一个比特的 N 个码片 recov zeros(nUsers, nBits); for u 1:nUsers recov(u, :) codeSet(u, :) * chipSeq; % 相关解扩 end bitsHat recov 0; ber mean(bitsHat(:) ~ bits(:)); fprintf(SNR %d dB, BER %.4f\n, SNRdB, ber);noiseVar 10^(-SNRdB/10)这一行需要特别说明一下。前面已经对码做了归一化每个符号的能量是 1所以噪声方差直接取10^(-SNR/10)就能让解扩输出端的符号级信噪比等于设定值。如果这里不归一化就要把噪声方差除以N否则信噪比口径会对不上。chipSeq的列顺序必须和发送端一致。发送端用reshape(..., 1, [])展开接收端用reshape(rx, N, [])还原Matlab 按列填充的方式刚好让每一列成为一个完整的码片块。这个逆操作在仿真里非常常用比用循环逐比特截取快。3.4 单次运行结果与可复现保证在 SNR 6 dB 下两用户正交且理想同步时码分复用不会引入多用户干扰误码率应该和单用户 BPSK 的理论值接近。理论值约Q(sqrt(2*4)) ≈ 0.0023运行上面代码通常会落在 0.002 到 0.003 之间差异来自有限比特数引起的统计波动。rng(2024)的作用是让每次运行得到同一组随机比特和同一组噪声。验证代码时建议先不开蒙特卡洛循环用单次运行确认收发链路没有维度错误再放进 SNR 循环里。4. 把仿真参数改起来码长、用户数、同步偏差如何影响误码率4.1 码长 N 不是越大越好先看正交性和带宽把N从 16 改成 8 或 32重复上一章仿真会发现误码率曲线基本不动。这印证了前面的结论AWGN 信道下码长不影响理想正交系统的误码率。那码长还有什么意义第一码长决定了最多能容纳多少正交用户。Walsh 矩阵是N x NN 越大可用正交码越多。第二码长决定扩频后的带宽。同样比特速率下N 变成两倍码片速率变成两倍占用带宽也跟着变宽。真实系统里码长往往由带宽、用户数和抗干扰需求共同决定不是越长越好。4.2 用户数超过正交码数量会发生什么N 阶 Walsh 矩阵最多提供 N 个正交码。用户数等于码长时“容量”刚好装满用户数小于码长时剩余空码可以留给待接入用户用户数超过码长理论上的正交性就被破坏了。想用 Matlab 观察这个现象最直接的方式是把第 3 章代码里的nUsers改成N 1然后从下一行取码。比如nUsers N 1; codeSet H(1:nUsers, :); % 运行时会报错索引超过矩阵行数这个报错本身就说明问题不是任意一组随机码都能当正交码用。真实系统中用户数超过正交码数量时必须用伪随机长码配合扰码来近似正交代价是多用户干扰不再为零误码率会出现地板效应。简单仿真里不需要走到这一步但理解这个边界很重要。4.3 同步偏移一两个码片正交性会立刻恶化码分复用的一个隐藏前提是接收端知道每个码片的起止位置。如果解扩窗口和发送端错开一个码片相关运算拿到的就不是原来的完整码型正交性会明显下降。常见做法是在接收端先做同步搜索而不是直接解扩。对单用户场景可以用匹配滤波或xcorr找峰值位置[acor, lags] xcorr(rx(1:4*N), fliplr(codeSet(1, :))); [~, idx] max(abs(acor)); bestLag lags(idx);这段代码把接收波形和本地码做滑动相关相关峰对应的延迟就是最佳同步点。多用户系统一般会为每个用户分别做同步搜索或者利用导频估计共同延迟。仿真里如果发现误码率高得离谱先别怀疑噪声检查同步是否对齐。4.4 信噪比口径不一致是所有仿真对不上理论的最大原因很多刚接触仿真的人会直接用awgn(rx, snr, measured)加噪声然后发现误码率曲线离理论值偏了几个 dB。问题不在扩频而在信噪比的定义awgn的 SNR 默认按整个信号的功率算两路用户叠加后总功率翻倍每个用户的等效信噪比就比设定值低 3 dB。加噪声方式SNR 含义对匹配 BER 曲线的影响awgn(txSum, snr, measured)叠加信号总功率 / 噪声功率多用户时每用户实际 SNR 偏低noiseVar 10^(-snr/10)归一化符号能量 / 噪声方差可直接对比单用户 BPSK 理论我在搭仿真时习惯用第二种方式。它把码的归一化、符号能量和噪声定义绑在一起省去很多换算。如果你确实想用awgn就要在统计误码率前手动换算回用户级 SNR并确认解扩输出端的噪声功率没有重复缩放。5. 验证仿真正确性的一个高效顺序从单用户 BPSK 曲线开始5.1 先用 nUsers1 验证扩频不影响理论误码率码分复用仿真最容易出问题的地方不在“复用”而在“链路”。如果扩频链路本身有 bug加第二个用户以后很难定位是噪声定义错了还是正交码错了。所以我的验证顺序是先把nUsers设成 1把仿真完全退化成“单用户 BPSK 扩频解扩”。单用户时误码率理论值可以直接用qfunc计算SNRdBs 0:2:10; theory qfunc(sqrt(10.^(SNRdBs / 10)));把仿真误码率和这条理论曲线画在同一张semilogy图上。如果两者吻合说明扩频、加噪、解扩、判决这四个环节都没有引入额外误差。如果曲线差几个 dB优先检查噪声方差和码归一化。5.2 再加多用户观察误码率是否保持重合单用户链路验证通过后把nUsers改成 2用同一套蒙特卡洛循环重新跑一遍。理想正交、理想同步、功率一致时两用户的误码率应该仍然贴着单用户 BPSK 理论曲线。出现任何偏差接下来直接查两路码的正交性是否被意外的偏移破坏。固定随机种子可以让“单用户”和“多用户”两次实验使用相同的噪声序列差异只来自多用户叠加项。这样对比更干净也更容易暴露码间干扰。5.3 固定随机种子与多次蒙特卡洛让对比更可信单次仿真的误码率波动在低比特数下很严重。20000 比特在 BER 为 0.001 时平均只有 20 个错误随机涨落可能超过 30%。常见做法是每个 SNR 点重复几十次取平均并把随机种子固定在外层循环入口rng(2024); for k 1:length(SNRdBs) nErr 0; for trial 1:50 % 重新生成比特、扩频、加噪、解扩 % nErr nErr sum(bitsHat(:) ~ bits(:)); end berSim(k) nErr / (nUsers * nBits * 50); end固定rng(2024)后每次运行得到的蒙特卡洛噪声序列完全一致曲线上的每一个点都能精确复现。真实工程项目里还会再加一个外层循环把不同随机种子下的结果画成置信区间但原理教学里没有这个必要。最后给你一个可以一直沿用的验证习惯先把代码改成单用户看扩频链路是否贴 BPSK 理论再改回多用户看正交码是否真正正交。这条路径能把码分复用仿真里八成以上的隐蔽问题挡在误码率曲线之前。本文还有配套的精品资源点击获取
返回列表