現(xiàn)64QAM軟解調(diào)鏈路仿真:從原理到誤碼率分析)
簡(jiǎn)介本資源是一套面向通信工程專(zhuān)業(yè)本科生及MATLAB初學(xué)者的64QAM軟解調(diào)鏈路仿真教學(xué)包聚焦數(shù)字調(diào)制系統(tǒng)誤碼率性能分析這一核心實(shí)驗(yàn)任務(wù)。資源包含5個(gè)文件2個(gè)主程序腳本.m、2個(gè)運(yùn)行日志.log、1個(gè)操作指引.txt總大小僅5KB輕量易用其中main1.m與main2.m實(shí)現(xiàn)64QAM調(diào)制、AWGN信道建模、軟判決解調(diào)及BER計(jì)算全流程全部代碼配有詳盡中文注釋邏輯清晰、模塊分明配套操作視頻已通過(guò)txt文件提供觀看地址可直觀掌握MATLAB當(dāng)前路徑設(shè)置、腳本運(yùn)行與結(jié)果可視化關(guān)鍵步驟。已有193人學(xué)習(xí)下載特別適合課程設(shè)計(jì)、通信原理實(shí)驗(yàn)復(fù)現(xiàn)或畢業(yè)設(shè)計(jì)前期驗(yàn)證使用開(kāi)箱即用無(wú)需額外依賴(lài)庫(kù)有效降低軟解調(diào)算法理解與仿真實(shí)踐門(mén)檻。1. 項(xiàng)目概述從理論到實(shí)踐的64QAM鏈路仿真如果你正在學(xué)習(xí)數(shù)字通信或者工作中需要評(píng)估一個(gè)通信系統(tǒng)的性能那么“誤碼率仿真”這個(gè)詞你一定不陌生。它就像是通信工程師的“試金石”在真正把硬件做出來(lái)之前先用軟件跑一遍看看這個(gè)設(shè)計(jì)在理論上能有多“抗造”。今天要聊的就是一個(gè)非常經(jīng)典且實(shí)用的仿真案例64QAM調(diào)制結(jié)合軟解調(diào)的完整通信鏈路誤碼率仿真。我會(huì)用MATLAB作為工具帶你從零開(kāi)始手把手搭建這條鏈路并解釋清楚每一個(gè)模塊背后的“為什么”。64QAM全稱(chēng)64進(jìn)制正交幅度調(diào)制是當(dāng)前4G/5G乃至Wi-Fi等高速通信系統(tǒng)的核心技術(shù)之一。簡(jiǎn)單來(lái)說(shuō)它就像在一個(gè)坐標(biāo)平面上精心布置了64個(gè)不同的點(diǎn)我們稱(chēng)之為“星座點(diǎn)”每個(gè)點(diǎn)代表一個(gè)6比特的二進(jìn)制組合。通過(guò)改變發(fā)射信號(hào)的幅度和相位讓它落到對(duì)應(yīng)的星座點(diǎn)上從而在一個(gè)符號(hào)周期內(nèi)傳輸6個(gè)比特效率遠(yuǎn)高于傳統(tǒng)的BPSK1比特/符號(hào)或QPSK2比特/符號(hào)。但高收益伴隨著高風(fēng)險(xiǎn)64個(gè)點(diǎn)挨得很近對(duì)噪聲和干擾極其敏感這就對(duì)解調(diào)技術(shù)提出了更高要求?!败浗庹{(diào)”正是應(yīng)對(duì)這一挑戰(zhàn)的利器。傳統(tǒng)的“硬判決”解調(diào)接收端看到信號(hào)后會(huì)直接“猜”它離哪個(gè)星座點(diǎn)最近然后輸出對(duì)應(yīng)的比特0或1。這個(gè)過(guò)程是“非黑即白”的丟失了“這個(gè)猜測(cè)有多可靠”這一寶貴信息。而軟解調(diào)不同它不急于做決定而是為每一個(gè)比特計(jì)算一個(gè)“似然比”或“軟信息”這個(gè)值反映了該比特是0還是1的“置信度”。這個(gè)軟信息可以交給后續(xù)的信道譯碼器如Viterbi或LDPC譯碼器進(jìn)行更智能的糾錯(cuò)從而大幅提升系統(tǒng)在惡劣信道下的性能??梢哉f(shuō)沒(méi)有軟解調(diào)高階QAM的實(shí)用價(jià)值將大打折扣。這個(gè)仿真項(xiàng)目的核心價(jià)值就在于將“64QAM調(diào)制”和“軟解調(diào)”這兩個(gè)關(guān)鍵環(huán)節(jié)串聯(lián)起來(lái)構(gòu)建一個(gè)包含完整發(fā)端、信道、收端的基帶仿真模型。通過(guò)它你可以直觀地看到信號(hào)是如何從比特流變成復(fù)雜的調(diào)制信號(hào)經(jīng)過(guò)噪聲“污染”后又如何被接收機(jī)盡力恢復(fù)出來(lái)并最終以“誤碼率”這個(gè)硬指標(biāo)來(lái)量化系統(tǒng)性能。無(wú)論你是通信專(zhuān)業(yè)的學(xué)生想深化理解還是工程師需要驗(yàn)證算法或教學(xué)這個(gè)仿真都能提供一個(gè)清晰、可操作、可修改的模板。接下來(lái)我們就深入鏈路內(nèi)部看看每一個(gè)模塊究竟是如何工作的。2. 64QAM調(diào)制原理與MATLAB實(shí)現(xiàn)細(xì)節(jié)要仿真首先得把信號(hào)正確地產(chǎn)生出來(lái)。64QAM調(diào)制器是發(fā)射機(jī)的核心它的任務(wù)是把一串二進(jìn)制比特流映射到我們前面提到的那個(gè)有64個(gè)點(diǎn)的星座圖上。2.1 星座圖映射比特到符號(hào)的“翻譯官”64QAM的星座圖通常采用矩形網(wǎng)格狀分布這也是最常用、能量分布最均勻的一種。具體來(lái)說(shuō)在復(fù)平面的實(shí)部I路和虛部Q路方向上各取8個(gè)等間隔的電平值。例如我們可以將電平歸一化到[-7, -5, -3, -1, 1, 3, 5, 7]這8個(gè)值上這樣任意一個(gè)星座點(diǎn)都可以表示為a b*j其中a和b都來(lái)自這個(gè)集合。那么如何將6個(gè)比特(b5b4b3b2b1b0)映射到一個(gè)具體的(I, Q)坐標(biāo)呢這里采用格雷碼映射是關(guān)鍵。格雷碼的特點(diǎn)是相鄰星座點(diǎn)所對(duì)應(yīng)的二進(jìn)制組合之間只有1個(gè)比特不同。這樣做的好處是當(dāng)噪聲導(dǎo)致接收信號(hào)錯(cuò)判到相鄰星座點(diǎn)時(shí)只會(huì)產(chǎn)生1個(gè)比特的錯(cuò)誤而不是多個(gè)這能顯著降低誤比特率。一種常見(jiàn)的映射規(guī)則是將6個(gè)比特分成高3位(b5b4b3)和低3位(b2b1b0)分別用于決定I路和Q路的電平。3個(gè)比特有8種狀態(tài)正好對(duì)應(yīng)8個(gè)電平。通過(guò)一個(gè)查找表將3位格雷碼映射到前述的8個(gè)電平值上。在MATLAB中我們無(wú)需手動(dòng)計(jì)算每個(gè)映射可以利用qammod函數(shù)。但為了透徹理解我們可以先自己實(shí)現(xiàn)一遍% 參數(shù)定義 M 64; % 調(diào)制階數(shù) k log2(M); % 每符號(hào)比特?cái)?shù) 6 % 生成隨機(jī)比特流 numBits 10000; dataIn randi([0 1], numBits, 1); % 將比特流分組每6比特一組 dataInMatrix reshape(dataIn, k, length(dataIn)/k).; % 將二進(jìn)制轉(zhuǎn)換為十進(jìn)制范圍0-63 dataSymbolsIn bi2de(dataInMatrix, left-msb); % 定義歸一化的64QAM星座矩形格雷碼映射 % 使用comm.RectangularQAMModulator對(duì)象或自定義映射 % 方法1使用通信工具箱函數(shù)最簡(jiǎn)單 if exist(qammod, file) % 注意默認(rèn)的qammod可能使用非格雷碼建議指定gray映射 modSignal qammod(dataSymbolsIn, M, gray, InputType, integer, UnitAveragePower, true); else % 方法2自定義格雷碼映射教學(xué)目的 % 1. 生成格雷碼序列 graySeq 0:M-1; graySeq bitxor(graySeq, floor(graySeq/2)); % 十進(jìn)制轉(zhuǎn)格雷碼 % 2. 定義歸一化星座點(diǎn)坐標(biāo)平均功率為1 constellation qammod(0:M-1, M, UnitAveragePower, true); % 先用默認(rèn)方式生成坐標(biāo) % 3. 根據(jù)格雷碼序列重新排序星座點(diǎn) [~, idx] sort(graySeq); constellation constellation(idx); % 4. 映射輸入的十進(jìn)制符號(hào)索引0-63對(duì)應(yīng)到constellation中的值 modSignal constellation(dataSymbolsIn 1); % 1因?yàn)镸ATLAB索引從1開(kāi)始 end注意UnitAveragePower參數(shù)設(shè)置為true至關(guān)重要。這會(huì)將星座點(diǎn)的平均功率歸一化為1瓦特。這樣我們?cè)诤竺嫣砑釉肼晻r(shí)信噪比Eb/N0或Es/N0的定義才是清晰且一致的。如果忘記歸一化計(jì)算出的噪聲功率將是錯(cuò)誤的導(dǎo)致仿真結(jié)果完全不可信。2.2 脈沖成形與過(guò)采樣讓信號(hào)適應(yīng)連續(xù)時(shí)間信道直接生成的調(diào)制符號(hào)modSignal是一個(gè)一個(gè)的離散點(diǎn)。但在實(shí)際信道中傳輸?shù)氖沁B續(xù)時(shí)間波形。脈沖成形濾波器的作用就是把這些離散的符號(hào)點(diǎn)“連接”成平滑的波形同時(shí)將信號(hào)的頻譜限制在一定的帶寬內(nèi)避免干擾相鄰信道。最常用的脈沖是平方根升余弦滾降濾波器。這里有個(gè)關(guān)鍵概念過(guò)采樣。我們的符號(hào)速率假設(shè)是1 Baud每秒1個(gè)符號(hào)。為了用離散序列較好地表示連續(xù)波形我們需要用更高的采樣率比如每個(gè)符號(hào)采樣spsSamples Per Symbol次。sps通常為4或8。% 脈沖成形參數(shù) sps 8; % 每個(gè)符號(hào)的采樣點(diǎn)數(shù) span 10; % 濾波器的符號(hào)長(zhǎng)度通常兩邊各span/2個(gè)符號(hào) rolloff 0.25; % 滾降因子典型值0.2~0.5 % 設(shè)計(jì)平方根升余弦濾波器 rrcFilter rcosdesign(rolloff, span, sps, sqrt); % 對(duì)調(diào)制信號(hào)進(jìn)行上采樣和濾波 % 上采樣在每個(gè)符號(hào)之間插入 sps-1 個(gè)零 upSampledSignal upsample(modSignal, sps); % 濾波 txSignal filter(rrcFilter, 1, upSampledSignal); % 注意濾波會(huì)引入群延遲長(zhǎng)度為 (length(rrcFilter)-1)/2 個(gè)采樣點(diǎn)。 % 在接收端進(jìn)行匹配濾波后需要去除這個(gè)延遲才能正確對(duì)齊符號(hào)進(jìn)行判決。 filterDelay (length(rrcFilter) - 1) / 2;經(jīng)過(guò)脈沖成形后txSignal就是一個(gè)準(zhǔn)備好了的基帶發(fā)射信號(hào)可以送入信道模型了。這里生成的信號(hào)是復(fù)信號(hào)包含了同相I和正交Q兩路。3. 信道模型模擬現(xiàn)實(shí)世界的噪聲與衰落一個(gè)理想的仿真環(huán)境沒(méi)有意義我們需要引入信道損傷來(lái)檢驗(yàn)系統(tǒng)的魯棒性。最基本的也是最重要的損傷就是加性高斯白噪聲。3.1 加性高斯白噪聲的精確添加AWGN信道是幾乎所有通信系統(tǒng)性能分析的起點(diǎn)。添加噪聲的關(guān)鍵在于根據(jù)設(shè)定的信噪比Eb/N0精確計(jì)算噪聲功率。首先明確幾個(gè)功率關(guān)系Eb每比特能量。Es每符號(hào)能量。對(duì)于64QAMEs Eb * log2(64) Eb * 6。信號(hào)平均功率我們已經(jīng)通過(guò)UnitAveragePower將調(diào)制符號(hào)的平均功率歸一化為1。但經(jīng)過(guò)脈沖成形濾波器后信號(hào)功率可能會(huì)發(fā)生變化。實(shí)際上一個(gè)設(shè)計(jì)良好的RRC濾波器是能量保持的輸入輸出功率基本不變。但為了絕對(duì)精確我們可以在濾波后重新測(cè)量信號(hào)功率。噪聲功率譜密度N0N0 2 * sigma^2其中sigma^2是復(fù)噪聲每個(gè)維度I或Q的方差。添加噪聲的步驟如下% 設(shè)定仿真信噪比范圍以dB為單位 EbN0_dB 0:2:16; % 例如從0dB到16dB步進(jìn)2dB numSNR length(EbN0_dB); % 初始化誤碼率結(jié)果存儲(chǔ) ber_soft zeros(1, numSNR); ber_hard zeros(1, numSNR); % 用于和硬判決對(duì)比 for snrIdx 1:numSNR current_EbN0_dB EbN0_dB(snrIdx); % 1. 將dB值轉(zhuǎn)換為線性值 current_EbN0 10^(current_EbN0_dB / 10); % 2. 計(jì)算每符號(hào)信噪比 Es/N0 EsN0 current_EbN0 * k; % k log2(64) 6 % 3. 計(jì)算信號(hào)功率測(cè)量濾波后信號(hào)的平均功率更準(zhǔn)確 signalPower mean(abs(txSignal).^2); % 4. 計(jì)算所需的噪聲功率譜密度 N0 % 根據(jù) Es/N0 signalPower / (N0 * 采樣率因子?) 需要小心。 % 在離散時(shí)間仿真中我們處理的是采樣后的信號(hào)。 % 更通用的方法是根據(jù) Es/N0 計(jì)算每個(gè)采樣點(diǎn)的噪聲方差。 % 對(duì)于復(fù)基帶信號(hào)噪聲方差 sigma^2 N0 / (2 * 過(guò)采樣率?) 這里容易混淆。 % 推薦的標(biāo)準(zhǔn)方法 % 我們的符號(hào)能量 Es signalPower * 符號(hào)周期Ts。 % 在離散仿真中采樣間隔為 Ts/sps。信號(hào)序列的功率是 signalPower。 % 那么一個(gè)符號(hào)周期內(nèi)的信號(hào)能量對(duì)應(yīng)于 sps 個(gè)采樣點(diǎn)。 % 因此平均到每個(gè)采樣點(diǎn)上的信號(hào)“能量”是 signalPower * (Ts/sps) * sps? 這很亂。 % 最清晰、不易錯(cuò)的方法從比特級(jí)別推導(dǎo)。 % 已知Eb/N0 (線性值) % 總比特?cái)?shù) numBits % 信號(hào)總能量 信號(hào)功率 * 信號(hào)持續(xù)時(shí)間。 % 信號(hào)持續(xù)時(shí)間 符號(hào)數(shù) * 符號(hào)周期 (numBits/k) * Ts。 % 在采樣點(diǎn)層面信號(hào)總能量 sum(|txSignal|.^2) * (Ts/sps)。 % 令采樣間隔 T Ts/sps則總能量 sum(|txSignal|.^2) * T。 % 而總比特能量 Eb * numBits。 % 所以 sum(|txSignal|.^2) * T Eb * numBits。 % 又因?yàn)?Eb/N0 已知所以 N0 Eb / (Eb/N0)。 % 那么噪聲功率譜密度 N0 已知。 % 對(duì)于離散復(fù)高斯噪聲每個(gè)維度的方差 sigma^2 N0 / (2 * T) % 實(shí)際上對(duì)于采樣率為 fs 1/T 的系統(tǒng)離散噪聲序列的方差 sigma_n^2 N0 * fs / 2 N0 / (2T)。 % 為了避免混亂通信工具箱提供了最直接的函數(shù)awgn。 % 但為了理解原理我們手動(dòng)計(jì)算一次 % 方法A使用 awgn 函數(shù)確保信號(hào)功率已測(cè)量 rxSignal awgn(txSignal, current_EbN0_dB 10*log10(k) - 10*log10(sps), measured); % 解釋awgn函數(shù)的第二個(gè)參數(shù)是信噪比SNR(dB)。 % 我們需要的是 Es/N0 (dB)。因?yàn)樾盘?hào)是過(guò)采樣的其采樣點(diǎn)功率不等于符號(hào)功率。 % measured 模式會(huì)根據(jù)輸入信號(hào) txSignal 的功率計(jì)算信號(hào)功率然后添加相應(yīng)功率的噪聲。 % 所以我們需要告訴它目標(biāo) Es/N0。 % Es/N0 (dB) Eb/N0 (dB) 10*log10(k) % 但 awgn 默認(rèn)認(rèn)為輸入?yún)?shù)是信號(hào)采樣點(diǎn)的 SNR (dB)。 % 對(duì)于過(guò)采樣信號(hào)采樣點(diǎn) SNR 與 Es/N0 的關(guān)系是采樣點(diǎn) SNR (dB) Es/N0 (dB) - 10*log10(sps) % 因此awgn 的目標(biāo) SNR (dB) Eb/N0_dB 10*log10(k) - 10*log10(sps) % 方法B手動(dòng)添加噪聲加深理解 % 測(cè)量信號(hào)功率 sigPower mean(abs(txSignal).^2); % 計(jì)算每個(gè)采樣點(diǎn)的信噪比 SNR_linear (線性值) % 目標(biāo) Es/N0 (Eb/N0)*k EsN0_linear current_EbN0 * k; % 采樣點(diǎn) SNR 信號(hào)功率 / 噪聲功率 (Es/Ts) / (N0 * fs) ? 需要統(tǒng)一。 % 更簡(jiǎn)單噪聲功率 信號(hào)功率 / (采樣點(diǎn) SNR) % 而 采樣點(diǎn) SNR (線性值) EsN0_linear / sps % 因?yàn)?Es 是符號(hào)能量分散在 sps 個(gè)采樣點(diǎn)上每個(gè)采樣點(diǎn)能量為 Es/sps。 % 噪聲功率譜密度為 N0帶寬內(nèi)的噪聲功率為 N0 * (1/Ts)不對(duì)。 % 對(duì)于采樣率 fs sps/Ts噪聲帶寬為 fs/2 基帶信號(hào)是復(fù)的正頻率部分帶寬為 1/(2Ts) 太復(fù)雜。 % 結(jié)論對(duì)于復(fù)基帶仿真最穩(wěn)妥且通用的公式是 % 噪聲方差 sigma^2 (信號(hào)功率) / (Es/N0_linear) * (1/sps) % 但根據(jù)能量守恒符號(hào)能量 Es 信號(hào)功率 * Ts。 % 采樣點(diǎn)功率 Ps 信號(hào)功率。 % 采樣點(diǎn)噪聲方差 N0 / (2 * T_sample) N0 * fs / 2。 % 而 N0 Es / EsN0_linear。 % 所以 sigma^2 (Es / EsN0_linear) * (sps/Ts) / 2 (Ps * Ts / EsN0_linear) * (sps/Ts) / 2 Ps / (2 * EsN0_linear / sps) % 令 SNR_sample_linear EsN0_linear / sps % 則 sigma^2 Ps / (2 * SNR_sample_linear) SNR_sample_linear EsN0_linear / sps; noiseVar sigPower / (2 * SNR_sample_linear); % 復(fù)噪聲每個(gè)維度的方差 noise sqrt(noiseVar/2) * (randn(size(txSignal)) 1i*randn(size(txSignal))); % 生成復(fù)高斯噪聲 rxSignal_manual txSignal noise; % 通常使用方法Aawgn函數(shù)更簡(jiǎn)單且不易出錯(cuò)。這里為了演示我們使用 rxSignal_manual 繼續(xù)。 rxSignal rxSignal_manual; end這段代碼包含了信道添加噪聲的核心。其中最關(guān)鍵的是信噪比換算這是通信仿真中最容易出錯(cuò)的地方之一。務(wù)必理解Eb/N0、Es/N0以及過(guò)采樣系統(tǒng)采樣點(diǎn)信噪比之間的關(guān)系。3.2 可選的信道損傷擴(kuò)展除了AWGN一個(gè)更完整的仿真可能還需要考慮多徑衰落、相位噪聲、頻偏等。例如添加一個(gè)簡(jiǎn)單的多徑信道% 定義一個(gè)兩徑瑞利衰落信道 channel [0.8, 0, 0, 0, 0.3]; % 主徑增益0.8延遲4個(gè)采樣點(diǎn)的多徑增益0.3 rxSignalMultipath filter(channel, 1, txSignal); % 注意這會(huì)引入碼間串?dāng)_ % 然后再添加噪聲 rxSignal awgn(rxSignalMultipath, ...);在初步的誤碼率仿真中通常從最簡(jiǎn)單的AWGN信道開(kāi)始因?yàn)樗o出了系統(tǒng)性能的理論下界在無(wú)碼間串?dāng)_、無(wú)衰落的情況下。有了這個(gè)基準(zhǔn)再引入其他損傷就能看出系統(tǒng)性能的下降程度。4. 接收機(jī)處理匹配濾波與定時(shí)同步信號(hào)經(jīng)過(guò)信道帶著噪聲到達(dá)接收機(jī)。接收機(jī)的首要任務(wù)是從連續(xù)的、被污染的信號(hào)波形中最佳地恢復(fù)出發(fā)送的符號(hào)序列。這第一步就是匹配濾波和符號(hào)定時(shí)同步。4.1 匹配濾波最大化信噪比匹配濾波器的沖激響應(yīng)是發(fā)射脈沖成形濾波器的共軛反轉(zhuǎn)。對(duì)于實(shí)系數(shù)的平方根升余弦濾波器匹配濾波器就是它本身。匹配濾波有兩個(gè)作用1. 使采樣時(shí)刻的信噪比最大化2. 與發(fā)射濾波器共同構(gòu)成一個(gè)升余弦滾降濾波器從而滿(mǎn)足奈奎斯特第一準(zhǔn)則在理想同步下消除碼間串?dāng)_。% 接收端匹配濾波 rxFiltered filter(rrcFilter, 1, rxSignal); % 匹配濾波同樣會(huì)引入延遲 % 總延遲是發(fā)射濾波和接收濾波延遲之和 totalDelay 2 * filterDelay; % 因?yàn)榘l(fā)射和接收用了同一個(gè)濾波器rrcFilter4.2 符號(hào)定時(shí)同步找到最佳采樣點(diǎn)經(jīng)過(guò)匹配濾波后我們得到了一個(gè)波形需要在每個(gè)符號(hào)周期的特定時(shí)刻通常是最佳采樣點(diǎn)即波形眼圖張開(kāi)最大的時(shí)刻進(jìn)行采樣才能得到用于判決的符號(hào)值。在仿真中我們通常知道精確的符號(hào)定時(shí)因?yàn)槭俏覀冏约荷傻乃钥梢岳硐氩蓸印5趯?shí)際中或更高級(jí)的仿真里需要定時(shí)同步算法。% 理想定時(shí)同步已知延遲和過(guò)采樣率 % 1. 去除濾波器引入的延遲 rxFilteredAlign rxFiltered(totalDelay1 : end); % 確保長(zhǎng)度是sps的整數(shù)倍方便下采樣 effectiveLen floor(length(rxFilteredAlign) / sps) * sps; rxFilteredAlign rxFilteredAlign(1:effectiveLen); % 2. 下采樣在每個(gè)符號(hào)周期的中心點(diǎn)采樣假設(shè)理想同步 % 我們通常選擇在濾波后波形的穩(wěn)定區(qū)中心采樣。對(duì)于RRC最佳采樣點(diǎn)就是符號(hào)間隔的中心。 % 由于我們上采樣時(shí)在符號(hào)前補(bǔ)零濾波后波形峰值會(huì)出現(xiàn)在符號(hào)周期中間。 % 因此下采樣索引可以從 (sps/2 1) 開(kāi)始每隔 sps 個(gè)點(diǎn)取一個(gè)。 startIdx ceil(sps/2); % 例如 sps8, startIdx4 sampledSignal rxFilteredAlign(startIdx : sps : end);現(xiàn)在sampledSignal的長(zhǎng)度應(yīng)該等于發(fā)送的符號(hào)數(shù)(numBits/k)。這些點(diǎn)就是受到噪聲干擾后散布在64QAM星座圖各個(gè)理想點(diǎn)周?chē)慕邮辗?hào)。接下來(lái)就要對(duì)這些點(diǎn)進(jìn)行解調(diào)恢復(fù)出比特信息。5. 軟解調(diào)算法詳解與MATLAB實(shí)現(xiàn)這是本仿真的核心與難點(diǎn)。硬判決解調(diào)很簡(jiǎn)單計(jì)算接收符號(hào)到64個(gè)理想星座點(diǎn)的歐氏距離選擇距離最小的點(diǎn)然后根據(jù)映射規(guī)則反解出6個(gè)比特。但軟解調(diào)需要為每一個(gè)比特輸出一個(gè)軟信息通常是該比特為0的對(duì)數(shù)似然比。5.1 對(duì)數(shù)似然比計(jì)算原理對(duì)于加性高斯白噪聲信道接收符號(hào)y在發(fā)送符號(hào)為x條件下的概率密度函數(shù)是復(fù)高斯分布。比特b_i的對(duì)數(shù)似然比定義為L(zhǎng)LR(b_i) log( P(b_i0 | y) / P(b_i1 | y) )根據(jù)貝葉斯公式和等概發(fā)送的假設(shè)可以推導(dǎo)出近似公式LLR(b_i) ≈ (1/(2*sigma^2)) * [ min_{x in S_i^1} |y - x|^2 - min_{x in S_i^0} |y - x|^2 ]其中S_i^0表示所有使第i個(gè)比特為0的星座點(diǎn)集合S_i^1表示所有使第i個(gè)比特為1的星座點(diǎn)集合。sigma^2是噪聲方差每個(gè)維度。這個(gè)公式的直觀意義是對(duì)于第i個(gè)比特分別找到離接收點(diǎn)y最近的、該比特為0的星座點(diǎn)和最近的、該比特為1的星座點(diǎn)。計(jì)算y到這兩個(gè)點(diǎn)的距離平方。如果離“0點(diǎn)”更近差值為負(fù)LLR為負(fù)值傾向于判0反之LLR為正值傾向于判1。LLR的絕對(duì)值大小反映了判決的置信度。5.2 高效LLR計(jì)算的MATLAB實(shí)現(xiàn)直接按照定義計(jì)算需要遍歷集合對(duì)64QAM來(lái)說(shuō)每個(gè)比特需要對(duì)64個(gè)點(diǎn)計(jì)算距離并比較計(jì)算量較大。對(duì)于矩形格雷碼映射的QAM可以利用其星座圖的對(duì)稱(chēng)性推導(dǎo)出基于接收信號(hào)I、Q分量的近似LLR計(jì)算公式這能極大簡(jiǎn)化運(yùn)算。這里我們展示通用但稍慢的“最小距離”法以及更高效的分段線性近似法。方法一最小距離法通用易于理解function llr qam64_soft_demod_min_distance(y, M, sigma2) % y: 接收符號(hào)復(fù)數(shù)標(biāo)量或向量 % M: 調(diào)制階數(shù) 64 % sigma2: 噪聲方差每個(gè)維度的即上面的 sigma^2 k log2(M); % 生成所有理想星座點(diǎn)格雷碼映射歸一化平均功率為1 constellation qammod(0:M-1, M, gray, UnitAveragePower, true); % 為每個(gè)比特預(yù)分配LLR llr zeros(length(y), k); % 對(duì)于每個(gè)接收符號(hào) for idx 1:length(y) y_scalar y(idx); % 計(jì)算到所有星座點(diǎn)的距離平方 dist2 abs(y_scalar - constellation).^2; % 1x64向量 % 對(duì)于每個(gè)比特位 for bitIdx 0:k-1 % 找出該比特為0和1的星座點(diǎn)索引 % 需要知道格雷碼映射下每個(gè)星座點(diǎn)對(duì)應(yīng)的比特圖案 % 我們可以反解對(duì)于 constellation 中的第m個(gè)點(diǎn)其對(duì)應(yīng)的比特圖案是 % 因?yàn)?constellation 是按格雷碼順序排列的所以第m個(gè)點(diǎn)對(duì)應(yīng)的整數(shù)符號(hào)就是 m-1 (0-63) % 將 m-1 轉(zhuǎn)換為 k 位二進(jìn)制格雷碼順序需要先將整數(shù)轉(zhuǎn)為格雷碼再轉(zhuǎn)二進(jìn)制 % 實(shí)際上我們生成 constellation 時(shí)用了 gray 選項(xiàng)那么 qammod 的輸入整數(shù) 0:63 就對(duì)應(yīng)格雷碼索引。 % 所以符號(hào)索引 symIdx 0:63 直接對(duì)應(yīng)格雷碼。 % 我們需要知道對(duì)于給定的 symIdx它的第 bitIdx 位是0還是1。 % 生成所有符號(hào)的比特矩陣 allSymbols (0:M-1).; % 格雷碼轉(zhuǎn)二進(jìn)制因?yàn)槲覀兊姆?hào)索引是格雷碼 % 格雷碼轉(zhuǎn)二進(jìn)制二進(jìn)制最高位等于格雷碼最高位此后每一位等于格雷碼當(dāng)前位與前一位二進(jìn)制異或 graySeq allSymbols; binSeq zeros(size(graySeq)); for i 1:k binSeq(:, i) bitget(graySeq, k-i1); % 先獲取格雷碼的各個(gè)位 end % 格雷碼轉(zhuǎn)二進(jìn)制算法 bin zeros(size(graySeq)); bin(:,1) binSeq(:,1); % 最高位相同 for i 2:k bin(:,i) xor(binSeq(:,i), bin(:,i-1)); end % 現(xiàn)在 bin 是一個(gè) M x k 的矩陣bin(m, bitIdx1) 就是符號(hào)索引 m-1 的第 bitIdx 個(gè)比特值最高位在前取決于bitget順序 % 注意bitget 默認(rèn)是低位在前LSB而我們?cè)谟成鋾r(shí)可能約定高位在前。這里需要與調(diào)制映射保持一致。 % 為了避免混亂一個(gè)更清晰但計(jì)算量大的方法是直接遍歷 % 初始化最小距離 min_dist_0 inf; min_dist_1 inf; for m 1:M sym constellation(m); dist abs(y_scalar - sym)^2; % 判斷這個(gè)星座點(diǎn)對(duì)應(yīng)的第 bitIdx 個(gè)比特是0還是1 % 我們需要一個(gè)函數(shù)給定星座點(diǎn)索引 m-1返回其比特圖案按照調(diào)制時(shí)的映射規(guī)則 bits get_bits_from_symbol_index(m-1, k); % 假設(shè)有這個(gè)函數(shù) if bits(bitIdx1) 0 if dist min_dist_0 min_dist_0 dist; end else if dist min_dist_1 min_dist_1 dist; end end end % 計(jì)算LLR llr(idx, bitIdx1) (min_dist_1 - min_dist_0) / (2*sigma2); end end end % 輔助函數(shù)根據(jù)符號(hào)索引和格雷碼映射規(guī)則返回比特?cái)?shù)組 function bits get_bits_from_symbol_index(symIdx, k) % symIdx: 0~63 % 假設(shè)調(diào)制時(shí)使用了標(biāo)準(zhǔn)的格雷碼映射矩形星座。 % 對(duì)于矩形格雷碼映射I路和Q路獨(dú)立進(jìn)行格雷碼映射。 % 將 symIdx 分解為 I路索引 (0-7) 和 Q路索引 (0-7) i_index floor(symIdx / 8); % 0~7 q_index mod(symIdx, 8); % 0~7 % 將十進(jìn)制索引轉(zhuǎn)換為3位格雷碼二進(jìn)制 % 注意這里的映射需要與調(diào)制器完全一致。我們假設(shè)使用自然二進(jìn)制轉(zhuǎn)格雷碼。 i_gray bitxor(i_index, floor(i_index/2)); q_gray bitxor(q_index, floor(q_index/2)); % 將兩個(gè)3位格雷碼合并成6位比特高3位是I路低3位是Q路或反之需與調(diào)制器對(duì)應(yīng) bits [de2bi(i_gray, 3, left-msb), de2bi(q_gray, 3, left-msb)]; end這個(gè)方法邏輯清晰但計(jì)算復(fù)雜度是O(符號(hào)數(shù) * 64 * 6)當(dāng)仿真大量符號(hào)時(shí)非常慢。方法二分段線性近似法高效適用于矩形格雷碼QAM對(duì)于矩形格雷碼映射的QAMLLR可以近似為接收信號(hào)I、Q分量經(jīng)過(guò)一個(gè)非線性函數(shù)的結(jié)果。這個(gè)函數(shù)通??梢杂梅侄尉€性函數(shù)或查表來(lái)近似速度極快。MATLAB的通信工具箱函數(shù)qamdemod在指定OutputType為llr或approxllr時(shí)就采用了這種近似算法。% 使用通信工具箱進(jìn)行軟解調(diào)推薦 % 首先需要知道噪聲方差 sigma2 % sigma2 的計(jì)算方法見(jiàn)前面信道部分 noiseVar ...; % 計(jì)算得到的噪聲方差每個(gè)維度 % 計(jì)算LLR llr qamdemod(sampledSignal, M, gray, OutputType, approxllr, ... UnitAveragePower, true, NoiseVariance, noiseVar); % 或者使用 llr后者是更精確但計(jì)算量稍大的方法。 % approxllr 使用近似公式速度更快在中等及以上信噪比下精度足夠。實(shí)操心得在實(shí)際仿真中強(qiáng)烈建議使用qamdemod函數(shù)進(jìn)行軟解調(diào)。它不僅速度快而且經(jīng)過(guò)充分優(yōu)化和測(cè)試結(jié)果可靠。自己編寫(xiě)最小距離法代碼主要用于教學(xué)和理解原理。在使用qamdemod時(shí)務(wù)必確保UnitAveragePower和NoiseVariance參數(shù)與調(diào)制端和信道模型完全匹配這是結(jié)果正確的關(guān)鍵。5.3 硬判決解調(diào)對(duì)比為了凸顯軟解調(diào)的優(yōu)勢(shì)我們同時(shí)實(shí)現(xiàn)硬判決作為對(duì)比% 硬判決解調(diào) hardDecisionSymbols qamdemod(sampledSignal, M, gray, OutputType, integer, UnitAveragePower, true); % 將符號(hào)解映射為比特流 dataOutHard de2bi(hardDecisionSymbols, k, left-msb).; dataOutHard dataOutHard(:); % 轉(zhuǎn)換為列向量 % 軟解調(diào)輸出已經(jīng)是LLR可以用于后續(xù)信道譯碼。 % 如果直接對(duì)比誤碼率我們需要將LLR轉(zhuǎn)換為硬比特判決LLR0判為0LLR0判為1。 dataOutSoftBits llr 0; % 注意LLR的定義 log(P(0)/P(1))0 傾向于00 傾向于1。 dataOutSoftBits dataOutSoftBits(:);6. 誤碼率計(jì)算與仿真結(jié)果分析有了發(fā)射比特流dataIn和接收端恢復(fù)的比特流dataOutHard、dataOutSoftBits就可以計(jì)算誤碼率了。誤碼率是錯(cuò)誤比特?cái)?shù)與總比特?cái)?shù)之比。6.1 計(jì)算與繪圖我們需要對(duì)每一個(gè)仿真信噪比EbN0_dB點(diǎn)進(jìn)行多次蒙特卡洛仿真或者發(fā)送足夠多的比特使得誤碼率統(tǒng)計(jì)結(jié)果可靠例如錯(cuò)誤比特?cái)?shù)至少幾十個(gè)。% 續(xù)接前面的主循環(huán) for snrIdx 1:numSNR % ... [前面的調(diào)制、信道、接收、解調(diào)代碼] ... % 解調(diào)完成后計(jì)算誤碼率 % 確保比較的比特流長(zhǎng)度一致去除可能因延遲處理導(dǎo)致的頭尾不對(duì)齊 minLen min(length(dataIn), length(dataOutHard)); [~, ber_hard(snrIdx)] biterr(dataIn(1:minLen), dataOutHard(1:minLen)); minLenSoft min(length(dataIn), length(dataOutSoftBits)); [~, ber_soft(snrIdx)] biterr(dataIn(1:minLenSoft), dataOutSoftBits(1:minLenSoft)); % 如果需要還可以計(jì)算符號(hào)錯(cuò)誤率 % ... end % 繪制誤碼率曲線 figure; semilogy(EbN0_dB, ber_hard, b-o, LineWidth, 1.5, DisplayName, 硬判決); hold on; semilogy(EbN0_dB, ber_soft, r-s, LineWidth, 1.5, DisplayName, 軟判決直接判決LLR); grid on; xlabel(Eb/N0 (dB)); ylabel(誤比特率 (BER)); title(64QAM在AWGN信道下的誤碼率性能); legend(Location, best);6.2 結(jié)果分析與理論對(duì)比運(yùn)行完整的仿真后你會(huì)得到兩條曲線。軟判決的性能應(yīng)該明顯優(yōu)于硬判決尤其是在中高信噪比區(qū)域。為了驗(yàn)證仿真代碼的正確性一個(gè)重要的步驟是與理論值進(jìn)行對(duì)比。對(duì)于AWGN信道下的矩形64QAM其理論誤符號(hào)率有閉式表達(dá)式而誤比特率在格雷碼映射下可以近似為BER ≈ (1/k) * SER。我們可以將理論曲線畫(huà)在同一張圖上。% 計(jì)算64QAM的理論誤符號(hào)率AWGN相干解調(diào) % 參考公式SER 2*(1-1/sqrt(M))*Qfunc( sqrt(3*k*EbN0_lin/(M-1)) ) * ... % (1 - (1-1/sqrt(M))*Qfunc( sqrt(3*k*EbN0_lin/(M-1)) ) ); % 更常用的近似公式 M 64; k log2(M); EbN0_lin 10.^(EbN0_dB/10); % 平均符號(hào)能量 Es k * Eb % 對(duì)于單位平均功率的星座最近鄰距離 d_min sqrt(2/(M-1)*3) 需要查標(biāo)準(zhǔn)公式。 % 使用通信工具箱函數(shù) ser_theory berawgn(EbN0_dB, qam, M); % 注意berawgn返回的是理論誤比特率近似值 % berawgn 給出的就是格雷碼映射下的理論BER近似。 % 因此我們可以直接對(duì)比。 % 繪制理論曲線 semilogy(EbN0_dB, ser_theory, k--, LineWidth, 1.5, DisplayName, 理論 (格雷碼映射));如果仿真曲線特別是硬判決曲線與理論曲線在高信噪比時(shí)基本重合說(shuō)明你的仿真鏈路搭建正確信道噪聲添加、功率歸一化等環(huán)節(jié)沒(méi)有錯(cuò)誤。軟判決曲線應(yīng)該位于理論曲線下方展現(xiàn)出編碼增益盡管這里我們沒(méi)有加信道編碼但軟信息本身提供了“內(nèi)在”的增益。6.3 常見(jiàn)問(wèn)題與調(diào)試技巧曲線不重合或形狀怪異首先檢查功率歸一化。確保調(diào)制時(shí)UnitAveragePower設(shè)置為true。檢查awgn函數(shù)中信噪比參數(shù)的換算是否正確。最可靠的調(diào)試方法是在極高信噪比如30dB下仿真此時(shí)誤碼率應(yīng)趨近于0。如果還有錯(cuò)誤說(shuō)明是系統(tǒng)性的映射錯(cuò)誤或同步問(wèn)題。軟解調(diào)性能反而比硬判決差檢查L(zhǎng)LR的符號(hào)定義。qamdemod輸出的LLR正負(fù)值分別對(duì)應(yīng)比特0和1的置信度。在直接判決時(shí)llr 0判為1這個(gè)規(guī)則是否與你的比特映射一致可以用一個(gè)簡(jiǎn)單例子驗(yàn)證發(fā)送全零序列在極高信噪比下接收到的LLR應(yīng)該全部是很大的正數(shù)判決結(jié)果應(yīng)為全0。仿真速度太慢如果自己實(shí)現(xiàn)了最小距離軟解調(diào)速度會(huì)非常慢。對(duì)于大規(guī)模仿真務(wù)必使用內(nèi)置的qamdemod函數(shù)或提前計(jì)算好查找表。另外蒙特卡洛仿真中低誤碼率點(diǎn)需要仿真大量比特非常耗時(shí)。可以采用“錯(cuò)誤計(jì)數(shù)達(dá)到一定數(shù)目就停止”的策略來(lái)加速。星座圖可視化在調(diào)試階段繪制發(fā)射和接收的星座圖非常有幫助。figure; subplot(1,2,1); plot(real(modSignal), imag(modSignal), b.); title(發(fā)射星座圖); axis square; grid on; subplot(1,2,2); plot(real(sampledSignal), imag(sampledSignal), r.); title(接收星座圖加噪聲后); axis square; grid on;通過(guò)觀察接收星座圖可以直觀感受噪聲大小以及是否存在明顯的相位旋轉(zhuǎn)或幅度失真如果信道模型包含了這些效應(yīng)。通過(guò)這個(gè)完整的64QAM軟解調(diào)鏈路仿真你不僅得到了誤碼率曲線這個(gè)最終結(jié)果更重要的是你走通了從比特到波形再到噪聲信道最后恢復(fù)出軟硬判決信息的全流程。這個(gè)模型是一個(gè)強(qiáng)大的基礎(chǔ)你可以在此基礎(chǔ)上輕松地修改參數(shù)如滾降因子、過(guò)采樣率、替換信道模型如瑞利衰落、或者接入真正的信道譯碼器如Viterbi譯碼器來(lái)評(píng)估級(jí)聯(lián)系統(tǒng)的性能。把程序模塊化寫(xiě)好注釋它就是你通信算法工具箱里一件非常趁手的兵器。本文還有配套的精品資源點(diǎn)擊獲取