仿真:從抽樣量化到誤碼率分析)
簡(jiǎn)介這份資源是面向通信工程、電子信息類專業(yè)學(xué)生及課程設(shè)計(jì)學(xué)習(xí)者的PCM系統(tǒng)仿真完整資料以Matlab為實(shí)現(xiàn)平臺(tái)幫助讀者理解模擬信號(hào)數(shù)字化的抽樣、量化、編碼與譯碼全流程。壓縮包內(nèi)共1個(gè)doc文件約2.09MB內(nèi)容涵蓋任務(wù)書(shū)、設(shè)計(jì)報(bào)告與程序說(shuō)明圍繞15折線法在編碼譯碼中的應(yīng)用展開(kāi)并借助Matlab驗(yàn)證抽樣定理、觀察量化效果、分析編碼譯碼誤差。資料包含緒論、基本原理、PCM系統(tǒng)仿真、仿真結(jié)果分析、結(jié)論與附錄等章節(jié)讀者可據(jù)此掌握抽樣率、量化級(jí)數(shù)與編碼規(guī)則的設(shè)置方法理解信噪比與量化噪聲等性能指標(biāo)并熟悉Matlab在通信仿真中的使用技巧。目前已有95人學(xué)習(xí)適合需要完成課程設(shè)計(jì)或夯實(shí)數(shù)字通信基礎(chǔ)的學(xué)習(xí)者參考。1. 從一份“完整資料”說(shuō)起PCM 系統(tǒng)仿真到底在仿什么很多人第一次看到“基于 Matlab 程序的 PCM 系統(tǒng)仿真”這個(gè)標(biāo)題腦子里冒出來(lái)的是一堆零散名詞抽樣、量化、編碼、低通濾波、誤碼率??烧娴絼?dòng)手時(shí)問(wèn)題就來(lái)了——我到底該先搭哪一段量化電平數(shù)設(shè)多少才不算“玄學(xué)”為什么我跑出來(lái)的波形和教材上的對(duì)不上這份所謂的“完整資料”核心價(jià)值其實(shí)不在“資料”兩個(gè)字而在于它把 PCM 從模擬信號(hào)到數(shù)字比特流、再到接收端重建的整條鏈路用 Matlab 拆成了可運(yùn)行、可改參數(shù)、可觀察中間變量的模塊。PCM脈沖編碼調(diào)制是通信系統(tǒng)里最基礎(chǔ)也最經(jīng)得起折騰的仿真對(duì)象它足夠簡(jiǎn)單讓你能把每一步都看清楚又足夠完整抽樣定理、量化噪聲、編碼位數(shù)、信道誤碼這些概念一個(gè)不落。適合誰(shuí)適合正在學(xué)通信原理、需要交仿真作業(yè)、或者想用 Matlab 快速驗(yàn)證一個(gè)數(shù)字傳輸鏈路想法的工程師和學(xué)生。你不需要昂貴的硬件一臺(tái)裝了 Matlab 的普通電腦就能把整條鏈路跑通而且每一步的中間結(jié)果都能畫(huà)出來(lái)看。2. 把 PCM 鏈路拆成四段抽樣、量化、編碼、譯碼2.1 為什么先搭“能跑通”的最小鏈路而不是一上來(lái)就摳公式我見(jiàn)過(guò)太多人一上來(lái)就翻書(shū)查量化信噪比的閉式解結(jié)果代碼里連抽樣率都沒(méi)設(shè)對(duì)。正確的順序是先讓一個(gè)正弦波走完“抽樣→量化→編碼→譯碼→重建”全程波形能大致恢復(fù)再去調(diào)參數(shù)看指標(biāo)變化。最小鏈路的意義在于它把“黑匣子”打開(kāi)讓你看到每個(gè)節(jié)點(diǎn)的數(shù)據(jù)長(zhǎng)什么樣。比如抽樣后你得到的是離散時(shí)間序列量化后變成有限個(gè)電平值編碼后變成 0/1 比特流——這三者的數(shù)據(jù)維度完全不同只有親手打印出來(lái)看才能建立直覺(jué)。2.2 抽樣與量化兩個(gè)最容易被“想當(dāng)然”的環(huán)節(jié)抽樣率不是隨便設(shè)的。對(duì)一個(gè)最高頻率為 fm 的模擬信號(hào)抽樣率 fs 必須大于 2fm這是奈奎斯特條件。但實(shí)際仿真里我一般會(huì)把 fs 設(shè)成 4fm 到 8fm原因有兩個(gè)一是便于觀察二是給后續(xù)量化留出更平滑的過(guò)渡。量化環(huán)節(jié)的關(guān)鍵參數(shù)是量化電平數(shù) L通常取 2 的整數(shù)次冪比如 16、64、256。L 越大量化噪聲越小但編碼位數(shù) n log2(L) 也越大比特率越高。這里有個(gè)血淚經(jīng)驗(yàn)量化前一定要把信號(hào)歸一化到 [-1, 1] 或 [0, 1] 區(qū)間否則量化區(qū)間的劃分會(huì)完全錯(cuò)位重建出來(lái)的波形直接翻車。% PCM 最小鏈路抽樣 均勻量化 自然二進(jìn)制編碼 clear; clc; close all; fm 10; % 模擬信號(hào)最高頻率單位 Hz fs 80; % 抽樣率取 8 倍 fm便于觀察 T 1; % 仿真時(shí)長(zhǎng)單位秒 t 0:1/fs:T-1/fs; % 離散時(shí)間軸 x sin(2*pi*fm*t); % 模擬信號(hào)10 Hz 正弦波 L 64; % 量化電平數(shù) n log2(L); % 編碼位數(shù)此處為 6 x_max max(abs(x)); % 歸一化參考 x_norm x / x_max; % 歸一化到 [-1, 1] % 均勻量化把 [-1,1] 等分成 L 個(gè)區(qū)間 delta 2 / L; % 量化步長(zhǎng) q_index floor((x_norm 1) / delta); % 量化區(qū)間索引0 到 L-1 q_index(q_index L) L - 1; % 邊界保護(hù) x_q (q_index 0.5) * delta - 1; % 量化后電平值 % 自然二進(jìn)制編碼 code dec2bin(q_index, n); % 每行是一個(gè)碼字 bits reshape(code, 1, []); % 串行比特流這段代碼的邏輯很直白先產(chǎn)生模擬信號(hào)再歸一化然后按步長(zhǎng) delta 把信號(hào)映射到最近的量化區(qū)間最后把區(qū)間索引轉(zhuǎn)成 n 位二進(jìn)制碼。參數(shù)說(shuō)明fm 決定信號(hào)變化快慢fs 決定時(shí)間分辨率L 決定量化精度。注意q_index L那行邊界保護(hù)如果不加當(dāng)信號(hào)正好等于 1 時(shí)索引會(huì)越界這是新手最常見(jiàn)的翻車點(diǎn)之一。2.3 編碼與譯碼比特流怎么變回波形編碼之后你得到的是一個(gè)一維比特流譯碼就是逆過(guò)程先把比特流按 n 位一組切分還原成量化索引再映射回電平值最后經(jīng)過(guò)低通濾波器重建模擬波形。這里有個(gè)細(xì)節(jié)譯碼后的信號(hào)是階梯狀的必須經(jīng)過(guò)一個(gè)截止頻率略高于 fm 的低通濾波器才能變得平滑。Matlab 里可以用filter配合設(shè)計(jì)好的濾波器系數(shù)也可以用interp1做插值后再濾波。我一般用前者因?yàn)楦咏鎸?shí)接收機(jī)的做法。% 譯碼比特流 - 量化索引 - 電平值 - 低通重建 bits_reshaped reshape(bits, n, []).; % 每行 n 位 q_index_rx bin2dec(bits_reshaped); % 還原量化索引 x_q_rx (q_index_rx 0.5) * delta - 1; % 還原量化電平 % 設(shè)計(jì)低通濾波器截止頻率取 1.2*fm fc 1.2 * fm; [b, a] butter(4, fc/(fs/2)); % 4 階巴特沃斯 x_recon filter(b, a, x_q_rx); % 濾波重建 % 對(duì)比繪圖 figure; subplot(3,1,1); plot(t, x); title(原始模擬信號(hào)); grid on; subplot(3,1,2); stem(t(1:40), x_q(1:40)); title(量化后信號(hào)前40點(diǎn)); grid on; subplot(3,1,3); plot(t, x_recon); title(譯碼重建信號(hào)); grid on;參數(shù)說(shuō)明butter的階數(shù) 4 是經(jīng)驗(yàn)值階數(shù)越高過(guò)渡帶越陡但相位失真越大截止頻率取 1.2fm 是為了保留基帶分量同時(shí)濾掉高頻量化噪聲。如果你發(fā)現(xiàn)重建波形幅度偏小或畸變嚴(yán)重先檢查濾波器截止頻率是不是設(shè)得太低把 fm 附近的頻率成分也濾掉了。3. 量化噪聲與誤碼率兩個(gè)必須會(huì)算的指標(biāo)3.1 量化信噪比理論值和仿真值對(duì)不上怎么辦均勻量化的理論信噪比公式是 SQNR 6.02n 1.76 dB這個(gè)公式的前提是輸入信號(hào)滿幅且服從均勻分布。但實(shí)際仿真里你用的是正弦波它的幅度分布不是均勻的所以仿真值通常會(huì)比理論值高 1 到 2 dB。這不是代碼錯(cuò)了而是公式的適用條件不同。我一般會(huì)同時(shí)跑兩組一組用正弦波看波形一組用均勻分布的隨機(jī)信號(hào)驗(yàn)證 SQNR 公式。如果后者對(duì)不上那才是代碼有問(wèn)題。% 用均勻分布信號(hào)驗(yàn)證量化信噪比 x_uniform 2*rand(1, length(t)) - 1; % [-1,1] 均勻分布 q_idx_u floor((x_uniform 1) / delta); q_idx_u(q_idx_u L) L - 1; x_q_u (q_idx_u 0.5) * delta - 1; noise x_uniform - x_q_u; sqnr_sim 10*log10(mean(x_uniform.^2) / mean(noise.^2)); sqnr_theory 6.02*n 1.76; fprintf(仿真 SQNR %.2f dB, 理論 SQNR %.2f dB\n, sqnr_sim, sqnr_theory);運(yùn)行后你會(huì)發(fā)現(xiàn)兩者非常接近差距在 0.5 dB 以內(nèi)。如果差距很大檢查量化步長(zhǎng) delta 是不是算錯(cuò)了或者索引邊界有沒(méi)有處理好。3.2 誤碼率加噪聲信道后 PCM 系統(tǒng)還剩下什么PCM 系統(tǒng)的抗噪性能最終體現(xiàn)在誤碼率上。在 Matlab 里加一個(gè) AWGN 信道很簡(jiǎn)單用awgn函數(shù)就行。但要注意PCM 的誤碼率不是直接等于信道誤碼率因?yàn)橐粋€(gè)比特錯(cuò)誤可能導(dǎo)致譯碼后的量化電平偏移一個(gè)步長(zhǎng)也可能因?yàn)楦窭状a或自然碼的映射關(guān)系導(dǎo)致多個(gè)比特錯(cuò)誤時(shí)偏移更大。我一般會(huì)跑一個(gè)誤碼率曲線橫軸是信噪比縱軸是譯碼后信號(hào)的均方誤差或誤比特率。% 加 AWGN 信道并計(jì)算誤比特率 snr_range 0:2:20; ber zeros(size(snr_range)); for k 1:length(snr_range) bits_noisy double(awgn(double(bits), snr_range(k), measured) 0.5); bits_reshaped_n reshape(bits_noisy, n, []).; q_idx_n bin2dec(num2str(bits_reshaped_n)); x_q_n (q_idx_n 0.5) * delta - 1; err sum(bits_noisy ~ double(bits)) / length(bits); ber(k) err; end semilogy(snr_range, ber, -o); xlabel(SNR (dB)); ylabel(BER); grid on;參數(shù)說(shuō)明awgn的第三個(gè)參數(shù)measured表示先測(cè)量信號(hào)功率再按給定 SNR 加噪聲這樣更準(zhǔn)確。 0.5是硬判決把帶噪的軟比特變成 0/1。如果你發(fā)現(xiàn) BER 曲線不降反升檢查一下判決門(mén)限是不是設(shè)成了 0.5 但信號(hào)本身不是雙極性。4. 避坑與排查PCM 仿真里最容易翻車的五個(gè)地方4.1 抽樣率設(shè)成 2fm 后波形完全失真現(xiàn)象重建波形和原始信號(hào)對(duì)不上頻率看起來(lái)也不對(duì)。原因抽樣率剛好等于 2fm 時(shí)理論上可以恢復(fù)但實(shí)際仿真里由于濾波器非理想和邊界效應(yīng)恢復(fù)質(zhì)量極差。解決把 fs 提高到 4fm 以上我一般用 8fm波形立刻正常。4.2 量化后信號(hào)幅度整體偏移現(xiàn)象重建信號(hào)比原始信號(hào)整體高或低一個(gè)固定值。原因量化時(shí)用了floor但沒(méi)有加 0.5 個(gè)步長(zhǎng)的偏移導(dǎo)致量化電平總是偏向區(qū)間下沿。解決量化電平取(q_index 0.5) * delta - 1這個(gè) 0.5 就是補(bǔ)償。4.3 編碼位數(shù)不是整數(shù)現(xiàn)象dec2bin報(bào)錯(cuò)或碼字長(zhǎng)度不一致。原因量化電平數(shù) L 沒(méi)有取 2 的整數(shù)次冪導(dǎo)致 log2(L) 不是整數(shù)。解決L 只取 2、4、8、16、32、64、128、256 這些值別取 100 這種數(shù)。4.4 濾波器設(shè)計(jì)后重建信號(hào)幅度衰減嚴(yán)重現(xiàn)象重建波形形狀對(duì)但幅度只有原來(lái)的一半。原因巴特沃斯濾波器的截止頻率設(shè)得太低把信號(hào)基帶分量也衰減了。解決截止頻率至少取 1.2fm如果還不行就取 1.5fm同時(shí)觀察濾波器的幅頻響應(yīng)。4.5 誤碼率曲線在高 SNR 下不收斂現(xiàn)象SNR 超過(guò) 15 dB 后 BER 還在 10^-2 附近晃。原因比特流長(zhǎng)度太短統(tǒng)計(jì)樣本不夠或者awgn的功率測(cè)量方式不對(duì)。解決把仿真時(shí)長(zhǎng) T 增加到 10 秒以上或者把measured改成手動(dòng)指定信號(hào)功率。5. 進(jìn)階技巧用 PCM 仿真驗(yàn)證一個(gè)完整的數(shù)字傳輸鏈路5.1 把量化、編碼、信道、譯碼串成函數(shù)當(dāng)你把最小鏈路跑通后下一步是把每個(gè)模塊封裝成函數(shù)這樣改參數(shù)時(shí)不用滿篇找變量。我一般會(huì)寫(xiě)四個(gè)函數(shù)pcm_sample、pcm_quantize、pcm_encode、pcm_decode主腳本只負(fù)責(zé)調(diào)用和繪圖。這樣做的好處是你可以單獨(dú)測(cè)試每個(gè)模塊比如固定量化索引只測(cè)編碼譯碼是否可逆。function [bits, q_idx] pcm_encode(x, L) n log2(L); delta 2 / L; x_norm x / max(abs(x)); q_idx floor((x_norm 1) / delta); q_idx(q_idx L) L - 1; bits reshape(dec2bin(q_idx, n), 1, []); end function x_q pcm_decode(bits, L) n log2(L); delta 2 / L; bits_reshaped reshape(bits, n, []).; q_idx bin2dec(bits_reshaped); x_q (q_idx 0.5) * delta - 1; end這兩個(gè)函數(shù)把編碼和譯碼完全對(duì)稱地實(shí)現(xiàn)了你可以用isequal驗(yàn)證對(duì)任意量化索引編碼再譯碼應(yīng)該得到相同的電平值不考慮信道噪聲。如果不等說(shuō)明邊界處理有問(wèn)題。5.2 用誤碼率曲線判斷系統(tǒng)是否值得做PCM 仿真的最終產(chǎn)出通常是一張 BER-SNR 曲線。這張圖告訴你在給定信道條件下需要多少 SNR 才能達(dá)到目標(biāo)誤碼率。比如目標(biāo) BER 是 10^-4從曲線上讀出需要 12 dB SNR那你就知道這個(gè)方案在什么場(chǎng)景下可用。如果曲線在 20 dB 還達(dá)不到 10^-4那要么增加編碼位數(shù)要么換調(diào)制方式。我一般會(huì)把不同量化位數(shù) n 的曲線畫(huà)在同一張圖上直觀看到“每增加 1 位編碼SNR 需求降低約 6 dB”這個(gè)規(guī)律。5.3 一個(gè)我踩過(guò)的坑別在循環(huán)里重復(fù)設(shè)計(jì)濾波器早期我寫(xiě)代碼時(shí)把濾波器設(shè)計(jì)放在誤碼率循環(huán)內(nèi)部每換一個(gè) SNR 就重新算一次butter系數(shù)。結(jié)果跑 10 個(gè) SNR 點(diǎn)要等好幾分鐘。后來(lái)把濾波器設(shè)計(jì)提到循環(huán)外面只算一次速度直接快了一個(gè)數(shù)量級(jí)。這個(gè)習(xí)慣我一直保持到現(xiàn)在凡是與 SNR 無(wú)關(guān)的計(jì)算全部提到循環(huán)外。5.4 驗(yàn)證方法用已知輸入反推系統(tǒng)是否正確最可靠的驗(yàn)證方法不是看波形“像不像”而是用已知的量化索引反推。比如你手動(dòng)構(gòu)造一個(gè)量化索引序列[0, 1, 2, ..., L-1]走完編碼譯碼后應(yīng)該得到等間隔的電平序列。如果得到的電平間隔不均勻說(shuō)明量化步長(zhǎng)或索引映射有 bug。這個(gè)方法比看波形圖靠譜得多因?yàn)椴ㄐ螆D容易騙過(guò)眼睛但數(shù)值不會(huì)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取