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

资讯详情

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

多用户OFDM-DCSK频率选择性衰落信道下的功率分配

多用户OFDM-DCSK频率选择性衰落信道下的功率分配 简介频率选择性衰落信道中多用户OFDM-DCSK系统的功率分配Matlab代码包面向通信工程、电子信息、数学等专业学生适用于课程设计、期末大作业及毕业设计。代码采用参数化编程思路清晰、注释详细提供完整算法实现与案例数据可直接运行便于深入理解多用户OFDM-DCSK系统在频率选择性衰落信道下的功率分配策略及其对误码率的影响。压缩包共11个文件以10个.m脚本为核心覆盖单用户与多用户对比、用户数变化、迭代次数调节等典型场景另附1张png原理示意图辅助理解整体仅35KB轻量精简使用方便。目前已有140人学习下载适合希望快速复现实验并进一步拓展研究的读者。通过运行这些脚本可以直观掌握功率分配算法流程学会利用Matlab搭建通信系统仿真平台并以此为基础开展性能优化与算法改进工作。1. 频率选择性衰落信道里多用户 OFDM-DCSK 系统为什么要做功率分配OFDM-DCSK 把差分混沌键控DCSK的扩频抗噪能力和 OFDM 的抗多径能力拼在一起代价是功率效率天生不高。每个符号要传一段参考混沌序列一半发射能量花在“校准”而不是“数据”上。再叠加频率选择性衰落后OFDM 各子载波增益可能相差 15~20 dB若按等功率发射落在深衰落子载波上的用户 BER 会直接崩到不可用而资源竞争场景下把所有功率都堆给信道好的用户又会让边缘用户完全失联。多用户 OFDM-DCSK 的功率分配就是在总功率约束下决定每个用户在每个子载波上分到多少能量让系统吞吐和用户公平性同时可接受。做物理层资源分配、混沌通信或索引调制方向的研究生和工程师都需要自己搭这套仿真链路。2. 多用户 OFDM-DCSK 的系统模型与频率选择性信道构建2.1 频率选择性衰落信道如何转化为 OFDM 子载波增益频率选择性衰落的本质是多径时延扩展超过了符号周期不同路径在频域形成周期性的相消干涉。OFDM 的做法是把宽带信道切成一族窄带子信道只要子载波带宽小于相干带宽每个子载波上的信道就是平坦衰落。仿真中一般用等效基带多径模型h(t) \sum_{l0}^{L-1} a_l \cdot \delta(t - \tau_l)其中 $a_l$ 是第 $l$ 条径的复增益$\tau_l$ 是相对时延。每条径的幅度按 Rayleigh 分布建模平均功率由功率延迟谱PDP给出。对 $h(t)$ 做 $N$ 点 FFT就得到 $N$ 个子载波上的频域响应 $H_k$。典型参数如表参数典型取值说明子载波数 $N$64 / 128决定频域分辨率多径数 $L$4 ~ 8超过循环前缀长度会引入 ICI时延 $\tau_l$0, 1, 2, 3采样点需小于循环前缀长度径功率dB0, -2, -3, -5依指数衰减循环前缀长度$N/4$覆盖最大时延每径系数生成时实部虚部独立同分布高斯均值为零方差取对应径功率的一半保证每径平均功率等于 PDP 设定值。以下代码生成一个用户在一帧内的频域信道响应function H gen_rayleigh_channel(N, delays, pow_dB) % N : 子载波数 % delays : 多径时延单位采样点 % pow_dB : 每径平均功率单位 dB L length(delays); pow_lin 10.^(pow_dB/10); % dB - 线性域 h_t zeros(1, max(delays)1); for l 1:L h_t(delays(l)1) sqrt(pow_lin(l)/2) * (randn(1,1) 1i*randn(1,1)); end H fft(h_t, N); % 时域抽头 - 频域响应 endrandn每次调用生成实部虚部各一个独立高斯变量功率为 $\sigma_r^2 \sigma_i^2 2 \cdot (pow/2) pow$。fft将时域抽头响应急变换到子载波域得到的就是平坦衰落子信道增益。注意每个用户要独立调用该函数因为不同用户的信道实现相互独立。2.2 DCSK 调制在 OFDM 子载波上的映射与相关解调DCSK 的基本思想是用一段混沌序列作为参考再用另一段承载比特信息。发送端对第 $b$ 个比特先发出长度为 $\beta$ 的混沌参考序列 $c$信息段则根据比特取 $c$ 或 $-c$。接收端不做信道估计直接计算两段的相关值正负判决。OFDM-DCSK 的常见实现是把参考序列和信息序列放在不同子载波上第 $k$ 个子载波放参考段第 $kK_0$ 个子载波放信息段。混沌序列长度 $\beta$ 等于 OFDM 符号的调制符号数即一个 OFDM 符号内放 $\beta$ 个混沌码片。发射结构按“用户→子载波组→DCSK 映射”组织每个用户分配一组子载波组内一半传参考、一半传数据。以下代码生成混沌序列并完成一个用户的一帧 DCSK 子载波映射function [sym_ref, sym_data] dcsk_map(bits, beta, chaos_seq) % bits : 二进制比特流长度 子载波数据位 % beta : 混沌序列长度须等于 OFDM 符号调制符号数 % chaos_seq : 预生成的混沌参考序列长度 beta info_seq 2 * bits - 1; % 0/1 - -1/1 sym_ref chaos_seq; % 参考段不调制信息 sym_data info_seq .* chaos_seq; % 信息段±混沌参考 endinfo_seq将比特映射为双极性符号。参考段原样放在参考子载波上信息段做了符号加权解调时把接收信息和接收参考做相关结果大于零判为 1否则判为 0。这个设计绕开了信道估计但代价是参考段浪费了一半子载波资源也正因如此功率分配在 DCSK 系统里比传统相干 OFDM 更敏感——参考段和数据段分开落在不同信道增益的子载波上时相关输出的噪声方差会变大。子载波增益差越大这种性能损失越显著这正是功率分配要介入的地方。2.3 多用户功率分配问题的目标函数与约束形式假设系统有 $U$ 个用户$N$ 个子载波用户 $u$ 在子载波 $k$ 上的信道增益为 $H_{k,u}$分配功率 $P_{k,u}$。系统总功率受限$\sum_{k,u} P_{k,u} \le P_{tot}$。每个用户的速率近似为R_u \sum_{k \in S_u} \frac{1}{N} \log_2(1 \frac{|H_{k,u}|^2 P_{k,u}}{N_0 \cdot \beta})其中 $S_u$ 是用户 $u$ 占用的子载波集合$N_0$ 是噪声功率谱密度$\beta$ 是混沌序列长度带来的扩频损失每个比特占用 $\beta$ 个码片。这个表达式与经典注水问题形式一致但多用户叠加后变成多变量耦合优化。常用目标有两种最大化总吞吐 $\sum R_u$或保证公平性如最大最小公平、比例公平。总吞吐最大化的解往往把功率集中到信道最好的用户边缘用户被饿死频率选择性信道加剧了这种倾向。这里采用比例公平目标\max \sum_u \alpha_u \log R_u s.t. \sum_{k,u} P_{k,u} \le P_{tot}, \quad P_{k,u} \ge 0其中 $\alpha_u$ 是用户权重。引入 $\log$ 后低速率用户获得更高的边际收益权重迭代注水时会让渡更多功率给弱用户。该问题非凸但固定子载波分配后可通过逐用户注水配合总功率外层循环逼近驻点。3. 功率分配算法从等功率基线到比例公平迭代注水3.1 等功率分配是性能基线而不是最优解等功率分配把所有子载波、所有用户视为同等重要每个子载波分到 $P_{tot}/N$。实现最简单且在多径时延较小、各子载波增益趋同时接近最优。但在频率选择性衰落严重的场景深衰落子载波上的用户信噪比可能低到无法正确解调等功率分配会导致 BER 曲线出现明显的“地板效应”功率再增加低增益用户依旧错一片。P_{k,u}^{equal} P_{tot} / N, \forall k,u这个解只满足功率约束不考虑信道状态也不存在任何优化过程。在没有信道反馈的盲系统中等功率是唯一选择但 OFDM-DCSK 只要在接收端做一次信道估计并反馈给发送端就能获得明显增益。因此等功率只配做下界基准用来评估功率分配算法的相对提升。3.2 单用户注水算法的推导与多用户扩展的失效点单用户场景下目标是在 $N$ 个子载波间分配功率最大化总速率。用拉格朗日乘子法求解得到经典注水解P_k (\mu - \frac{N_0 \beta}{|H_k|^2})^{}其中 $\mu$ 是水位由总功率约束 $\sum P_k P_{tot}$ 决定$(x)^{}\max(x,0)$。物理含义信道增益高的子载波分配更多功率增益低于水位的子载波直接不给功率。实现时先假设所有子载波都参与注水然后迭代去掉负功率项直到所有非零功率子载波满足约束。多用户场景下直接对每个用户做单用户注水不可行因为各用户共享总功率池一个用户提高水位会挤压其他用户的可用功率。常见错误是逐个用户顺序注水这会让先分配的用户抢占优质子载波后分配用户拿到的是被“挑剩”的信道公平性和总吞吐都劣化。多用户功率分配必须把所有用户放在同一个优化问题里同时求解。3.3 比例公平迭代注水的实现步骤采用经典的多用户迭代注水外层循环更新总功率约束对应的拉格朗日乘子内层循环对每个用户执行单用户注水。结合比例公平目标迭代式写作P_{k,u}^{(t1)} \left( \frac{\alpha_u}{\lambda^{(t)}} - \frac{N_0 \beta}{|H_{k,u}|^2} \right)^{}每次迭代后更新 $\lambda$使总功率消耗逼近 $P_{tot}$。算法流程1. 初始化 P_{k,u} P_{tot}/N所有用户均分 2. 外层循环 t 1, 2, ... 计算当前总功率 P_sum \sum P_{k,u} 更新乘子 \lambda^{(t)} \lambda^{(t-1)} \eta * (P_sum - P_{tot}) 内层循环 u 1..U: 对用户 u 的所有子载波按上式更新 P_{k,u} 直到 |P_sum - P_{tot}| epsilon步长 $\eta$ 需要根据总功率量级调整一般取 $10^{-5}$ 到 $10^{-3}$ 量级取值过大导致功率在约束边界震荡过小收敛缓慢。下面的 MATLAB 代码实现了这个迭代过程function P fair_iterative_waterfilling(H, P_tot, N0, beta, alpha, max_iter, eta) % H : 各用户在各子载波上的信道增益矩阵维度 N x U % P_tot : 系统总功率 % N0 : 噪声功率谱密度 % beta : 混沌序列长度 % alpha : 用户权重向量长度 U % max_iter / eta : 迭代次数与步长 [N, U] size(H); P ones(N, U) * P_tot / N; % 等功率初始化 lambda eta * P_tot; % 初始乘子 for iter 1:max_iter for u 1:U gamma abs(H(:,u)).^2 / (N0 * beta); P(:,u) max(0, alpha(u) / lambda - 1 ./ gamma); end P_sum sum(P, all); lambda lambda eta * (P_sum - P_tot); lambda max(lambda, 1e-12); % 防止除零 if abs(P_sum - P_tot) 1e-6 break; end end end内层更新用向量化运算一次算完单个用户所有子载波。gamma是归一化信噪比物理含义是单位功率下的子载波质量。alpha(u)/lambda是当前水位增益低于水位的子载波被截断为零。外层乘子修正项带(P_sum - P_tot)符号总功率超了就提高水位门槛砍掉低增益子载波总功率不足则降低门槛释放更多子载波。max操作保证功率非负lambda下限避免高增益子载波被误伤。该算法每轮迭代复杂度 $O(UN)$远低于用 CVX 做凸优化的开销。对于 128 子载波、4 用户的仿真规模千次迭代在普通 PC 上毫秒级完成可直接嵌入蒙特卡洛循环。4. MATLAB 实现信道生成、调制映射与功率分配代码4.1 生成多径 Rayleigh 信道频域响应仿真开始时先统一设置随机种子保证每次跑出的信道实现和 BER 曲线可复现。对一个用户生成信道后还要按用户独立生成多套信道实现供蒙特卡洛循环使用。以下函数生成一帧内所有用户的频域信道function H_all generate_all_channels(N, U, delays, pow_dB) % 生成 U 个用户的频域信道响应矩阵 N x U H_all zeros(N, U); for u 1:U H_all(:,u) gen_rayleigh_channel(N, delays, pow_dB); end end信道参数可以按上一章的典型值提前配好N 128; U 4; delays [0 1 2 3]; pow_dB [0 -2 -3 -5]; H_all generate_all_channels(N, U, delays, pow_dB);该步只生成频域响应不生成时域信号OFDM 的 IFFT、加循环前缀在调制阶段再做。信道响应的幅度谱会呈现明显的频率选择性某些子载波增益接近 0 dB另一些跌到 -15 dB 以下这部分差异正是功率分配算法发挥作用的舞台。4.2 OFDM-DCSK 的调制映射与混沌序列生成混沌序列用 Logistic 映射产生function chaos gen_chaos(beta, seed) % beta : 序列长度 % seed : 混沌映射初始值取 0~1 之间 x seed; chaos zeros(1, beta); for n 1:beta x 1 - 2 * x^2; % 改进型 Logistic 映射 chaos(n) x; end end1 - 2*x^2产生的序列在 [-1, 1] 之间均匀分布均值为零自相关接近理想。每个用户需要预生成一组长度为beta的混沌序列作为该用户所有 OFDM 符号的参考跨用户使用不同混沌序列可以等效为一种码分多址接入。OFDM-DCSK 子载波映射按用户分配子载波段每段内一半放参考、一半放数据。以 128 子载波、4 用户为例每用户分到 32 个子载波其中 16 个参考子载波、16 个数据子载波。映射代码如下function tx_sym map_users_to_subcarriers(bits_per_user, chaos_per_user, N, U) % bits_per_user : U x beta/2 的比特矩阵 % chaos_per_user: U x beta 的混沌参考矩阵 tx_sym zeros(N, 1); subcarriers_per_user N / U; data_half subcarriers_per_user / 2; for u 1:U idx_ref (u-1)*subcarriers_per_user (1:data_half); idx_data idx_ref data_half; ref chaos_per_user(u, 1:data_half); % 取前一半做参考 bits bits_per_user(u, :); data (2*bits - 1) .* ref; % DCSK 信息段 tx_sym(idx_ref) ref; tx_sym(idx_data) data; end end参考段取用户混沌序列的前半段信息段在同一用户的同一混沌序列上调制比特这样收端做相关时参考码片与信息码片来自同一个序列相关峰不受码间干扰影响。每个用户只在自己的子载波段内放置符号其余子载波为零。注意数据子载波与参考子载波之间的频率间隔不能超过相干带宽否则两段信道响应差异过大会拖垮相关解调性能。4.3 多用户迭代注水功率分配的核心代码功率分配在频域进行对每个用户、每个子载波计算分配系数再乘到调制符号上P fair_iterative_waterfilling(H_all, P_tot, N0, beta, alpha, 1000, 1e-4); tx_sym_alloc tx_sym .* sqrt(P(:)); % 幅度加权功率与分配矩阵成正比sqrt(P)是因为信号幅度与功率呈平方关系。分配矩阵的每一行对应一个子载波每一列对应一个用户但需要注意map_users_to_subcarriers输出的tx_sym是逐子载波排列而P是按用户分组排列如果两者索引顺序不一致功率会被乘到错误的子载波上。一种稳妥做法是在映射函数内直接返回子载波到用户的映射向量再按映射向量做重排。功率分配的反馈问题也要在仿真中模拟发送端假设通过反馈链路拿到了H_all的完美信道信息。实际系统中DCSK 的解调不需要信道估计但功率分配需要所以接收端仍需在导频符号上做最小二乘信道估计再把量化后的信道增益反馈给发射端。4.4 收端解调与蒙特卡洛 BER 统计收端先做 FFT 解出频域符号再按参考子载波和数据子载波分组做相关解调function bits_hat dcsk_demod(rx_sym, N, U) % rx_sym : 收端频域符号长度 N subcarriers_per_user N / U; data_half subcarriers_per_user / 2; bits_hat zeros(U, data_half); for u 1:U idx_ref (u-1)*subcarriers_per_user (1:data_half); idx_data idx_ref data_half; ref rx_sym(idx_ref); data rx_sym(idx_data); corr real(data .* conj(ref)); % 逐码片相关 bits_hat(u,:) (sum(corr) 0); % 累加判决 end end相关判决时先对每个码片做共轭相乘再累加等价于计算参考段与信息段的互相关。由于参考段和数据段经过了不同的子载波信道理论分析中相关输出的有效信噪比是两段信噪比的调和平均值功率分配的目标之一就是让这两个子载波上的信噪比尽量接近避免一边过高一边过低。以下是一段完整的蒙特卡洛主循环骨架rng(2024); N 128; U 4; beta 16; P_tot 1.0; N0 1e-3; alpha ones(U,1); delays [0 1 2 3]; pow_dB [0 -2 -3 -5]; EbN0_dB 0:2:16; ber_equal zeros(size(EbN0_dB)); ber_alloc zeros(size(EbN0_dB)); for idx 1:length(EbN0_dB) EbN0 10^(EbN0_dB(idx)/10); N0 P_tot / (beta * log2(2) * EbN0); % 换算噪声功率 err_eq 0; err_al 0; total_bits 0; for frame 1:2000 H_all generate_all_channels(N, U, delays, pow_dB); bits_per_user randi([0 1], U, beta/2); chaos_per_user gen_chaos(beta, 0.3 frame*1e-6); tx_sym map_users_to_subcarriers(bits_per_user, chaos_per_user, N, U); % 等功率发射 tx_eq tx_sym / sqrt(N); % 注水功率分配发射 P fair_iterative_waterfilling(H_all, P_tot, N0, beta, alpha, 500, 1e-4); tx_al tx_sym .* sqrt(P(:)); % 过信道频域相乘 加噪 rx_eq H_all .* reshape(tx_eq, N, 1); rx_al H_all .* reshape(tx_al, N, 1); noise_eq sqrt(N0/2) * (randn(N,U) 1i*randn(N,U)); noise_al sqrt(N0/2) * (randn(N,U) 1i*randn(N,U)); rx_eq sum(rx_eq, 2) noise_eq(:,1); % 简化为单用户叠加 rx_al sum(rx_al, 2) noise_al(:,1); % 解调并统计误码此处省略按用户分组判决细节 end end简化循环里假设所有用户信号叠加在同一组子载波上实际多用户 OFDM 各用户占不同子载波应将每个用户的接收信号按各自子载波索引独立取出后解调。log2(2)是 BPSK 调制下的频谱效率换算若换 QPSK 需要相应调整。gen_chaos按帧重新初始化混沌序列模拟时变混沌码。5. 验证功率分配生效的三个观测点与仿真排错技巧5.1 判断分配是否生效功率分布、用户 BER 与公平性指数功率分配算法跑完第一件事不是看 BER 曲线而是检查分配矩阵本身是否合理。打印每个用户的平均功率和最高功率子载波位置figure; bar(mean(P, 2)); % 各用户平均功率可见弱用户是否获得更多补偿 xlabel(用户序号); ylabel(平均功率);若某个用户的平均功率显著高于其他用户说明该用户信道质量整体更好注水算法合理地把功率倾向给了它。但若某个用户所有子载波功率长期为零说明该用户信道环境太差比例公平权重没有起到保护作用。更严谨的验证是计算 Jain 公平性指数J \frac{(\sum R_u)^2}{U \cdot \sum R_u^2}$J$ 越接近 1用户间速率越均衡。等功率分配在强频率选择性信道下 $J$ 往往低于 0.8比例公平迭代注水一般能提升到 0.9 以上这是两个算法拉开差距的直接证据。BER 曲线对比时要分别统计每个用户的误码率而不是只画系统平均。系统平均可能掩盖“弱用户变好、强用户变差”的内部交换正确做法是把四个用户的 BER 画在同一张图上观察等功率分配下用户间 BER 散点是否分散超过一个数量级再对比注水分配后各用户 BER 是否收敛到同一区间。5.2 关键参数调节混沌序列长度、子载波数与多径延迟参数调大影响调小影响混沌序列长度 $\beta$扩频增益高BER 更好但速率下降功率分配的有效信噪比分母变大速率高但 DCSK 相关解调的噪声抑制能力弱子载波数 $N$频域分辨率细子载波增益差异体现更充分功率分配空间更大IFFT 规模小仿真更快但频率选择性描述粗糙多径时延扩展子载波间增益差变大注水增益更明显信道平坦等功率分配与注水差异缩小$\beta$ 对功率分配的影响最容易被忽略。$\beta$ 增大后每个比特等效能量被摊薄公式中的 $\beta$ 出现在分母$\gamma$ 变小注水水位整体抬升更多子载波进入分配集。仿真中若发现大量子载波功率被截断为零优先检查 $\beta$ 是否设得过大或P_tot相对N0是否过低。5.3 仿真最容易出错的三个位置第一功率归一化错误。IFFT 前的频域符号乘以sqrt(P)后时域信号平均功率不再等于P_tot因为 OFDM 符号的峰均比PAPR会抬高瞬时功率。仿真中要验证mean(abs(ifft(tx_sym)).^2)是否等于P_tot/N不一致时在 IFFT 后按实际功率重新缩放否则蒙特卡洛循环里的EbN0计算是错的。第二混沌序列跨用户复用。某些简化实现让所有用户共用同一段混沌参考这会导致用户间干扰在相关解调时无法区分。正确做法是每个用户独立生成序列且参考子载波与数据子载波取自同一序列的前后段不能混淆。第三注水迭代不收敛或震荡。常见原因是步长eta过大。调参时先跑一次不带噪声的功率分配打印每次迭代后的总功率如果呈现正弦振荡就把eta缩小一个数量级。lambda的初始值也影响收敛方向建议用P_tot / mean(alpha)估算初值量级。迭代中止条件除了总功率误差还应加上连续两次迭代的功率分配矩阵差不超过阈值避免在边界上反复跳动。验证功率分配是否真的有用最直接的办法是把同一组信道实现分别用等功率和注水分配各跑一遍 BER确保两次仿真使用完全相同的信道随机种子。若此时注水分配在高 SNR 区间仍无增益回查P是否被乘到了正确的子载波索引上——这个问题在按用户分组映射的实现中几乎必然出现一次。本文还有配套的精品资源点击获取
返回列表