現(xiàn)全解析)
簡(jiǎn)介提供一套完整的MATLAB 5G-NOMA系統(tǒng)功率分配仿真環(huán)境適配MATLAB 2022a版本面向通信專業(yè)學(xué)生與工程師用于快速?gòu)?fù)現(xiàn)并評(píng)估單小區(qū)多用戶非正交多址系統(tǒng)的功率域資源分配性能。資源包共8個(gè)文件、約8.87MB包含帶逐行中文注釋的MATLAB主程序、演示完整操作流程的AVI操作錄像、輔助驗(yàn)證結(jié)果的仿真圖片以及txt/py等配置文件。核心計(jì)算邏輯基于標(biāo)準(zhǔn)香農(nóng)公式實(shí)現(xiàn)用戶容量Cf、Cnf、Cn及累積容量Ca等指標(biāo)可清晰看出功率分配策略對(duì)用戶速率與容量的影響并輸出SINR、用戶可達(dá)速率對(duì)比及功率系數(shù)影響分析。操作錄像還專門強(qiáng)調(diào)了工作目錄的正確設(shè)置避免路徑錯(cuò)誤導(dǎo)致變量未定義或數(shù)據(jù)加載失敗適合直接運(yùn)行并開展二次開發(fā)。壓縮包內(nèi)文件類型覆蓋主程序、操作錄屏、結(jié)果圖片與說(shuō)明文檔結(jié)構(gòu)清楚便于按需取用目前已有156人學(xué)習(xí)下載。1. 5G-NOMA功率分配仿真一個(gè)MATLAB資源包能幫你省下什么有段時(shí)間我在做5G-NOMA的鏈路級(jí)仿真項(xiàng)目X卡在功率分配模塊上整整兩周。當(dāng)時(shí)手頭有一堆參考論文但論文里那幾行優(yōu)化公式落到MATLAB代碼里各種對(duì)不上號(hào)——信道增益排序方向錯(cuò)了、SIC解調(diào)順序反了、功率歸一化漏了跑出來(lái)的誤碼率曲線簡(jiǎn)直沒(méi)法看。后來(lái)拿到一份帶中文注釋和操作錄像的MATLAB仿真資源包半天時(shí)間就把系統(tǒng)級(jí)平臺(tái)跑通了并且功率分配算法部分可以直接改參數(shù)做對(duì)照實(shí)驗(yàn)。這份資源的核心價(jià)值是它把NOMA系統(tǒng)建模、用戶配對(duì)、SIC解碼和功率分配算法的完整鏈路打包成可運(yùn)行的MATLAB工程每行關(guān)鍵代碼都有中文注釋還附帶操作錄像幫你對(duì)步驟。適合正在做5G通信方向畢業(yè)設(shè)計(jì)、課程設(shè)計(jì)或者想快速搭一個(gè)NOMA仿真平臺(tái)驗(yàn)證算法效果的人——你不用從零啃通信原理和MATLAB語(yǔ)法直接改參數(shù)、跑結(jié)果、看曲線就行。2. 功率域NOMA的工作機(jī)制疊加編碼、SIC解碼與功率分配的角色2.1 為什么NOMA能提升頻譜效率從正交到非正交的演進(jìn)邏輯傳統(tǒng)正交多址OMA系統(tǒng)里不同用戶占用不同的時(shí)頻資源塊互相不干擾但頻譜利用率天花板明顯——5G的eMBB場(chǎng)景要支撐海量連接和高吞吐正交資源劃分太奢侈了。NOMA的思路是讓多個(gè)用戶共享同一時(shí)頻資源塊在功率域或碼域上做區(qū)分接收端用干擾消除算法把信號(hào)一層層解出來(lái)。功率域NOMA是最主流、也最容易用MATLAB仿真驗(yàn)證的一種。它不需要復(fù)雜的碼本設(shè)計(jì)核心就兩件事發(fā)送端對(duì)不同用戶信號(hào)分配不同功率并疊加發(fā)射接收端按信道增益從強(qiáng)到弱依次做串行干擾消除SIC。由于信道好的用戶先解碼并消除其他用戶干擾信道差的用戶反而因?yàn)榉峙涔β矢叨菀妆5紫到y(tǒng)總吞吐量能比OMA提升30%~50%具體數(shù)值取決于信道條件和功率分配策略。在MATLAB里建模這個(gè)鏈路不算難但有兩個(gè)前提必須理清第一功率分配算法決定每個(gè)用戶的發(fā)射功率直接影響SIC的解碼門限第二用戶配對(duì)方式?jīng)Q定哪些用戶共享同一資源塊——通常是一個(gè)信道好的近用戶配一個(gè)信道差的遠(yuǎn)用戶這樣功率差大、SIC增益明顯。這兩點(diǎn)在仿真代碼里對(duì)應(yīng)兩個(gè)獨(dú)立的子函數(shù)后面第4章會(huì)具體展開。2.2 發(fā)送端功率疊加與接收端SIC解碼功率域NOMA的發(fā)送端假設(shè)同一子信道上兩個(gè)用戶u1和u2總發(fā)射功率為P功率分配系數(shù)分別為α1和α2α1α21那么發(fā)送信號(hào)為s sqrt(α1·P)·s1 sqrt(α2·P)·s2這里有個(gè)關(guān)鍵約定信道增益低的用戶分配更大的功率系數(shù)。原因是信道差的用戶信號(hào)弱如果功率也低SIC解碼時(shí)它的信號(hào)會(huì)被信道好的用戶信號(hào)完全淹沒(méi)。所以一般約定|h1|2 |h2|2 時(shí)α1 α2。也就是說(shuō)信道好的用戶拿小功率信道差的用戶拿大功率。接收端SIC解碼順序信道好的用戶u1先解碼把u2的信號(hào)當(dāng)作干擾直接解出自己的信號(hào)因?yàn)樽约旱男盘?hào)功率雖小但信道條件好等效信噪比能扛得住然后u1從接收信號(hào)中減去自己的信號(hào)分量剩下的就是u2的信號(hào)由于u2功率大u2在u1解碼完后的殘余信號(hào)里信噪比也很高能順利解出。MATLAB實(shí)現(xiàn)這個(gè)過(guò)程的偽代碼邏輯是% SIC解碼順序信道增益降序排列 [~, idx] sort(channel_gain, descend); % idx(1)是信道最好的用戶先解碼 for k 1:num_users % 計(jì)算當(dāng)前用戶信號(hào)在接收信號(hào)中的功率占比 % 解碼當(dāng)前用戶信號(hào) % 減去已解碼信號(hào)分量更新殘余接收信號(hào) end邏輯說(shuō)明這段代碼的核心是按信道增益排序后依次解碼。每個(gè)用戶解碼時(shí)把尚未解碼的用戶信號(hào)視為噪聲所以排序方向錯(cuò)了整個(gè)SIC鏈路就全亂了。參數(shù)說(shuō)明里channel_gain是各用戶的信道增益向量num_users是共享同一資源塊的用戶數(shù)一般取2或3超過(guò)3個(gè)用戶時(shí)SIC的誤差傳播會(huì)急劇放大仿真結(jié)果很難看。2.3 功率分配在NOMA中的核心地位功率分配策略直接決定NOMA系統(tǒng)的性能上限。固定功率分配FTPA實(shí)現(xiàn)簡(jiǎn)單但公平性差——信道好的用戶速率極高、信道差的用戶可能連最低速率都保不住。分?jǐn)?shù)階功率分配FTPA引入一個(gè)公平性因子在吞吐量和公平性之間折中。注水算法則是在總功率約束下最大化系統(tǒng)總速率但需要知道所有用戶的信道狀態(tài)信息計(jì)算復(fù)雜度高不適合實(shí)時(shí)場(chǎng)景。在MATLAB仿真里這三種策略對(duì)應(yīng)三條不同的功率分配曲線直接影響后面誤碼率、吞吐量、用戶速率均衡性三個(gè)指標(biāo)。很多初學(xué)者在跑仿真時(shí)為了省事直接用等功率分配α1α20.5結(jié)果SIC解碼出來(lái)的誤碼率跟OMA差不多然后得出“NOMA也沒(méi)什么優(yōu)勢(shì)”的錯(cuò)誤結(jié)論。實(shí)際上等功率分配在NOMA里是最差的選擇——功率差沒(méi)拉開SIC增益幾乎為零。所以功率分配這塊既不能為了追求吞吐量把功率全給信道差的用戶也不能為了公平性把功率平均分。我一般會(huì)在仿真參數(shù)表里同時(shí)定義總功率P、功率分配策略類型、以及策略對(duì)應(yīng)的關(guān)鍵參數(shù)比如FTPA的衰減因子這樣跑一個(gè)對(duì)照實(shí)驗(yàn)只需要改一行配置。3. MATLAB仿真框架搭建從系統(tǒng)參數(shù)到信道模型的分層設(shè)計(jì)3.1 頂層系統(tǒng)參數(shù)配置載波頻率、帶寬、用戶數(shù)與調(diào)制階數(shù)拿到這份資源包后第一步不是看代碼而是先改仿真參數(shù)。這套MATLAB工程的頂層參數(shù)集中在一個(gè)初始化腳本里包含載波頻率、系統(tǒng)帶寬、子載波數(shù)、用戶數(shù)、用戶配對(duì)方式、調(diào)制方式、信道類型、目標(biāo)誤碼率等。參數(shù)直接決定仿真運(yùn)行時(shí)間——我之前有次把子載波數(shù)設(shè)成2048、蒙特卡洛次數(shù)設(shè)成10000結(jié)果腳本跑了一整晚還沒(méi)結(jié)束。% 仿真系統(tǒng)參數(shù)配置 fc 2e9; % 載波頻率 2GHz5G FR1典型頻段 bw 20e6; % 系統(tǒng)帶寬 20MHz num_subcarriers 128; % 子載波數(shù)資源塊粒度 num_users_per_sub 2; % 每個(gè)子信道復(fù)用的用戶數(shù)NOMA配對(duì) total_power 46; % 基站總發(fā)射功率 dBm約40W noise_power -174 10*log10(bw) noise_figure; % 底噪功率 dBm mod_order 4; % QPSK調(diào)制高階調(diào)試驗(yàn)時(shí)可改16QAM num_mc_trials 1000; % 蒙特卡洛仿真次數(shù)調(diào)試時(shí)先設(shè)100邏輯說(shuō)明這段參數(shù)配置是整個(gè)仿真平臺(tái)的“總閘門”??偣β屎驮肼暪β识加昧薲Bm單位計(jì)算信噪比時(shí)直接相減即可不用來(lái)回轉(zhuǎn)換線性功率。注意noise_figure是接收機(jī)噪聲系數(shù)資源包里默認(rèn)設(shè)置為5dB實(shí)際仿真時(shí)可以按場(chǎng)景調(diào)整。參數(shù)說(shuō)明num_subcarriers決定頻域粒度資源包默認(rèn)128個(gè)子載波對(duì)應(yīng)一個(gè)20MHz帶寬下的基本資源塊配置num_users_per_sub設(shè)成2是最經(jīng)典的NOMA場(chǎng)景改成3或4時(shí)需要同步修改SIC解碼部分的循環(huán)邏輯資源包代碼已經(jīng)支持但復(fù)雜度會(huì)明顯上升。3.2 信道模型與用戶配對(duì)頻率選擇性信道與歸一化增益NOMA仿真里信道模型的選擇比OMA更敏感。因?yàn)镾IC解碼順序完全依賴信道增益排序如果信道模型太理想比如純AWGN所有用戶的信道增益接近相等功率分配拉開差距的效果就體現(xiàn)不出來(lái)仿真結(jié)果跟OMA幾乎沒(méi)區(qū)別。資源包默認(rèn)使用瑞利衰落信道模型并考慮路徑損耗——近用戶和遠(yuǎn)用戶的信道增益差異通過(guò)路徑損耗體現(xiàn)。% 瑞利衰落信道生成 路徑損耗 distance_near 100; % 近用戶距離基站 100m distance_far 500; % 遠(yuǎn)用戶距離基站 500m path_loss_exp 3.5; % 城區(qū)典型路徑損耗指數(shù) % 生成信道系數(shù)h 小尺度衰落 * sqrt(路徑損耗) h_near (randn(1,num_subcarriers) 1j*randn(1,num_subcarriers)) / sqrt(2); h_far (randn(1,num_subcarriers) 1j*randn(1,num_subcarriers)) / sqrt(2); pl_near 10^(-28/10) * distance_near^(-path_loss_exp); pl_far 10^(-28/10) * distance_far^(-path_loss_exp); h_near h_near .* sqrt(pl_near); h_far h_far .* sqrt(pl_far); % 計(jì)算歸一化信道增益用于用戶配對(duì)和SIC排序 gain_near abs(h_near).^2; gain_far abs(h_far).^2;邏輯說(shuō)明信道系數(shù)由單位方差復(fù)高斯隨機(jī)變量乘上路徑損耗的平方根得到這是OFDM系統(tǒng)仿真的標(biāo)準(zhǔn)做法。randn生成實(shí)部和虛部都服從標(biāo)準(zhǔn)正態(tài)分布除以sqrt(2)保證幅度期望為1。路徑損耗用對(duì)數(shù)距離模型L(dB) 28 10·n·log10(d)這里的28dB是1米參考距離處的路徑損耗n是路徑損耗指數(shù)。參數(shù)說(shuō)明distance_near和distance_far決定了兩個(gè)用戶之間的信道增益差這個(gè)差值直接影響NOMA功率分配的收益——差值太小比如100m和150mSIC增益有限差值太大比如100m和1000m遠(yuǎn)用戶即使分到最多功率也達(dá)不到最低速率門限。實(shí)際仿真中我會(huì)把遠(yuǎn)近用戶距離比控制在3~5倍效果最典型。3.3 代碼結(jié)構(gòu)設(shè)計(jì)主函數(shù)、算法子函數(shù)、統(tǒng)計(jì)輸出三層劃分這份資源包的工程結(jié)構(gòu)分三層跟我個(gè)人做仿真項(xiàng)目的習(xí)慣很一致。第一層是主腳本負(fù)責(zé)參數(shù)初始化、循環(huán)調(diào)度、匯總結(jié)果第二層是核心算法子函數(shù)包括用戶配對(duì)、功率分配、SIC解碼、誤碼率統(tǒng)計(jì)第三層是結(jié)果可視化腳本負(fù)責(zé)畫星座圖、誤碼率曲線、吞吐量柱狀圖。這樣分層的最大好處是換功率分配算法時(shí)只改第二層對(duì)應(yīng)的子函數(shù)其他代碼完全不動(dòng)。% 主腳本調(diào)用結(jié)構(gòu) % 1. 初始化參數(shù) config.m % 2. 生成信道并配對(duì)用戶 [user_pairs, channel_gain] pairing(channel_params) % 3. 功率分配 alpha power_allocation(strategy, channel_gain, power_params) % 4. 發(fā)送端疊加編碼 tx_signal superpose_signals(signal1, signal2, alpha) % 5. 經(jīng)過(guò)信道 rx_signal channel_transmit(tx_signal, h) % 6. 接收端SIC解碼 [rx_bit1, rx_bit2] sic_decode(rx_signal, h, alpha) % 7. 統(tǒng)計(jì)誤碼率和吞吐量 ber bit_error_rate(tx_bits, rx_bits)邏輯說(shuō)明這種調(diào)用鏈把NOMA收發(fā)流程拆成了7個(gè)步驟每步對(duì)應(yīng)一個(gè)獨(dú)立子函數(shù)。如果只想看功率分配的作用可以直接在步驟3打斷點(diǎn)檢查alpha功率分配系數(shù)在不同策略下的變化。參數(shù)說(shuō)明strategy參數(shù)支持equal等功率、ftp固定功率分配、frac分?jǐn)?shù)階功率分配、water注水算法在config.m里修改這個(gè)字符串變量就能切換算法不需要改其他代碼。這個(gè)設(shè)計(jì)對(duì)于做對(duì)照實(shí)驗(yàn)特別友好——同一套信道、同一組比特只換功率分配策略跑出來(lái)的性能差就是算法的真實(shí)差距。4. 功率分配算法實(shí)戰(zhàn)固定分配、分?jǐn)?shù)階分配與注水算法的代碼實(shí)現(xiàn)4.1 等功率分配與固定功率分配基準(zhǔn)線和最簡(jiǎn)單的分配方式等功率分配作為NOMA的“反面教材”基準(zhǔn)線在對(duì)照實(shí)驗(yàn)中必不可少。它的代碼最簡(jiǎn)單但跑出來(lái)的曲線能讓你直觀看到功率差對(duì)SIC的重要性。固定功率分配FTPA在此基礎(chǔ)上引入一個(gè)固定比例——信道好的用戶分小功率、信道差的用戶分大功率比例預(yù)先設(shè)定不隨信道變化。function alpha power_allocation_equal(P, num_users) % 等功率分配每個(gè)用戶分到相同功率 alpha ones(1, num_users) / num_users; end function alpha power_allocation_fixed(P, channel_gain, ratio) % 固定功率分配按預(yù)設(shè)比例分配信道差用戶拿更多功率 num_users length(channel_gain); alpha zeros(1, num_users); % 按信道增益降序排序增益從小到大對(duì)應(yīng)功率從大到小 [~, idx] sort(channel_gain, ascend); % 給信道最差的用戶分配 ratio 比例的功率 alpha(idx(1)) ratio; alpha(idx(2)) 1 - ratio; end邏輯說(shuō)明等功率分配里alpha全是0.5此時(shí)SIC解碼時(shí)用戶間干擾完全無(wú)法消除仿真出來(lái)的速率曲線和OMA幾乎重合。固定功率分配里ratio是信道差用戶的功率占比一般設(shè)0.7~0.9ratio越大信道差用戶的保護(hù)越強(qiáng)但信道好用戶的速率會(huì)明顯下降。參數(shù)說(shuō)明注意sort用ascend排序目的是讓idx(1)對(duì)應(yīng)信道增益最小的用戶即信道最差的用戶。很多初學(xué)者在這里會(huì)用錯(cuò)排序方向?qū)е鹿β史峙浣o了信道最好的人仿真結(jié)果直接反直覺(jué)。4.2 分?jǐn)?shù)階功率分配FTPA公平性因子的作用與代碼實(shí)現(xiàn)分?jǐn)?shù)階功率分配是目前論文和課題里最常用的策略它用一個(gè)公平性因子α_ftp控制功率分配的不均勻程度。當(dāng)α_ftp0時(shí)退化為等功率分配α_ftp1時(shí)功率與信道增益成反比極端不公平。通常取0.2~0.6之間兼顧系統(tǒng)吞吐量和用戶公平性。function alpha power_allocation_frac(P, channel_gain, alpha_ftp) % 分?jǐn)?shù)階功率分配alpha_i P * (1/gain_i)^alpha_ftp / sum(...) num_users length(channel_gain); numerator (1 ./ channel_gain).^alpha_ftp; denominator sum(numerator); alpha P * numerator / denominator; % 歸一化保證功率系數(shù)之和為1 alpha alpha / sum(alpha); end邏輯說(shuō)明核心公式是功率系數(shù)與信道增益的-α_ftp次冪成正比。信道增益小信道差的用戶其倒數(shù)的α_ftp次冪大分到的功率就多。α_ftp越大功率分配越傾斜。參數(shù)說(shuō)明alpha_ftp這個(gè)參數(shù)需要手動(dòng)調(diào)節(jié)在不同信道條件下最優(yōu)值不同。我一般會(huì)寫一個(gè)外層循環(huán)掃alpha_ftp從0.1到0.8畫出吞吐量和公平性隨alpha_ftp變化的曲線然后選取拐點(diǎn)處的值。這是資源包操作錄像里重點(diǎn)演示的操作——因?yàn)閍lpha_ftp不是越大越好超過(guò)0.6后信道好用戶的速率會(huì)急劇惡化系統(tǒng)總吞吐量反而下降。4.3 迭代注水算法總功率約束下最大化系統(tǒng)吞吐量注水算法是功率分配的性能上界它的思想是把更多的功率分配給信道條件好的子信道因?yàn)槟抢铩靶詢r(jià)比”最高。但在NOMA場(chǎng)景下注水算法要同時(shí)考慮SIC解碼的功率差約束不能完全按OMA的思路來(lái)做。function alpha power_allocation_water(P, channel_gain, noise, max_iter) % 迭代注水算法最大化系統(tǒng)總速率 % 初始化功率分配 num_users length(channel_gain); alpha P / num_users * ones(1, num_users); tolerance 1e-3; for iter 1:max_iter % 計(jì)算每個(gè)用戶的等效信噪比 sinr alpha .* P .* channel_gain / noise; % 注水水位1/lambda mean(1./sinr) water_level mean(1 ./ sinr); % 更新功率分配alpha_new max(0, water_level - 1./channel_gain*...) alpha_new max(0, water_level - noise ./ (P .* channel_gain)); % 歸一化 alpha_new P * alpha_new / sum(alpha_new); % 判斷收斂 if norm(alpha_new - alpha) tolerance break; end alpha alpha_new; end alpha alpha / sum(alpha); end邏輯說(shuō)明這是一個(gè)簡(jiǎn)化版的迭代注水實(shí)現(xiàn)。每次迭代先算當(dāng)前分配下的SINR再根據(jù)注水公式更新功率分配。max(0, ...)確保功率不為負(fù)歸一化保證總功率恒定。收斂判據(jù)是前后兩次迭代的功率分配向量差值的范數(shù)小于容差。參數(shù)說(shuō)明max_iter一般設(shè)50就到頭了實(shí)際仿真中10~20次迭代就能收斂。tolerance設(shè)1e-3夠用設(shè)太小1e-6會(huì)顯著增加迭代次數(shù)對(duì)結(jié)果精度幾乎沒(méi)幫助。另一個(gè)坑是噪聲歸一化——noise必須是線性功率值不能直接用dBm數(shù)值參與計(jì)算否則注水公式完全失效。值得注意的一點(diǎn)注水算法雖然總速率最高但它的功率分配結(jié)果可能不滿足SIC解碼的門限約束——尤其是信道好的用戶可能分配到極小的功率導(dǎo)致它第一層解碼就失敗。所以在工程實(shí)用中注水算法的結(jié)果通常只作為性能上界參考實(shí)際系統(tǒng)還是用FTPA多一些。這個(gè)資源包的對(duì)照實(shí)驗(yàn)里注水算法的總速率通常比FTPA高10%~15%但信道好用戶的誤碼率也可能比FTPA高一個(gè)量級(jí)。5. 調(diào)參與避坑指南初學(xué)者最常見(jiàn)的五個(gè)翻車現(xiàn)場(chǎng)5.1 翻車現(xiàn)場(chǎng)一SIC解碼順序用錯(cuò)方向信號(hào)全解錯(cuò)現(xiàn)象仿真出來(lái)的誤碼率接近0.5跟隨機(jī)猜差不多而且兩個(gè)用戶的誤碼率都很高。原因SIC解碼順序應(yīng)該按信道增益從高到低排列——信道好的先解碼。但很多初學(xué)者在排序時(shí)用了ascend導(dǎo)致信道差的用戶先去解碼它的信號(hào)功率大但信道增益差解出來(lái)全是錯(cuò)的錯(cuò)誤信號(hào)被減掉后反而把信道好用戶的信號(hào)也破壞了。解決在排序前加一行顯示當(dāng)前排序結(jié)果確認(rèn)是降序排列。代碼里統(tǒng)一用sort(channel_gain, descend)并且排序索引要同步傳遞給功率分配函數(shù)和SIC解碼函數(shù)保證兩邊用的是同一套順序。我曾經(jīng)在調(diào)試時(shí)發(fā)現(xiàn)功率分配用的是降序索引、SIC解碼用的是升序索引兩個(gè)函數(shù)各排各的結(jié)果惡劣到完全不能看。從那以后我每次都會(huì)在配對(duì)和SIC兩個(gè)函數(shù)入口各加一個(gè)assert檢查排序方向一致。5.2 翻車現(xiàn)場(chǎng)二功率歸一化漏做SIC解碼門限全亂現(xiàn)象仿真曲線整體偏移吞吐量看起來(lái)比理論值高出一大截——高得離譜明顯不合理。原因功率分配函數(shù)返回的α系數(shù)沒(méi)有除以總功率和導(dǎo)致疊加信號(hào)的總功率超過(guò)設(shè)定值P。在接收端SIC解碼門限是基于歸一化功率計(jì)算的實(shí)際功率偏大時(shí)等效信噪比被抬高誤碼率虛低、吞吐量虛高。解決在功率分配函數(shù)末尾統(tǒng)一加alpha alpha / sum(alpha)確保所有用戶的功率系數(shù)之和嚴(yán)格等于1。資源包代碼里每個(gè)功率分配函數(shù)都有這一行但如果你自己新寫了一個(gè)功率分配算法很容易忘記加。我一般會(huì)在主腳本里加一行assert(abs(sum(alpha) - 1) 1e-6)程序一運(yùn)行就自動(dòng)檢查省得事后對(duì)著錯(cuò)誤曲線瞎猜。5.3 翻車現(xiàn)場(chǎng)三注水算法不收斂迭代次數(shù)耗盡現(xiàn)象運(yùn)行注水算法時(shí)10次仿真里有幾次結(jié)果明顯異?!炒瓮掏铝刻貏e低功率分配系數(shù)出現(xiàn)負(fù)值或者大于1的情況。原因注水算法對(duì)初始值敏感尤其是信道增益動(dòng)態(tài)范圍很大時(shí)初始等功率分配可能讓某些用戶的SINR特別低導(dǎo)致注水水位計(jì)算偏離功率更新后出現(xiàn)震蕩不收斂。另外噪聲參數(shù)如果用了dBm值而不是線性值整個(gè)公式就錯(cuò)了。解決首先確認(rèn)noise參數(shù)是線性功率瓦特不是dBm。然后給注水算法加一個(gè)“穩(wěn)定化”處理——每次迭代的步長(zhǎng)乘以一個(gè)0.8的衰減因子防止功率更新在臨界點(diǎn)附近震蕩。最后把收斂容差適當(dāng)放大到1e-2因?yàn)樽⑺惴▽?duì)精度要求不高——功率系數(shù)差0.01對(duì)最終速率的貢獻(xiàn)可以忽略。如果還是不收斂檢查初值把等功率分配改成按信道增益反比分配能加速收斂。5.4 翻車現(xiàn)場(chǎng)四隨機(jī)信道不固定種子蒙特卡洛對(duì)比失真現(xiàn)象兩次運(yùn)行同一個(gè)仿真腳本結(jié)果差異巨大或者用兩套功率分配算法做對(duì)比一個(gè)比另一個(gè)高20%換一次運(yùn)行時(shí)差距變成5%結(jié)論完全不穩(wěn)定。原因MATLAB隨機(jī)數(shù)生成器沒(méi)固定種子。每次運(yùn)行生成不同的信道系數(shù)蒙特卡洛統(tǒng)計(jì)結(jié)果沒(méi)有可比性。更隱蔽的是不同功率分配算法內(nèi)部可能也調(diào)用了隨機(jī)數(shù)函數(shù)比如迭代算法里的隨機(jī)初始化導(dǎo)致算法間的對(duì)比混入了隨機(jī)因素。解決在主腳本最前面加rng(2024)固定隨機(jī)種子確保每次運(yùn)行的信道完全一致。如果要比較不同功率分配算法必須在同一批信道下逐個(gè)運(yùn)行算法然后對(duì)比結(jié)果。資源包的腳本設(shè)計(jì)已經(jīng)保證了這一點(diǎn)——信道生成在功率分配之前所以固定種子后所有算法跑的是同一批信道。我個(gè)人的習(xí)慣是固定三組不同種子分別跑看結(jié)論是否在三種信道條件下都成立這樣論文里的對(duì)比曲線更有說(shuō)服力。5.5 翻車現(xiàn)場(chǎng)五誤以為NOMA總優(yōu)于OMA不設(shè)公平性約束現(xiàn)象仿真發(fā)現(xiàn)NOMA總速率比OMA高但其中一個(gè)用戶的速率還不如OMA甚至低了一半以上。如果只看總速率指標(biāo)這個(gè)結(jié)果看似不錯(cuò)但實(shí)際系統(tǒng)里這個(gè)用戶可能直接掉線。原因NOMA犧牲信道好用戶的速率來(lái)?yè)Q取信道差用戶的接入和總吞吐量提升。如果不加任何公平性約束功率分配算法會(huì)把大部分功率給信道差的用戶信道好的用戶速率被壓得很低。在總速率最大化的目標(biāo)下極端情況是信道差的用戶占用幾乎全部功率信道好的用戶速率接近零——這在工程上不可接受。解決在功率分配算法中加一個(gè)最低速率約束或最低功率占比約束。比如在FTPA中把α_ftp最大值限制在0.5以內(nèi)確保信道好用戶至少保留30%的功率。另外我也養(yǎng)成了一個(gè)習(xí)慣每次跑完仿真不止看總吞吐量曲線還要單獨(dú)畫兩個(gè)用戶的速率對(duì)比柱狀圖用肉眼看公平性。如果發(fā)現(xiàn)信道好用戶的速率低于OMA方案就說(shuō)明功率分配傾斜過(guò)度了需要回調(diào)α_ftp或增加公平性約束項(xiàng)。6. 仿真驗(yàn)證與進(jìn)階蒙特卡洛統(tǒng)計(jì)、收斂性判別與可視化輸出技巧完成基礎(chǔ)仿真后下一步是驗(yàn)證算法的可信度。單個(gè)信道的誤碼率曲線意義有限因?yàn)槿鹄诺朗请S機(jī)的一次信道的仿真結(jié)果可能偏差很大。我一般會(huì)跑蒙特卡洛統(tǒng)計(jì)固定信道參數(shù)配置隨機(jī)生成1000次信道實(shí)現(xiàn)每次記錄系統(tǒng)吞吐量和各用戶速率最后統(tǒng)計(jì)均值和方差。這樣得到的結(jié)果在論文或者課程設(shè)計(jì)里才有說(shuō)服力。資源包的操作錄像里演示了怎么用parfor并行計(jì)算加速——把for循環(huán)改成parfor配合Parallel Computing Toolbox1000次仿真從半小時(shí)壓縮到幾分鐘前提是每次循環(huán)調(diào)用獨(dú)立、不共享內(nèi)存變量。收斂性判別方面注水算法和任何迭代類算法都要檢查收斂行為。我習(xí)慣在算法里記錄每次迭代后的目標(biāo)函數(shù)值總速率畫成一條收斂曲線。正常情況是一條快速下降然后平穩(wěn)的曲線如果出現(xiàn)鋸齒狀震蕩說(shuō)明步長(zhǎng)太大或容差太緊。判斷收斂的標(biāo)準(zhǔn)不是迭代次數(shù)達(dá)到上限而是目標(biāo)函數(shù)值的變化量連續(xù)幾次小于容差。有一次我發(fā)現(xiàn)注水算法的收斂曲線在平穩(wěn)后又突然跳變追查后發(fā)現(xiàn)是某次迭代里信道增益向量被意外修改了——這個(gè)排查過(guò)程讓我養(yǎng)成了一個(gè)習(xí)慣迭代算法里所有不變的輸入都加constant標(biāo)志或復(fù)制存檔防止被意外覆蓋??梢暬敵鲞@塊除了常規(guī)的誤碼率曲線和吞吐量柱狀圖我最推薦的是“用戶-功率-速率”三維關(guān)系圖X軸是信道好用戶的功率分配系數(shù)0到1Y軸是信道差用戶的速率Z軸是系統(tǒng)總吞吐量。這張圖能直觀顯示功率分配策略的最優(yōu)工作點(diǎn)——曲面的最高點(diǎn)就是最優(yōu)功率分配但往往不是總吞吐量的最大值而是在公平性約束下的合理折中。用MATLAB的surf函數(shù)畫這個(gè)曲面每個(gè)點(diǎn)對(duì)應(yīng)一組功率分配系數(shù)做一次網(wǎng)格掃描就能覆蓋整個(gè)參數(shù)空間。這個(gè)技巧是我在某次課題評(píng)審時(shí)被問(wèn)“你怎么確定你的功率分配是最優(yōu)的”之后才補(bǔ)上的——從那以后我每次做功率分配仿真都強(qiáng)制自己畫一張三維功率-速率曲面圖既驗(yàn)證了算法的正確性也方便看出參數(shù)邊界在哪里。希望這個(gè)驗(yàn)證路徑能幫到你。本文還有配套的精品資源點(diǎn)擊獲取