字基帶通信系統(tǒng)仿真:從原理到誤碼率曲線)
簡(jiǎn)介一份基于MATLAB的M-QAM數(shù)字基帶通信系統(tǒng)仿真報(bào)告面向通信工程、電子信息類專業(yè)學(xué)生可直接用于課程設(shè)計(jì)、數(shù)字通信實(shí)驗(yàn)報(bào)告或期末項(xiàng)目參考。壓縮包內(nèi)共1個(gè)docx文檔大小約360KB文檔內(nèi)容完整從現(xiàn)代通信頻帶利用率問(wèn)題切入詳細(xì)介紹M-QAM正交振幅調(diào)制原理、幅度相位結(jié)合提高頻譜效率的機(jī)理、星座圖分布與抗干擾能力的關(guān)系以及格雷碼在相鄰星座點(diǎn)編碼中的優(yōu)勢(shì)隨后給出基于MATLAB的4QAM/16QAM仿真實(shí)現(xiàn)包括隨機(jī)信息序列生成、格雷碼映射、qammod/qamdemod調(diào)制解調(diào)、高斯白噪聲信道疊加以及改變Eb/N0-5dB20dB繪制誤碼率曲線的完整程序并附理論誤碼率公式對(duì)照。報(bào)告還包含設(shè)計(jì)原理框圖、星座圖與仿真結(jié)果分析結(jié)構(gòu)清晰、可直接復(fù)現(xiàn)。已有182人學(xué)習(xí)下載適合需要理解M-QAM原理并快速完成仿真報(bào)告的讀者。1. “基于MATLAB的M-QAM數(shù)字基帶通信系統(tǒng)仿真報(bào)告 (2).docx”背后是什么“基于MATLAB的M-QAM數(shù)字基帶通信系統(tǒng)仿真報(bào)告 (2).docx”——這個(gè)標(biāo)題在通信工程相關(guān)的課程大作業(yè)、畢業(yè)設(shè)計(jì)和崗位測(cè)試?yán)锓磸?fù)出現(xiàn)。它看起來(lái)是一份文檔但真正動(dòng)手做過(guò)這個(gè)仿真的人會(huì)明白工作量不在“仿真”兩個(gè)字上而在M怎么選、Eb/N0怎么換算、誤碼率曲線為什么貼不合理論曲線。這篇文章不打算復(fù)述某份現(xiàn)成報(bào)告而是從零把M-QAM數(shù)字基帶通信系統(tǒng)在MATLAB里搭起來(lái)跑通把每一步命令的含義、每個(gè)參數(shù)為什么這么設(shè)、以及最常翻車的幾個(gè)細(xì)節(jié)都擺出來(lái)。適合兩類人第一次寫(xiě)基帶仿真、對(duì)著qammod函數(shù)文檔發(fā)愣的新手以及手頭有舊代碼需要改造成可復(fù)現(xiàn)結(jié)果的熟手。2. 從M看QAM的容量與代價(jià)基帶仿真的原理和選型2.1 正交幅度調(diào)制用兩路正交載波換頻帶利用率M-QAM的全稱是多進(jìn)制正交幅度調(diào)制。所謂“正交”說(shuō)的是信號(hào)可以分解成兩路相互正交的載波分量一路叫I路一路叫Q路在復(fù)平面上分別對(duì)應(yīng)實(shí)軸和虛軸。星座圖上的每一個(gè)點(diǎn)代表一種載波幅度和相位的組合一個(gè)符號(hào)攜帶k log2(M) 個(gè)比特。M16時(shí)每個(gè)符號(hào)帶4個(gè)比特M64時(shí)帶6個(gè)比特M256時(shí)帶8個(gè)比特。數(shù)字基帶仿真里不出現(xiàn)正弦振蕩器而是直接把這個(gè)星座圖當(dāng)作信號(hào)本身。發(fā)射端做的事情是把二進(jìn)制比特流按k個(gè)bit一組映射成星座圖上的復(fù)數(shù)坐標(biāo)點(diǎn)接收端則是把收到的含噪復(fù)信號(hào)按最小歐氏距離判決回原來(lái)的星座點(diǎn)再還原成比特流。整條鏈路的核心就是復(fù)平面上的映射、加噪、判決三個(gè)動(dòng)作這也是MATLAB最適合處理它的原因——復(fù)數(shù)數(shù)組天然對(duì)應(yīng)I/Q兩路。這里要強(qiáng)調(diào)一個(gè)容易混淆的點(diǎn)“數(shù)字基帶”不等于“沒(méi)有調(diào)制”。M-QAM本身就是一種調(diào)制方式所謂基帶仿真是把已調(diào)載波的高頻部分抽象掉直接在復(fù)包絡(luò)上做符號(hào)級(jí)仿真。這樣做能大幅降低仿真的計(jì)算量同時(shí)保留調(diào)制、噪聲、判決這些核心特性。對(duì)于只關(guān)心誤碼率性能的報(bào)告來(lái)說(shuō)這種等效模型是標(biāo)準(zhǔn)做法。2.2 基帶等效模型為什么發(fā)射機(jī)里沒(méi)有正弦波實(shí)際通信系統(tǒng)里M-QAM信號(hào)要調(diào)制到高頻載波上才能發(fā)射接收端也要經(jīng)過(guò)下變頻、載波同步、匹配濾波才能得到基帶信號(hào)。但在加性高斯白噪聲信道下如果載波同步理想、匹配濾波采用理想采樣整套帶通系統(tǒng)可以嚴(yán)格等效為一個(gè)復(fù)基帶模型發(fā)射端直接產(chǎn)生復(fù)數(shù)星座點(diǎn)信道只在每個(gè)符號(hào)上疊加一份復(fù)高斯噪聲接收端直接對(duì)復(fù)數(shù)樣本做判決。這個(gè)等效關(guān)系是通信原理里最值得寫(xiě)進(jìn)報(bào)告的理論基礎(chǔ)也是很多初學(xué)者覺(jué)得“仿真太簡(jiǎn)單、不真實(shí)”的原因。實(shí)際上不簡(jiǎn)單難點(diǎn)全在參數(shù)換算上。比如噪聲功率譜密度N0怎么折算成復(fù)噪聲的方差信號(hào)平均功率為1時(shí)N0和Es/N0的關(guān)系是什么——這些才是真正決定仿真結(jié)果是否可信的地方。我一般建議報(bào)告里先花半頁(yè)把“帶通→復(fù)基帶”的等效條件寫(xiě)清楚條件有三條信道是加性白噪聲、載波同步理想、符號(hào)間無(wú)碼間干擾。寫(xiě)清楚這三個(gè)前提后面所有仿真結(jié)論才有理論支撐評(píng)審也不會(huì)質(zhì)疑“為什么你的發(fā)射機(jī)沒(méi)有載波頻率”。2.3 M值選型每多一個(gè)比特噪聲容限代價(jià)是什么M值不是越大越好。星座點(diǎn)數(shù)越多相同平均發(fā)射功率下相鄰星座點(diǎn)距離越近抗噪聲能力越差。換一個(gè)角度看要達(dá)到同樣的誤碼率高階調(diào)制需要更高的信噪比。工程上選M通??磧杉乱皇窍到y(tǒng)需要的頻譜效率二是信道能提供的信噪比余量。Mk每符號(hào)比特?cái)?shù)頻譜效率上限bit/s/Hz適用信道環(huán)境1644中等信噪比蜂窩上行、微波接力6466較高信噪比短距有線、高質(zhì)量無(wú)線鏈路25688很高信噪比光纖傳輸、背板互聯(lián)上表里的頻譜效率是在理想奈奎斯特信道下的上限實(shí)際還要考慮脈沖成型的滾降系數(shù)會(huì)打折扣。最常見(jiàn)的仿真配置是16QAM和64QAM因?yàn)?56QAM對(duì)相位噪聲和幅度誤差非常敏感做純AWGN仿真雖然能跑通但離真實(shí)系統(tǒng)差距更大報(bào)告里容易被人追問(wèn)“為什么不考慮非線性失真”。選M的工程流程是先定目標(biāo)誤碼率再用理論公式反推所需Eb/N0看信道余量夠不夠。比如目標(biāo)BER1e-616QAM和64QAM需要的Eb/N0大約差45dB這個(gè)差值可以直接寫(xiě)進(jìn)選型理由里。仿真報(bào)告開(kāi)頭把這段說(shuō)清楚后面所有曲線都只是驗(yàn)證這個(gè)結(jié)論。3. 用MATLAB搭一條完整M-QAM鏈路參數(shù)、映射與加噪3.1 先定規(guī)矩仿真參數(shù)和隨機(jī)比特源仿真參數(shù)是所有工作的地基。隨便填的后果是后面誤碼率曲線對(duì)不上理論值你還不知道錯(cuò)在哪一步。我習(xí)慣把參數(shù)塊放在腳本最頂部集中管理。% 仿真參數(shù)配置 M 16; % 調(diào)制階數(shù)16/64/256 k log2(M); % 每個(gè)符號(hào)攜帶的比特?cái)?shù) nBits 6e5; % 仿真比特總數(shù)6e5能同時(shí)被4/6/8整除 EbN0dB 10; % 先取一個(gè)固定信噪比點(diǎn)試跑驗(yàn)證鏈路正確 rng(2024); % 固定隨機(jī)種子保證結(jié)果可復(fù)現(xiàn)這里有兩個(gè)細(xì)節(jié)容易被忽略。第一nBits必須能被k整除否則比特分組時(shí)會(huì)丟掉尾部若干個(gè)比特接收端比特流長(zhǎng)度對(duì)不上誤碼率會(huì)平白多出一塊恒定錯(cuò)誤。第二rng(2024)不是可選項(xiàng)而是必選項(xiàng)。沒(méi)有固定隨機(jī)種子每次運(yùn)行結(jié)果都不同報(bào)告里的數(shù)字就無(wú)法復(fù)現(xiàn)。這看起來(lái)是小事等你要把報(bào)告里的某個(gè)點(diǎn)重新跑一遍時(shí)沒(méi)有種子就只能靠運(yùn)氣。3.2 比特到符號(hào)的映射一次說(shuō)清bi2de與de2bi調(diào)制映射是整個(gè)仿真里最容易出錯(cuò)的環(huán)節(jié)。MATLAB的qammod函數(shù)接受的是符號(hào)索引而不是比特向量所以必須先完成比特分組轉(zhuǎn)索引這一步。% 發(fā)射端比特流 - 符號(hào)索引 - 復(fù)星座點(diǎn) bitsTx randi([0 1], 1, nBits); % 隨機(jī)產(chǎn)生發(fā)射比特 symIdx bi2de(reshape(bitsTx, k, [])., left-msb); % 每k個(gè)bit轉(zhuǎn)一個(gè)十進(jìn)制索引 symTx qammod(symIdx, M, gray); % 索引映射成星座點(diǎn) % 保險(xiǎn)檢查索引范圍必須落在 [0, M-1] assert(max(symIdx) M min(symIdx) 0, 符號(hào)索引越界);bi2de的作用是把二進(jìn)制向量轉(zhuǎn)成十進(jìn)制數(shù)但它的默認(rèn)位序是“右側(cè)為最高位”這和我們平時(shí)手寫(xiě)二進(jìn)制時(shí)“左側(cè)為最高位”的習(xí)慣正好相反。所以這里必須顯式指定left-msb否則比特組內(nèi)的高低比特順序是顛倒的相當(dāng)于把星座點(diǎn)重新排了一遍。對(duì)應(yīng)地接收端用de2bi還原比特時(shí)也要用left-msb收發(fā)一致才不會(huì)解錯(cuò)。qammod的第二個(gè)坑是符號(hào)索引從0開(kāi)始不是從1開(kāi)始。很多人寫(xiě)成1:M結(jié)果索引128傳進(jìn)去直接報(bào)錯(cuò)或者在高階調(diào)制時(shí)靜默映射錯(cuò)位。所以我在代碼里加了一條assert有一說(shuō)一這種邊界檢查關(guān)鍵時(shí)刻能救命。還有一個(gè)重要前提qammod默認(rèn)把星座平均功率歸一化為1。這是后續(xù)計(jì)算噪聲功率的基礎(chǔ)如果你發(fā)現(xiàn)自己的星座功率不是1后面的N0公式就全錯(cuò)了。3.3 加噪聲手動(dòng)構(gòu)造復(fù)高斯白噪聲而不是awgn加噪聲這一步我強(qiáng)烈建議手動(dòng)構(gòu)造復(fù)高斯噪聲而不是直接用awgn函數(shù)。awgn本身沒(méi)問(wèn)題但它的SNR參數(shù)定義在不同人手里解釋不一致很容易把Eb/N0直接當(dāng)SNR填進(jìn)去結(jié)果曲線整體偏了6dB還不自知。% 信道疊加復(fù)高斯白噪聲 EbN0lin 10^(EbN0dB/10); % Eb/N0 線性值 EsN0lin k * EbN0lin; % Es/N0 k * Eb/N0 N0 1 / EsN0lin; % 星座平均功率為1故 Es1N01/(Es/N0) noise sqrt(N0/2) * (randn(size(symTx)) 1j*randn(size(symTx))); symRx symTx noise;這段代碼的邏輯可以拆成四步理解。第一步把用戶給的Eb/N0轉(zhuǎn)成線性值。第二步換成符號(hào)信噪比Es/N0因?yàn)橐粋€(gè)符號(hào)包含k個(gè)比特能量自然放大k倍。第三步由Es/N0反推單邊噪聲譜密度N0。這里能用N0 1/EsN0lin這個(gè)簡(jiǎn)潔式子前提是qammod輸出的星座平均功率為1。第四步構(gòu)造復(fù)噪聲。復(fù)高斯噪聲的實(shí)部和虛部是獨(dú)立同分布的高斯隨機(jī)變量每個(gè)分量的方差是N0/2合起來(lái)總噪聲功率才是N0。randn(size(symTx))保證噪聲向量和信號(hào)向量維度完全一致這是又一個(gè)容易踩的位置。symTx是列向量噪聲也必須是列向量否則MATLAB廣播機(jī)制會(huì)悄悄給你擴(kuò)展成矩陣后面誤碼率統(tǒng)計(jì)全是亂的。3.4 解調(diào)判決與誤碼統(tǒng)計(jì)接收端的解調(diào)在AWGN信道下就是最小歐氏距離判決qamdemod函數(shù)內(nèi)部已經(jīng)完成了這件事。判決后得到的是符號(hào)索引還需要還原成比特流再統(tǒng)計(jì)錯(cuò)誤數(shù)。% 接收端復(fù)星座點(diǎn) - 符號(hào)索引 - 比特流 symIdxEst qamdemod(symRx, M, gray); % 最小歐氏距離硬判決 bitsRx de2bi(symIdxEst, k, left-msb).; bitsRx bitsRx(:).; % 展平為與bitsTx同形狀的行向量 % 誤碼統(tǒng)計(jì) assert(isequal(size(bitsTx), size(bitsRx)), 收發(fā)比特長(zhǎng)度不一致); errBits sum(bitsTx ~ bitsRx); ber errBits / nBits; fprintf(Eb/N0 %.1f dB, BER %.2e\n, EbN0dB, ber);de2bi返回的矩陣每一行是一個(gè)符號(hào)的k個(gè)比特轉(zhuǎn)置后按列展平得到的比特順序就和發(fā)射端bi2de分組前的順序一致了。這個(gè)收發(fā)位序的匹配是整個(gè)仿真鏈路正確性的核心我在后面避坑部分會(huì)再提一次。拿到單點(diǎn)誤碼率后先跑一次看看結(jié)果數(shù)量級(jí)。如果BER低得離譜先別高興去查是不是星座功率沒(méi)有歸一化如果BER高得離譜多半是位序反了。確認(rèn)單點(diǎn)正常再往下做多信噪比掃描那是下一章的內(nèi)容。4. 讓誤碼率曲線貼合理論值循環(huán)仿真與Eb/N0換算4.1 封裝單次運(yùn)行函數(shù)方便不同SNR點(diǎn)復(fù)用單點(diǎn)鏈路跑通后接下來(lái)要掃描多個(gè)Eb/N0點(diǎn)。我習(xí)慣先把單次運(yùn)行封裝成函數(shù)這樣主腳本干凈循環(huán)邏輯也清晰。function ber simulateMqamOnce(M, k, nBits, EbN0dB) % 單次M-QAM基帶鏈路仿真返回誤碼率 bitsTx randi([0 1], 1, nBits); symIdx bi2de(reshape(bitsTx, k, [])., left-msb); symTx qammod(symIdx, M, gray); % 平均功率為1 EsN0lin k * 10^(EbN0dB/10); N0 1 / EsN0lin; noise sqrt(N0/2) * (randn(size(symTx)) 1j*randn(size(symTx))); symRx symTx noise; symIdxEst qamdemod(symRx, M, gray); bitsRx de2bi(symIdxEst, k, left-msb).; bitsRx bitsRx(:).; ber sum(bitsTx ~ bitsRx) / nBits; end封裝函數(shù)時(shí)要注意一點(diǎn)如果所有信噪比點(diǎn)都從同一個(gè)隨機(jī)種子出發(fā)不同Eb/N0點(diǎn)用的是同一組隨機(jī)比特和同一序列噪聲。這其實(shí)不是壞事反而能用公共隨機(jī)數(shù)法壓低仿真曲線的抖動(dòng)讓趨勢(shì)更平滑。代價(jià)是點(diǎn)與點(diǎn)之間存在相關(guān)性但對(duì)于驗(yàn)證理論曲線來(lái)說(shuō)完全沒(méi)問(wèn)題。4.2 最小錯(cuò)誤數(shù)停止條件仿真多少數(shù)據(jù)才不抖初學(xué)者常犯的另一個(gè)錯(cuò)是固定nBits跑一遍就畫(huà)曲線。當(dāng)誤碼率降到1e-4以下時(shí)幾百個(gè)比特里可能一個(gè)錯(cuò)誤樣本都沒(méi)有算出來(lái)的BER就是0在縱坐標(biāo)對(duì)數(shù)坐標(biāo)上直接掉出圖。正確做法是用“至少觀測(cè)到多少錯(cuò)誤比特”作為停止條件。% 主腳本掃描多個(gè)Eb/N0點(diǎn) EbN0dB 0:2:20; minErrors 100; % 每個(gè)點(diǎn)至少統(tǒng)計(jì)100個(gè)錯(cuò)誤比特 nBitsOnce 6e5; % 每次調(diào)用的仿真長(zhǎng)度 berSim zeros(size(EbN0dB)); for idx 1:length(EbN0dB) totalBits 0; totalErr 0; while totalErr minErrors totalBits 1e8 berIter simulateMqamOnce(M, k, nBitsOnce, EbN0dB(idx)); nBitsIter nBitsOnce; errIter round(berIter * nBitsIter); totalBits totalBits nBitsIter; totalErr totalErr errIter; end berSim(idx) totalErr / totalBits; endminErrors取100是一個(gè)經(jīng)驗(yàn)值。如果只想看數(shù)量級(jí)50也夠如果要畫(huà)進(jìn)正式報(bào)告300更穩(wěn)妥。錯(cuò)誤數(shù)太少時(shí)BER的置信區(qū)間很寬曲線是鋸齒狀看起來(lái)很不專業(yè)。上限1e8比特是用來(lái)防止死循環(huán)的高信噪比下錯(cuò)誤數(shù)很難積累一直跑下去會(huì)等到天荒地老。這里還有一個(gè)計(jì)算量的現(xiàn)實(shí)問(wèn)題64QAM和256QAM每符號(hào)攜帶的比特?cái)?shù)多統(tǒng)計(jì)同樣數(shù)量的錯(cuò)誤比特需要更少的符號(hào)數(shù)但星座點(diǎn)密集誤碼率本身也更高。實(shí)際跑的時(shí)候先掃一遍看趨勢(shì)再?zèng)Q定哪些點(diǎn)需要加大樣本量別一上來(lái)全量跑。4.3 Eb/N0、Es/N0、SNR三者換算差6dB的常見(jiàn)翻車點(diǎn)三分貝和六分貝的差別在這個(gè)仿真里是最經(jīng)典的玄學(xué)問(wèn)題。很多人的曲線整體右移一段距離形狀和理論曲線完全一致但就是差一個(gè)固定dB數(shù)基本可以斷定是能量換算出了問(wèn)題。參數(shù)含義換算關(guān)系Eb/N0每比特能量 / 噪聲功率譜密度報(bào)告橫軸的標(biāo)準(zhǔn)Es/N0每符號(hào)能量 / 噪聲功率譜密度Es/N0 k × Eb/N0SNR信號(hào)功率 / 噪聲功率符號(hào)率采樣星座功率歸一化時(shí)SNR Es/N0用16QAM舉一個(gè)具體例子。當(dāng)Eb/N0 10dB時(shí)線性值是10k4所以Es/N0 40換算成dB就是16dB。如果你直接把10dB當(dāng)成awgn的SNR參數(shù)傳入等于把噪聲功率放大了4倍等效信噪比憑空少了6dB。這就是“曲線右移6dB”的來(lái)源。我的建議是徹底繞開(kāi)awgn用4.1節(jié)里的手動(dòng)加噪方式。每次手工寫(xiě)下N0 1/EsN0lin你被迫思考噪聲功率從哪里來(lái)而不是把SNR當(dāng)黑匣子交給函數(shù)處理。仿真類的誤差排查本來(lái)就是靠這些顯式關(guān)系才能快速定位。4.4 用berawgn畫(huà)理論曲線驗(yàn)證仿真正確性仿真值有沒(méi)有算對(duì)最終要拿理論值來(lái)對(duì)標(biāo)。MATLAB的berawgn函數(shù)可以直接給出M-QAM在格雷映射下的理論誤碼率不需要自己寫(xiě)閉式公式。% 計(jì)算理論誤碼率并繪圖 berTheory berawgn(EbN0dB, qam, M); figure; semilogy(EbN0dB, berSim, o-, LineWidth, 1.2); hold on; semilogy(EbN0dB, berTheory, s--, LineWidth, 1.2); grid on; xlabel(Eb/N0 (dB)); ylabel(BER); legend(仿真值, 理論值, Location, southwest);為什么不用手寫(xiě)公式M-QAM的理論誤碼率在高階時(shí)沒(méi)有特別簡(jiǎn)單的閉式表達(dá)手寫(xiě)近似公式在64QAM和256QAM階段可能偏差可觀反而干擾排查。berawgn用的是精確級(jí)數(shù)展開(kāi)能處理任意方形QAM報(bào)告里把結(jié)果來(lái)源寫(xiě)清楚就行。畫(huà)完之后看兩條曲線的貼合情況。低信噪比區(qū)域通常貼合得比較好因?yàn)殄e(cuò)誤事件多、統(tǒng)計(jì)穩(wěn)定高信噪比區(qū)域如果出現(xiàn)系統(tǒng)性偏差優(yōu)先查噪聲功率換算如果是個(gè)別點(diǎn)上跳下跳那多半是錯(cuò)誤樣本數(shù)不夠去提高minErrors。5. 避坑清單M-QAM仿真里最常見(jiàn)的5個(gè)翻車現(xiàn)場(chǎng)這一章的內(nèi)容都是我在跑這個(gè)仿真時(shí)踩過(guò)的坑每一條按現(xiàn)象、原因、解決的順序?qū)懪挪閱?wèn)題時(shí)可以直接對(duì)照。5.1 無(wú)噪聲時(shí)誤碼率不為0比特位序和符號(hào)索引從頭錯(cuò)起現(xiàn)象把噪聲設(shè)成0理想信道下仿真出來(lái)的BER居然是20%甚至更高。原因發(fā)射端bi2de和接收端de2bi的位序沒(méi)有統(tǒng)一。最常見(jiàn)的是bi2de用了默認(rèn)的right-msbde2bi卻指定了left-msb或者反過(guò)來(lái)。另一個(gè)高發(fā)問(wèn)題是符號(hào)索引從1開(kāi)始傳給qammod而函數(shù)期望的是0到M-1。解決收發(fā)兩端統(tǒng)一用left-msb并且加上斷言檢查索引范圍。assert(max(symIdx) M min(symIdx) 0, 符號(hào)索引范圍錯(cuò)誤);這句斷言放在調(diào)制映射后零成本就能攔住一類最隱蔽的錯(cuò)。5.2 高信噪比誤碼率出現(xiàn)地板總比特?cái)?shù)沒(méi)對(duì)齊現(xiàn)象64QAM仿真時(shí)Eb/N0超過(guò)18dB以后BER曲線平了停在1e-3左右不再下降看起來(lái)像是有個(gè)誤碼率地板。原因nBits不是k的整數(shù)倍。例如nBits 1e5k 6發(fā)射端實(shí)際只用了99996個(gè)比特做分組剩下4個(gè)比特被丟棄接收端解調(diào)出的比特長(zhǎng)度是99996與發(fā)射端比對(duì)時(shí)多出的4個(gè)比特全部判錯(cuò)這部分錯(cuò)誤與SNR無(wú)關(guān)所以形成地板。解決參數(shù)初始化時(shí)直接保證整除。nBits floor(nBits / k) * k; % 強(qiáng)制對(duì)齊到k的整數(shù)倍這是一個(gè)不仔細(xì)看根本發(fā)現(xiàn)不了的錯(cuò)誤因?yàn)榈匕逦恢貌桓卟坏秃苋菀妆划?dāng)成信道編碼或者噪聲底的正常現(xiàn)象。遇到BER曲線壓不下去第一反應(yīng)檢查nBits能否被k整除。5.3 星座圖被壓成一條線只給實(shí)部加了高斯噪聲現(xiàn)象用scatterplot看接收星座圖散點(diǎn)云團(tuán)沿一個(gè)方向明顯拉長(zhǎng)甚至擠成一條線。原因噪聲構(gòu)造寫(xiě)成了noise sqrt(N0)randn(size(symTx))只加了實(shí)部噪聲虛部完全沒(méi)有隨機(jī)性。QAM在兩路同時(shí)攜帶信息噪聲也必須是復(fù)噪聲。解決用randn 1jrandn構(gòu)造并且每個(gè)分量的方差是N0/2。noise sqrt(N0/2) * (randn(size(symTx)) 1j*randn(size(symTx)));只加實(shí)部噪聲時(shí)QAM的性能和同軸PAM差不多誤碼率曲線自然對(duì)不上理論值。而且這種錯(cuò)誤在數(shù)值上不容易看出來(lái)因?yàn)锽ER差別可能只有幾個(gè)dB只有看星座圖才能一眼識(shí)破。5.4 仿真值比理論值還低統(tǒng)計(jì)樣本不夠不是代碼更牛現(xiàn)象個(gè)別Eb/N0點(diǎn)上的仿真BER比理論值低一個(gè)數(shù)量級(jí)曲線看起來(lái)完美“優(yōu)于”理論很多新手高興得以為自己的鏈路有什么額外增益。原因錯(cuò)誤事件是隨機(jī)過(guò)程仿真統(tǒng)計(jì)到的錯(cuò)誤數(shù)太少時(shí)BER估計(jì)值的方差非常大。比如理論BER1e-5你只跑了6e5比特平均只有6個(gè)錯(cuò)誤多一個(gè)少一個(gè)結(jié)果差20%。解決提高minErrors到100以上低誤碼率點(diǎn)可以單獨(dú)加長(zhǎng)仿真。有一種情況要區(qū)分如果仿真值整體系統(tǒng)性地低于理論值那要去查qammod的格雷映射和理論公式是否對(duì)應(yīng)如果只是個(gè)別點(diǎn)下跳純粹是樣本量問(wèn)題。后者重跑或者加大樣本量就會(huì)恢復(fù)正常。5.5 換版本/換電腦后結(jié)果不一致星座映射參數(shù)沒(méi)寫(xiě)死現(xiàn)象同一份腳本在同事的MATLAB上跑出來(lái)的星座圖旋轉(zhuǎn)了90度BER曲線也變了。原因不同版本的qammod/qamdemod對(duì)默認(rèn)星座映射的處理有差異有的版本默認(rèn)自然映射有的版本默認(rèn)格雷映射發(fā)送端和接收端如果都依賴默認(rèn)行為一旦默認(rèn)變了就會(huì)被解錯(cuò)。解決顯式指定映射方式收發(fā)兩端都寫(xiě)死gray。symTx qammod(symIdx, M, gray); symIdxEst qamdemod(symRx, M, gray);同一個(gè)道理星座平均功率也建議顯式確認(rèn)。qammod在這些版本里通常默認(rèn)歸一化到單位平均功率但為了保險(xiǎn)可以在加噪前用mean(abs(symTx).^2)快速驗(yàn)證一下不是1就手動(dòng)歸一化??蓮?fù)現(xiàn)比迷信默認(rèn)配置值錢得多。6. 讓“仿真報(bào)告”可復(fù)現(xiàn)隨機(jī)種子、矢量圖和檢查清單寫(xiě)報(bào)告時(shí)代碼能不能被重新跑出來(lái)比結(jié)果本身更重要。我的第一個(gè)習(xí)慣是讓腳本第一行固定隨機(jī)種子并且把這個(gè)種子寫(xiě)進(jìn)報(bào)告附錄。rng(2024); % 腳本最頂部固定隨機(jī)種子報(bào)告中注明固定種子的價(jià)值在三個(gè)月后才會(huì)體現(xiàn)。當(dāng)你需要把報(bào)告里的某個(gè)數(shù)據(jù)點(diǎn)取出來(lái)重新分析時(shí)只要種子相同、代碼未變結(jié)果就一字不差。沒(méi)有種子的腳本只是一堆隨機(jī)數(shù)的臨時(shí)組合。出圖環(huán)節(jié)同樣需要刻意處理。很多人習(xí)慣直接截圖放在報(bào)告里位圖放大后發(fā)虛不說(shuō)坐標(biāo)軸范圍和底色都是可控的。我通常用矢量圖導(dǎo)出確保在文檔里任何縮放都清晰exportgraphics(gcf, ber_curve.pdf, ContentType, vector);如果當(dāng)前MATLAB版本沒(méi)有這個(gè)函數(shù)可以用print替代。出圖后檢查三件事圖例要標(biāo)明實(shí)線和虛線的含義橫軸寫(xiě)清楚單位是Eb/N0(dB)還是SNR(dB)這兩個(gè)經(jīng)常被混寫(xiě)縱軸用對(duì)數(shù)坐標(biāo)確保曲線趨勢(shì)在低誤碼率區(qū)充分展開(kāi)。坐標(biāo)軸范圍也要固定不要用自動(dòng)范圍否則重跑時(shí)圖形坐標(biāo)變了兩張圖放一起對(duì)比會(huì)誤導(dǎo)人。提交報(bào)告前再過(guò)一遍這份檢查清單星座圖在無(wú)噪聲時(shí)是否仍是標(biāo)準(zhǔn)網(wǎng)格BER曲線在低信噪比區(qū)是否與理論曲線貼合文件中是否記錄了隨機(jī)種子和仿真參數(shù)表。有一次我把別人給的圖直接截圖放進(jìn)報(bào)告橫軸寫(xiě)的是SNR實(shí)際仿真用的是Eb/N0兩者差了6dB整章的對(duì)比結(jié)論全部錯(cuò)位最后只能推翻重來(lái)。從此我要求自己出圖前先核對(duì)軸標(biāo)簽和坐標(biāo)范圍并把隨機(jī)種子寫(xiě)進(jìn)附錄確保任何一次重跑都能得到一模一樣的曲線。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取