計(jì)到SIC接收機(jī)實(shí)現(xiàn))
簡(jiǎn)介針對(duì)NOMA與OFDM聯(lián)合系統(tǒng)的MATLAB仿真源碼包共2個(gè)m文件大小2KB適合無(wú)線通信方向研究生、工程師以及正在學(xué)習(xí)5G關(guān)鍵技術(shù)的開(kāi)發(fā)者。資源圍繞非正交多址接入與正交頻分復(fù)用提供了noma.m和m_sequence.m兩個(gè)核心腳本覆蓋用戶功率分配、多用戶檢測(cè)、偽隨機(jī)序列生成等關(guān)鍵環(huán)節(jié)可直接運(yùn)行學(xué)習(xí)NOMA功率域復(fù)用與OFDM子載波調(diào)度原理也可作為課程設(shè)計(jì)或畢業(yè)設(shè)計(jì)的基礎(chǔ)框架。已有894人學(xué)習(xí)下載說(shuō)明其在通信仿真實(shí)踐中具有較高參考價(jià)值。借助該壓縮包讀者可快速搭建NOMA-OFDM仿真實(shí)驗(yàn)調(diào)整用戶數(shù)量、功率分配策略和信道條件觀察誤碼率、吞吐量及用戶公平性變化深入理解高譜效多址接入的實(shí)現(xiàn)細(xì)節(jié)。整包體積小、結(jié)構(gòu)清晰便于對(duì)照代碼逐段分析。1. 拆開(kāi) noma.m為什么 NOMA-OFDM 仿真要先從序列設(shè)計(jì)開(kāi)始很多人第一次打開(kāi)noma.m的時(shí)候會(huì)預(yù)期看到一個(gè)完全摒棄 OFDM 的全新框架但實(shí)際第一行代碼往往都是在初始化子載波和用戶序列。NOMA 的核心反直覺(jué)點(diǎn)在于它并不是在物理層把兩個(gè)信號(hào)徹底分開(kāi)而是故意讓它們?cè)跁r(shí)頻資源上完全重疊再借助接收端的功率差把用戶“拆”開(kāi)。這個(gè) MATLAB 仿真包正好把noma.m和m_sequence.m兩層放在了一起前者處理疊加編碼與 SIC 檢測(cè)后者負(fù)責(zé)生成用戶簽名序列。如果你正在做 5G NR 物理層算法評(píng)估或者需要對(duì)比 NOMA 與 OFDMA 在多用戶場(chǎng)景下的吞吐量差異這份代碼能直接幫你跑通完整鏈路并給出 BER、吞吐量和公平性指標(biāo)。下面我會(huì)按“序列生成 → 發(fā)射機(jī)/接收機(jī)實(shí)現(xiàn) → 與 OFDMA 對(duì)比 → 貼近 NR 配置”的順序來(lái)拆解整個(gè)仿真過(guò)程。2. m_sequence.m 背后的移位寄存器邏輯與用戶簽名生成2.1 從多項(xiàng)式到 m 序列初始化狀態(tài)與反饋連接m 序列本質(zhì)上是一個(gè)線性反饋移位寄存器LFSR在有限域 GF(2) 上跑出來(lái)的偽隨機(jī)序列周期是 (2^n - 1)。m_sequence.m里的核心參數(shù)有兩個(gè)一個(gè)是本原多項(xiàng)式另一個(gè)是寄存器的初始狀態(tài)。這兩者決定了序列的周期和相位。在 MATLAB 里如果你有通信工具箱可以直接用comm.PNSequence但為了看清楚寄存器抽頭我一般會(huì)手寫(xiě)一個(gè)移位寄存器版本調(diào)試起來(lái)更直觀% m 序列手寫(xiě)生成器兼容無(wú)通信工具箱環(huán)境 n_stages 6; % 移位寄存器級(jí)數(shù)周期為 2^6 - 1 63 reg [1 0 0 0 0 0]; % 初始狀態(tài)絕對(duì)不能全零 m_seq_len 2^n_stages - 1; m_seq zeros(1, m_seq_len); for idx 1:m_seq_len m_seq(idx) reg(n_stages); % 輸出最后一級(jí) feedback xor(reg(n_stages), reg(1)); % 本原多項(xiàng)式 x^6 x 1 reg [feedback, reg(1:n_stages - 1)]; % 右移一位并注入反饋 end這段代碼的邏輯是基于本原多項(xiàng)式 (f(x) x^6 x 1) 來(lái)構(gòu)造反饋抽頭。feedback xor(reg(n_stages), reg(1))表示將寄存器的第 6 級(jí)和第 1 級(jí)做異或再反饋到輸入端。需要特別注意的是初始狀態(tài)不能是全零否則整個(gè)序列會(huì)一直輸出 0永遠(yuǎn)跳不出這個(gè)死循環(huán)。每周期輸出的序列長(zhǎng)度為 63這個(gè)長(zhǎng)度在多用戶仿真中通常對(duì)應(yīng)一個(gè) OFDM 符號(hào)塊內(nèi)的基本擴(kuò)頻單位。2.2 從 m 序列到 Gold 序列互相關(guān)與用戶區(qū)分單個(gè) m 序列只能給一個(gè)用戶用。在多用戶 NOMA 場(chǎng)景下我們需要為不同用戶分配不同的簽名序列而且這些序列之間的互相關(guān)值要盡量低否則在 SIC 解碼后殘留的互相關(guān)干擾會(huì)直接抬高用戶 2 的誤碼率。常見(jiàn)的做法是把兩個(gè)優(yōu)選對(duì) m 序列異或生成 Gold 序列% 生成第二路 m 序列并移位 5 位 seq1 m_seq; seq2 circshift(m_seq, 5); % 相位偏移產(chǎn)生新的簽名 gold_seq xor(seq1, seq2); % Gold 序列 兩個(gè) m 序列逐位異或 % 查看互相關(guān)特性 [cross_corr, lags] xcorr(gold_seq, seq1); stem(lags, real(cross_corr));這里circshift(m_seq, 5)的作用是改變第 2 個(gè)用戶的簽名相位。Gold 序列的優(yōu)勢(shì)在于它的互相關(guān)值被限制在三個(gè)離散值內(nèi)比任意兩個(gè)普通 m 序列的互相關(guān)峰值要低得多。在設(shè)計(jì) NOMA 系統(tǒng)時(shí)我們一般不直接靠序列本身的正交性區(qū)分用戶功率域區(qū)分是主力但序列的互相關(guān)性能直接影響 SIC 減法之后的殘差噪聲水平。換句話說(shuō)簽名序列選得不好功率分配算得再準(zhǔn)用戶 2 的 BER 也會(huì)在高信噪比區(qū)間出現(xiàn)平層。2.2.1 自相關(guān)峰值在符號(hào)同步中的輔助作用除了互相關(guān)自相關(guān)的峰值特性也值得關(guān)注。m 序列的自相關(guān)函數(shù)是二值的在主瓣有尖銳的峰值旁瓣恒定為 (-1/N)。這個(gè)性質(zhì)可以用來(lái)做符號(hào)同步即接收端用本地序列與接收信號(hào)做滑動(dòng)相關(guān)通過(guò)峰值位置確定 OFDM 符號(hào)的起始點(diǎn)。在noma.m的整體鏈路中通常假設(shè)理想同步但在實(shí)際仿真時(shí)少量時(shí)偏就會(huì)導(dǎo)致子載波間干擾ICI所以理解m_sequence.m的自相關(guān)特性能幫你快速判斷仿真結(jié)果中的 BER 抬升是來(lái)自同步偏差還是來(lái)自 SIC 錯(cuò)誤傳播。序列類(lèi)型周期長(zhǎng)度互相關(guān)特性MATLAB 生成方式在 NOMA 仿真中的角色m 序列(2^n - 1)三值峰值較高手寫(xiě)移位寄存器或comm.PNSequence基礎(chǔ)擾碼 / 擴(kuò)頻種子Gold 序列(2^n - 1)有界三值相對(duì)更低兩個(gè) m 序列異或多用戶簽名抑制 SIC 殘差ZC 序列任意質(zhì)數(shù)理想循環(huán)互相關(guān)lteZadoffChuSeq參考信號(hào) / 同步序列3. noma.m 的發(fā)射機(jī)與接收機(jī)疊加編碼、功率分配和 SIC 檢測(cè)3.1 功率分配系數(shù) alpha 與疊加編碼的 MATLAB 實(shí)現(xiàn)NOMA 發(fā)射機(jī)的核心是疊加編碼Superposition Coding。假設(shè)有兩個(gè)用戶用戶 1 是近端用戶信道質(zhì)量好用戶 2 是遠(yuǎn)端用戶信道質(zhì)量差。為了讓兩個(gè)用戶在同一個(gè)子載波上都能成功解碼需要給用戶 2 分配更多功率給用戶 1 分配較少功率。這個(gè)比例由功率分配系數(shù)alpha控制。% 發(fā)射機(jī)側(cè)兩用戶 QPSK 符號(hào)疊加 N 256; % OFDM 子載波數(shù) snr 20; % 信噪比單位 dB bits1 randi([0 1], N*2, 1); % 用戶 1 發(fā)送比特 bits2 randi([0 1], N*2, 1); % 用戶 2 發(fā)送比特 sym1 qammod(bits1, 4, InputType, bit, UnitAveragePower, true); sym2 qammod(bits2, 4, InputType, bit, UnitAveragePower, true); alpha 0.2; % 用戶 2 的功率占比通常取 0.1 ~ 0.4 tx_signal sqrt(1 - alpha) .* sym1 sqrt(alpha) .* sym2; % 進(jìn)入 OFDM 調(diào)制IFFT 變換到時(shí)域 tx_ofdm ifft(tx_signal, N);這里qammod中的UnitAveragePower設(shè)置為true表示將 QPSK 符號(hào)的能量歸一化到 1這樣功率分配系數(shù)才能精確反映功率比例。alpha的取值直接影響系統(tǒng)性能alpha越接近 0.5兩個(gè)用戶功率越接近用戶 1 解碼時(shí)需要承受的干擾越大但用戶 2 的吞吐量會(huì)更高alpha越接近 0用戶 1 的 BER 越低但用戶 2 的接收信噪比變差。關(guān)于功率分配實(shí)際仿真中常用的策略有三種功率分配策略核心公式MATLAB 實(shí)現(xiàn)要點(diǎn)適用場(chǎng)景固定功率分配(P_1 (1-\alpha)P)直接用sqrt(alpha)縮放符號(hào)雙用戶場(chǎng)景復(fù)雜度最低分?jǐn)?shù)階功率分配FTPA(P_k P \cdot g_k^{-2\alpha} / \sum g_i^{-2\alpha})根據(jù)信道增益g_k動(dòng)態(tài)計(jì)算縮放因子多用戶場(chǎng)景兼顧公平性注水算法(P_k (\mu - \sigma^2 / g_k)^)使用fsolve迭代求解水位線信道差異明顯時(shí)容量最優(yōu)FTPA 是 5G 學(xué)術(shù)論文里最常用的方案它把信道增益 (g_k) 加入功率分配公式讓信道差的用戶自動(dòng)獲得更高功率從而改善用戶公平性。3.2 串行干擾消除SIC的解碼順序與代碼邏輯接收端的核心算法是串行干擾消除。SIC 的基本原則是先解碼功率大、容易解碼的用戶然后把這個(gè)用戶的信號(hào)重新編碼、調(diào)制從接收信號(hào)中減去再解碼下一個(gè)用戶。在 NOMA-OFDM 中SIC 是在頻域子載波級(jí)執(zhí)行的。% 接收機(jī)側(cè)經(jīng)過(guò) AWGN 信道后先做 FFT 回到頻域 rx_ofdm fft(rx_signal, N); % SIC 解碼流程先解碼用戶 1近端用戶功率較小 % 注意雖然用戶 1 功率小但用戶 1 信道好SIC 通常按信道增益降序排列 rx_sym1 rx_ofdm ./ sqrt(1 - alpha); demod_bits1 qamdemod(rx_sym1, 4, OutputType, bit, UnitAveragePower, true); % 重構(gòu)用戶 1 的信號(hào)并從接收信號(hào)中減去 reconstructed_sym1 qammod(demod_bits1, 4, InputType, bit, UnitAveragePower, true); residual rx_ofdm - sqrt(1 - alpha) .* reconstructed_sym1; % 在殘差信號(hào)中解碼用戶 2 rx_sym2 residual ./ sqrt(alpha); demod_bits2 qamdemod(rx_sym2, 4, OutputType, bit, UnitAveragePower, true); % 計(jì)算誤碼率 ber1 biterr(bits1, demod_bits1) / length(bits1); ber2 biterr(bits2, demod_bits2) / length(bits2);這段代碼中的關(guān)鍵點(diǎn)在于解碼順序。理論上一旦 SIC 開(kāi)始執(zhí)行它默認(rèn)先解碼信道增益較高的用戶因?yàn)樵撚脩裟軌虺惺茌^大的疊加干擾。如果解碼順序反了用戶 2 在存在強(qiáng)干擾的情況下極易出錯(cuò)而且錯(cuò)誤會(huì)通過(guò)重構(gòu)步驟傳播給用戶 1。另一個(gè)需要留意的是residual的計(jì)算很多初學(xué)者的代碼會(huì)忘記對(duì)重構(gòu)信號(hào)乘以sqrt(1 - alpha)的功率系數(shù)這會(huì)導(dǎo)致減法不徹底殘留大量干擾。3.3 BER 統(tǒng)計(jì)、吞吐量計(jì)算與 Jain 公平性指標(biāo)仿真跑完 SIC 之后自然要統(tǒng)計(jì)性能指標(biāo)。noma.m中通常會(huì)計(jì)算 BER但如果你需要評(píng)估系統(tǒng)整體性能光看 BER 還不夠吞吐量和用戶公平性同樣重要。特別是對(duì)比 NOMA 和 OFDMA 時(shí)公平性是一個(gè)決定性指標(biāo)。% 吞吐量計(jì)算每個(gè) QPSK 符號(hào)攜帶 2 比特 num_symbols N; throughput1 sum(bits1 demod_bits1) / num_symbols; throughput2 sum(bits2 demod_bits2) / num_symbols; % Jain 公平性指數(shù)計(jì)算 rates [throughput1, throughput2]; fairness sum(rates)^2 / (2 * sum(rates.^2));Jain 公平性指數(shù)的取值范圍是 0 到 1值越接近 1說(shuō)明兩個(gè)用戶獲得的吞吐量越均衡。當(dāng)你調(diào)整alpha參數(shù)時(shí)會(huì)看到吞吐量和公平性之間的權(quán)衡變化。alpha趨近 0.5 時(shí)公平性變好但用戶 1 的 BER 會(huì)上升alpha趨近 0 時(shí)用戶 2 的吞吐量會(huì)顯著下降公平性指標(biāo)惡化。4. NOMA-OFDM 與 OFDMA 的仿真對(duì)比從子載波分配到系統(tǒng)容量4.1 OFDMA 的頻域多址子載波獨(dú)占與調(diào)度在介紹 NOMA-OFDM 之前先看傳統(tǒng) OFDMA 的仿真方法。OFDMA 把整個(gè)頻帶劃分為若干資源塊每個(gè)用戶獨(dú)占一部分子載波因此用戶間完全正交不存在多址干擾。在 MATLAB 中模擬 OFDMA 非常簡(jiǎn)單就是按索引分配子載波% OFDMA將 N 個(gè)子載波分成兩組分別分配給兩個(gè)用戶 N 64; user1_subcarriers 1:32; % 用戶 1 獨(dú)占 1~32 號(hào)子載波 user2_subcarriers 33:64; % 用戶 2 獨(dú)占 33~64 號(hào)子載波 ofdma_freq_domain zeros(1, N); ofdma_freq_domain(user1_subcarriers) sym1; % 用戶 1 的符號(hào)放在指定子載波 ofdma_freq_domain(user2_subcarriers) sym2; % 用戶 2 的符號(hào)放在指定子載波 tx_ofdma ifft(ofdma_freq_domain, N); % IFFT 變到時(shí)域這段代碼里user1_subcarriers和user2_subcarriers是互斥的索引集合。OFDMA 的優(yōu)點(diǎn)在于接收機(jī)處理非常簡(jiǎn)單接收端只要做一次 FFT按下標(biāo)取出對(duì)應(yīng)子載波的符號(hào)即可不需要額外解碼邏輯。但缺點(diǎn)也很明顯如果用戶 1 的數(shù)據(jù)量較小它的那部分子載波就會(huì)空閑造成頻譜資源浪費(fèi)。4.2 NOMA-OFDM 的同頻疊加容量?jī)?yōu)勢(shì)與接收機(jī)復(fù)雜度NOMA-OFDM 改變了 OFDMA 中子載波獨(dú)占的規(guī)則允許兩個(gè)用戶同時(shí)使用全部子載波僅用功率差與 SIC 來(lái)區(qū)分用戶。因此它的系統(tǒng)容量更高尤其是在用戶間信道質(zhì)量差異較大的場(chǎng)景。下面這段代碼展示了 NOMA-OFDM 發(fā)射端的核心差異% NOMA-OFDM所有子載波上同時(shí)疊加兩個(gè)用戶信號(hào) noma_freq_domain sqrt(1 - alpha) .* sym1 sqrt(alpha) .* sym2; tx_noma ifft(noma_freq_domain, N);這里的sym1和sym2長(zhǎng)度都為 N它們復(fù)用的是同一組子載波。NOMA-OFDM 的容量提升來(lái)源于疊加編碼它讓系統(tǒng)過(guò)載運(yùn)行。但其代價(jià)是接收機(jī)復(fù)雜度大幅上升SIC 除了要處理信號(hào)重構(gòu)還要對(duì)信道增益進(jìn)行排序。尤其當(dāng)用戶數(shù)增加到 3 到 4 個(gè)時(shí)SIC 的錯(cuò)誤傳播會(huì)變得非常突出。4.3 典型仿真參數(shù)表與“隱式”坑點(diǎn)FFT、CP、歸一化在實(shí)際仿真時(shí)NOMA-OFDM 與 OFDMA 的對(duì)比需要放在同一套參數(shù)框架下才有意義。我一般會(huì)使用下表作為基準(zhǔn)配置參數(shù)項(xiàng)目OFDMANOMA-OFDM影響說(shuō)明子載波總數(shù)N64 / 256 / 102464 / 256 / 1024FFT 點(diǎn)數(shù)必須一致用戶數(shù)22非正交疊加數(shù)循環(huán)前綴長(zhǎng)度N/4N/4消除多徑符號(hào)間干擾功率分配系數(shù)無(wú)需設(shè)置alpha 0.2NOMA 特有參數(shù)信道編碼可選 LDPC可選 LDPC糾錯(cuò)能力接收機(jī)算法頻域均衡SIC 頻域均衡復(fù)雜度對(duì)比關(guān)鍵仿真中有一個(gè)很容易踩的“隱式”坑IFFT 之后的信號(hào)功率會(huì)隨N變化。如果你不對(duì)發(fā)射信號(hào)做功率歸一化直接調(diào)用awgn(rx_signal, snr, measured)得到的 SNR 會(huì)和理論值偏差很大。通常我建議在發(fā)射端加一句歸一化tx_signal tx_signal / sqrt(mean(abs(tx_signal).^2));確保發(fā)射功率為 1。另外循環(huán)前綴的添加和去除也容易被忽略在多徑信道仿真中如果忘記加 CPOFDM 子載波正交性會(huì)被破壞導(dǎo)致 BER 曲線在高 SNR 處出現(xiàn)平層。5. 把仿真往前再推一步5G NR 信道模型與閉環(huán)驗(yàn)證技巧5.1 用 nrTDLChannel 替換簡(jiǎn)單 AWGN 信道基礎(chǔ)仿真中我們常常用awgn來(lái)模擬信道但真實(shí) 5G NR 鏈路必須考慮時(shí)延擴(kuò)展和多普勒頻移。如果你安裝了 5G Toolbox我會(huì)直接使用nrTDLChannel來(lái)替換 AWGN 信道這樣得到的結(jié)果更接近實(shí)際空口下發(fā)的性能。% 配置 TDL 信道模型TDL-A 30ns 時(shí)延擴(kuò)展5Hz 多普勒 channel nrTDLChannel(DelayProfile, TDL-A, ... DelaySpread, 30e-9, ... MaximumDopplerShift, 5, ... SampleRate, 1e6); channel.TransmitAntennaSelection [1]; channel.ReceiveAntennaSelection [1];這段代碼里的DelayProfile是信道時(shí)延分布模型TDL-A對(duì)應(yīng) 5G NR 標(biāo)準(zhǔn)中定義的抽頭時(shí)延組合。DelaySpread設(shè)置為 30ns 代表典型的市區(qū)微蜂窩場(chǎng)景。最大多普勒頻移 5Hz 對(duì)應(yīng)步行速度。加入信道模型后接收端需要先做信道估計(jì)再把 SIC 的解調(diào)過(guò)程延續(xù)下來(lái)這樣仿真框架才算完整。5.2 通過(guò)誤碼率曲線反向驗(yàn)證 SIC 實(shí)現(xiàn)是否正確驗(yàn)證 SIC 實(shí)現(xiàn)是否正確有一個(gè)很實(shí)用的技巧在雙用戶 AWGN 信道下把兩個(gè)用戶各自的 BER 曲線畫(huà)出來(lái)與理論 QPSK 曲線做對(duì)比。理論上用戶 2 由于功率高在低 SNR 區(qū)域應(yīng)該先到達(dá)零誤碼點(diǎn)用戶 1 在有殘留干擾的情況下BER 會(huì)比理論曲線略高但最終的斜率應(yīng)當(dāng)保持一致。如果你的仿真中兩條 BER 曲線在中高 SNR 區(qū)間出現(xiàn)平行甚至交叉那基本可以斷定 SIC 的重構(gòu)環(huán)節(jié)少乘了功率系數(shù)或者解碼順序排反了。% 采樣 0~25dB 的 SNR 點(diǎn)觀察 BER 曲線 snr_range 0:2:24; ber1_curve zeros(size(snr_range)); ber2_curve zeros(size(snr_range)); for snr_idx 1:length(snr_range) % 這里調(diào)用你的 NOMA 主函數(shù)返回當(dāng)前 SNR 下兩用戶 BER [ber1_curve(snr_idx), ber2_curve(snr_idx)] noma_function(snr_range(snr_idx), alpha); end % 繪制半對(duì)數(shù)坐標(biāo)曲線便于觀察錯(cuò)誤平層 semilogy(snr_range, ber1_curve, r-o, snr_range, ber2_curve, b-^);另外在使用noma.m做參數(shù)掃描時(shí)記得固定隨機(jī)種子rng(2025)否則每次仿真結(jié)果波動(dòng)較大很難判斷參數(shù)調(diào)整是真實(shí)影響還是噪聲引起的抖動(dòng)。按這個(gè)流程把序列、疊加編碼、SIC 和信道模型串起來(lái)你手里的noma.m就不再是一個(gè)黑盒而是可以隨意修改alpha、用戶數(shù)、調(diào)制階數(shù)并驗(yàn)證 5G 場(chǎng)景的仿真平臺(tái)。本文還有配套的精品資源點(diǎn)擊獲取