:BPSK調(diào)制解調(diào)與卷積編解碼完整鏈路設(shè)計)
簡介這是基于BPSK調(diào)制解調(diào)與卷積編解碼的FPGA工程源碼采用Vivado2020.1開發(fā)并已通過測試適合通信相關(guān)專業(yè)學生、FPGA開發(fā)者以及需要搭建數(shù)字基帶收發(fā)驗證平臺的工程師。壓縮包共包含1691個文件約88.43MB其中除了7個Verilog源文件與5個IP核配置外還包括大量VHDL/Verilog源碼、xdc約束、xci配置、do/sh/bat仿真腳本、log日志與txt說明等工程結(jié)構(gòu)清晰便于直接打開、仿真與綜合。目前已有433人學習下載說明該方案在通信系統(tǒng)課程設(shè)計與FPGA實現(xiàn)方面有一定關(guān)注度。工程內(nèi)的模塊劃分明確配合博客中的方案介紹讀者可以快速理解BPSK調(diào)制解調(diào)與卷積編解碼在FPGA上的實現(xiàn)思路根據(jù)仿真腳本和約束文件進行復現(xiàn)也可針對具體參數(shù)做修改或二次開發(fā)適合課程設(shè)計、畢業(yè)設(shè)計及通信FPGA入門實踐。1. 項目概述與設(shè)計思路1.1 這個工程解決什么問題最近在整理一套基于BPSK調(diào)制解調(diào)與卷積編解碼的完整FPGA工程發(fā)射鏈路從隨機數(shù)據(jù)源開始依次經(jīng)過卷積編碼、BPSK映射、基帶成型、中頻調(diào)制最終形成可供DAC輸出的中頻信號接收鏈路則從ADC采樣數(shù)據(jù)出發(fā)依次完成數(shù)字下變頻、匹配濾波、載波同步、定時同步、數(shù)據(jù)判決最后用Viterbi譯碼還原出原始信息比特。這條鏈路是數(shù)字通信物理層最經(jīng)典、最基礎(chǔ)的一條完整通路把BPSK調(diào)制解調(diào)和卷積編解碼這兩塊獨立的知識點真正串成了閉環(huán)。這個工程適合三類人看。一是正在做無線通信相關(guān)FPGA開發(fā)的工程師需要一套能完整復現(xiàn)的收發(fā)鏈路參考二是通信工程或電子工程專業(yè)的學生做課設(shè)或者畢業(yè)設(shè)計時可以直接在這個源碼基礎(chǔ)上改參數(shù)、加模塊三是對同步算法、誤碼性能如何在硬件上落地感興趣的同學。整個工程不依賴特定廠商的高級加密IP代碼盡量手工RTL實現(xiàn)方便理解和二次修改這是這套源碼最核心的定位。1.2 關(guān)鍵參數(shù)選型先給出整套系統(tǒng)的核心參數(shù)后續(xù)模塊都圍繞這些參數(shù)展開參數(shù)數(shù)值說明符號速率1 MspsBPSK一個符號對應一個編碼后碼元ADC/DAC采樣率16 MSps16倍過采樣方便濾波與同步環(huán)路工作中頻頻率4 MHz低中頻方案規(guī)避零中頻直流偏置問題卷積碼(2,1,3)生成多項式[7,5]八進制約束長度3編碼后碼率2 Msps1/2碼率卷積編碼輸出后符號速率翻倍成型濾波RRC滾降0.3收發(fā)端各一級根升余弦濾波器FPGA平臺Artix-7 XC7A35T資源占用約15%適合入門板卡復現(xiàn)為什么不直接用更高階的調(diào)制BPSK雖然頻譜效率只有1bps/Hz但結(jié)構(gòu)極其簡單相位只有0和π兩種狀態(tài)判決域非常清晰用來驗證卷積編解碼、同步環(huán)路這些核心機制是最不會被調(diào)制復雜度干擾的路線。等這套鏈路跑通把映射級改成QPSK或者16QAM再對應改一下判決門限和誤差提取方式就能平滑升級到高階調(diào)制這點在后面擴展章節(jié)細說。參數(shù)里最值得留意的是中頻和采樣率的配比。4MHz中頻、16MHz采樣正好滿足帶通采樣定理而且采樣率是中頻的4倍數(shù)字混頻時NCO產(chǎn)生4MHz正弦波頻率控制字正好是2^30這種整數(shù)硬件上極大簡化了頻率字計算。實際調(diào)試中這個整數(shù)關(guān)系能幫你快速排除NCO配置錯誤因為混頻后頻譜位置非常干凈。1.3 為什么選BPSK卷積碼這套組合BPSK與卷積碼的組合本質(zhì)上是很多實際通信系統(tǒng)的基礎(chǔ)原型。卷積碼是記憶型糾錯碼它不把輸入比特獨立編碼而是通過移位寄存器把前后比特的約束關(guān)系編碼到輸出中因此抗突發(fā)噪聲的能力比分組碼更平滑。FPGA實現(xiàn)卷積碼最大的優(yōu)勢在于編碼器結(jié)構(gòu)就是移位寄存器和異或門資源消耗幾乎可以忽略譯碼端雖然Viterbi算法復雜度隨約束長度指數(shù)增長但(2,1,3)這種約束長度只有4個狀態(tài)在FPGA里跑起來非常輕松。另一個選擇原因是調(diào)試友好。BPSK調(diào)制解調(diào)的所有中間信號都是窄位寬數(shù)據(jù)用ILA抓波形非常直觀。卷積編碼器輸出可以直接和BPSK映射前的源數(shù)據(jù)對照Viterbi譯碼輸出可以和發(fā)射端最原始的比特流逐位比對整個鏈路任何一個環(huán)節(jié)出問題都能通過波形快速定位到具體模塊這對一個供學習參考的工程源碼來說至關(guān)重要。2. 發(fā)射端實現(xiàn)編碼與調(diào)制2.1 卷積編碼器的RTL實現(xiàn)卷積編碼器是發(fā)射鏈路數(shù)據(jù)進入信道前的第一步。(2,1,3)卷積碼由三級移位寄存器、兩個異或求和節(jié)點和一個串并變換輸出組成。生成多項式[7,5]六進制對應二進制111和101意思是第一個輸出碼字由當前輸入與前兩級寄存器異或得到第二個輸出碼字由當前輸入與第二級寄存器異或得到。寄存器每個符號周期移位一次每個輸入比特產(chǎn)生兩個輸出碼元碼率自然就是1/2。RTL實現(xiàn)代碼量很小核心就是三段式輸入打拍、異或計算、輸出拼接。但有一點必須提醒編碼器啟動前寄存器必須清零否則前幾個符號的編碼輸出是無效的。連續(xù)幀傳輸時每幀開始前都要對編碼器做一次復位操作。我在工程里習慣在編碼器前面加一個幀頭插入模塊幀頭采用固定PN序列這樣接收端可以用幀頭做同步捕獲和相位翻轉(zhuǎn)消除。幀頭不參與卷積編碼相當于已知序列調(diào)試時非常有用。編碼器輸出是2比特并行但后續(xù)BPSK映射按符號處理所以需要一個2比特轉(zhuǎn)1符號的緩沖??梢灾苯影褍蓚€碼元并行送到映射模塊每拍處理一個碼元對應一個BPSK符號速率等于碼元速率2Msps也可以先做并串轉(zhuǎn)換再按符號時鐘處理。我用的是后一種方案同時引入隨路有效信號valid標示數(shù)據(jù)有效后續(xù)所有模塊都遵守AXI4-Stream握手約定。這種接口風格雖然看起來比簡單valid-enable多幾個信號但模塊之間天然支持反壓后續(xù)插入FIFO、調(diào)試模塊或者替換成DMA都非常順。2.2 BPSK映射與成型濾波BPSK映射就是把1比特數(shù)據(jù)映射成雙極性電平。我采用的映射關(guān)系是編碼輸出0映射為1編碼輸出1映射為-1。這里要注意映射關(guān)系本身不影響系統(tǒng)性能只需要發(fā)射端和接收端的判決規(guī)則保持一致即可。如果映射反了接收端要么全部判反要么譯碼輸出全錯排查起來也簡單看解調(diào)前星座圖兩簇點是否與理論位置匹配就行。成型濾波選擇根升余弦濾波器滾降系數(shù)0.3。接收端再接一級相同的根升余弦濾波器兩級級聯(lián)等效為升余弦濾波器實現(xiàn)無碼間干擾傳輸。濾波器階數(shù)我選了40階16倍過采樣下每符號16個采樣點加上濾波器自身的抽頭數(shù)整體運算量不大。FPGA實現(xiàn)有兩種路線一種直接調(diào)用Xilinx FIR Compiler IP另一種手工用乘累加器實現(xiàn)轉(zhuǎn)置結(jié)構(gòu)FIR。如果目標是學習源碼和二次開發(fā)建議手工實現(xiàn)這樣能徹底搞清抽頭系數(shù)怎么量化、信號位寬怎么增長后續(xù)換成定制濾波器也能繞開IP。濾波器系數(shù)先用MATLAB的rcosdesign函數(shù)生成然后轉(zhuǎn)成Q定點格式。系數(shù)定點化之后一定要重新看頻響特性幅度波動一般控制在0.1dB以內(nèi)即可。濾波輸出的信號位寬會隨著抽頭累加而增長需要根據(jù)仿真結(jié)果做截位把有效位保留下來防止信號飽和或者量化噪聲惡化。這里有個經(jīng)驗截位前先看濾波輸出波形峰峰值再對應選擇保留位寬不要盲目截斷低位。2.3 中頻調(diào)制與DDS載波生成基帶成型后的信號是16MSps采樣率的基帶波形需要搬到4MHz中頻。數(shù)字上變頻的標準做法是產(chǎn)生一個4MHz的NCO正弦載波與基帶信號相乘。由于16MHz采樣率正好是4MHz的4倍NCO相位累加器每四個采樣點走過一個完整周期相位步進正好是2^30硬件實現(xiàn)非常直接。我用32位相位累加器頻率控制字通過公式freq f_carrier * 2^32 / f_s計算4MHz載波代入后正好是2^30。乘法器這里有一個關(guān)鍵點基帶信號和載波相乘后會產(chǎn)生2倍頻分量這個分量在接收端下變頻之后會被低通濾波器濾除但中間信號位寬必須擴到足夠大否則乘法器輸出溢出會導致整個信號失真。實際編碼里我給了基帶信號12bitNCO正余弦各12bit乘法輸出截位到16bit送給DAC功耗和指標都比較均衡這也是很多通信板卡常用的位寬配比。中頻調(diào)制完成后發(fā)射鏈路處理完畢。DAC芯片如果是16bit信號動態(tài)范圍完全夠用如果DA位寬不足可以做簡單的MSB截位或者加噪聲整形不過這個工程里14bit以上都無所謂調(diào)試時優(yōu)先關(guān)注頻譜是否干凈、符號速率是否正確即可。3. 接收端實現(xiàn)同步與解調(diào)3.1 數(shù)字下變頻與匹配濾波接收端ADC采樣后的信號是4MHz中頻數(shù)字信號第一步做數(shù)字混頻把信號搬回零中頻?;祛l需要一個與發(fā)射端同頻同相的本地載波由Costas環(huán)產(chǎn)生。初始階段先假設(shè)本地NCO頻率接近4MHz后續(xù)通過環(huán)路鎖定校正頻偏和相偏?;祛l后的I/Q兩路分別代表基帶信號的實部和虛部BPSK信號此時能量主要集中在I路上。數(shù)字混頻之后是低通濾波器主要濾除混頻產(chǎn)生的和頻分量同時起到抗混疊作用。這個低通濾波器我直接復用了發(fā)射端RRC匹配濾波器的硬件結(jié)構(gòu)只是系數(shù)替換成低通模式。如果中頻頻率和采樣率關(guān)系處理得好可以先在混頻輸出用CIC抽取濾波器把采樣率降到適當倍數(shù)再用FIR做精細濾波能省不少乘法器資源。但這個工程里符號率只有1Msps直接16倍采樣率跑FIR乘法器數(shù)量也在可接受范圍內(nèi)所以我沒做抽取反而讓后面同步環(huán)路的性能更好調(diào)試。匹配濾波放在混頻之后將接收信號與發(fā)射端RRC進行匹配兩級RRC級聯(lián)為升余弦輸出波形在采樣點位置的信噪比達到最大。匹配濾波系數(shù)必須和發(fā)射端完全一致兩個濾波器系數(shù)在工程里放在同一個頭文件或常量定義中防止版本不一致。這個問題我踩過坑有一次發(fā)射端改系數(shù)只改了RTL文件沒改仿真文件結(jié)果MATLAB模型和RTL仿真對不上排查了一個多小時。3.2 Costas載波同步環(huán)BPSK解調(diào)必須有載波同步否則本地載波和接收信號之間存在頻率偏差和相位偏差解調(diào)結(jié)果會旋轉(zhuǎn)誤碼率直線上升。我使用的是經(jīng)典Costas環(huán)利用I/Q兩路輸出提取相位誤差e sign(I) × Q。這個誤差信號經(jīng)過環(huán)路濾波器之后反饋控制本地NCO的頻率字形成一個負反饋閉環(huán)。環(huán)路濾波器采用二階結(jié)構(gòu)包含比例項和積分項。比例系數(shù)Kp決定環(huán)路的快速響應能力積分系數(shù)Ki決定穩(wěn)態(tài)精度。這兩個系數(shù)需要根據(jù)環(huán)路帶寬和符號速率來設(shè)定工程上常用公式Kp 2ξωnTs、Ki ωn2Ts2估算。我實測下來環(huán)路帶寬取符號速率的1/100左右比較合適帶寬太寬會引入噪聲導致星座點抖動太窄則鎖定時間過長測試耐心都要被磨沒了。Costas環(huán)鎖定之后本地NCO頻率字就是接收信號載波頻率的精確估計可以直接讀出來做頻率顯示或校準。這里必須點一下BPSK特有的相位模糊問題Costas環(huán)穩(wěn)定在0度和180度兩個收斂點0度時星座正確180度時解調(diào)輸出完全反相。工程上最簡單的解決方法是在編碼前做差分編碼接收端判決后做差分譯碼代價是引入一定誤碼擴散但換來絕對的相位魯棒性。這個工程里我先用幀頭獨特字檢測判斷是否反相如果反相則在判決輸出端對符號取反再通過FIFO對齊到正確幀起始位置。兩種方案都可以差分編碼對連續(xù)業(yè)務更穩(wěn)獨特字方案對突發(fā)幀更友好。3.3 Gardner定時同步與判決載波同步解決了相位問題但采樣時刻不一定落在符號峰值點所以還需要定時同步。我用的是Gardner算法它不需要額外導頻利用每個符號的兩個采樣點和中間點做誤差提取誤差公式為e mid × (late - early)。這里的early和late分別表示當前符號峰值前的采樣點和下一符號峰值前的采樣點mid是二者中間位置。Gardner環(huán)路的符號定時NCO控制插值濾波器的分數(shù)間隔輸出符號率數(shù)據(jù)流給判決模塊。插值濾波器我用四次多項式插值比線性插值精度高很多資源消耗也不大。環(huán)路濾波同樣用二階結(jié)構(gòu)系數(shù)設(shè)計和Costas環(huán)類似只是輸入信號不同。調(diào)試時有一個直觀現(xiàn)象環(huán)路鎖定時誤差信號的平均值接近零同時眼圖張開最大從ILA里看I路波形就能判斷定時是否準確。定時同步完成之后輸出數(shù)據(jù)送到判決模塊。BPSK判決就是根據(jù)I路符號的正負決定輸出0還是1非常直接。如果接收鏈路想再做完整一點這里還可以加AGC或者信道均衡但在室內(nèi)短距離、信噪比足夠的情況下不加也不影響鏈路演示。工程里我保留了AGC接口預留位后續(xù)接真實射頻前端時可以直接補上。4. Viterbi譯碼器從理論到RTL4.1 譯碼器架構(gòu)與狀態(tài)管理Viterbi譯碼是整個工程里計算量最大的部分。(2,1,3)卷積碼有4個狀態(tài)每個狀態(tài)對應移位寄存器前兩級寄存器的取值組合。譯碼過程就是在一張時間為橫軸、狀態(tài)為縱軸的網(wǎng)格圖上尋找一條累計度量最小的幸存路徑。FPGA實現(xiàn)Viterbi譯碼器首先要確定判決方式。硬判決把解調(diào)輸出量化成0或1分支度量用漢明距離軟判決則保留多比特軟信息分支度量用歐氏距離。軟判決在AWGN信道下相對硬判決有大約2dB的編碼增益代價是分支度量和路徑度量的位寬增加。這個工程里我實現(xiàn)了軟判決版本解調(diào)器判決模塊只做符號到軟信息的映射不直接輸出硬比特軟信息位寬選4bit兼顧性能和資源。實際測試下來4bit軟信息和8bit軟信息的性能差距小于0.3dB但資源省了不少。狀態(tài)度量存儲是Viterbi的核心問題。每級路徑度量需要存儲4個狀態(tài)的值并且度量值會持續(xù)增長需要歸一化處理。工程上用模2^M自動溢出的辦法讓兩個并發(fā)路徑之差保持在較小范圍內(nèi)省去額外歸一化電路前提是M選得足夠大真實路徑度量差不發(fā)生翻轉(zhuǎn)。我這里是10bit度量位寬實測沒出過問題。如果約束長度升級到7狀態(tài)數(shù)變成64度量位寬也需要同步加大。4.2 ACS單元與路徑回溯的工程實現(xiàn)Viterbi譯碼器的核心是加比選單元每個狀態(tài)完成三步把前級兩個狀態(tài)的路徑度量加上對應分支度量比較大小選擇較小值作為當前狀態(tài)路徑度量同時記錄幸存路徑信息。四個狀態(tài)就是四個并行的ACS單元。因為(2,1,3)結(jié)構(gòu)簡單我直接展開成4個ACS單元每個單元工作在一個符號周期內(nèi)16MHz時鐘處理2Msps碼元速率運算量不是瓶頸流水線控制在3級以內(nèi)就能收時序。路徑回溯長度一般取約束長度的5到8倍約束長度3時回溯深度取32足夠?;厮輰崿F(xiàn)有寄存器交換法和回溯法兩種。寄存器交換法實時性高但寄存器消耗大回溯法用RAM存儲幸存路徑信息每解碼一個符號需要回溯幾拍。我用的是回溯法狀態(tài)幸存路徑寫入雙口RAM回溯時從當前最優(yōu)狀態(tài)倒推。這里有個容易忽略的細節(jié)回溯輸出的順序和編碼順序是反的需要做一個反序FIFO修正否則譯碼結(jié)果完全不可用。整個Viterbi譯碼模塊的流水線節(jié)拍設(shè)計很有講究。ACS、幸存路徑寫入、回溯、反序輸出四個階段用四級流水并行吞吐率就能穩(wěn)定跟上符號率。如果以后要升級成約束長度7的(2,1,7)碼狀態(tài)數(shù)變成64個ACS單元可以復用同一個硬件結(jié)構(gòu)做時分復用代價是時鐘頻率要求更高工作量主要在狀態(tài)映射和RAM深度的修改上。5. 工程源碼結(jié)構(gòu)、仿真與板上驗證5.1 源碼模塊劃分這個工程采用典型的層次化設(shè)計頂層模塊下面掛發(fā)射和接收兩條子鏈路收發(fā)之間在頂層直接相連做成一個自環(huán)模式方便在單板上完成全鏈路驗證。模塊劃分如下模塊功能top_bpsk_conv頂層例化收發(fā)鏈路連接時鐘復位tx_data_gen偽隨機數(shù)據(jù)源用于誤碼統(tǒng)計tx_conv_encoder卷積編碼器tx_bpsk_modBPSK映射、成型濾波、中頻調(diào)制rx_nco_mixer本地NCO、數(shù)字混頻rx_match_filterRRC匹配濾波rx_costasCostas載波同步rx_gardnerGardner定時同步rx_viterbiViterbi譯碼rx_bit_align幀對齊、反相補償、誤碼統(tǒng)計所有模塊都使用AXI4-Stream接口傳輸數(shù)據(jù)tvalid和tready握手tlast表示幀尾。這種接口風格雖然比簡單valid-enable多幾個信號但模塊之間天然支持反壓后續(xù)在模塊間插入FIFO、調(diào)試模塊或者把某一段替換成DMA都非常順。頂層連接時也做了跨時鐘域處理ADC時鐘和系統(tǒng)邏輯如果不同域在接口處加異步FIFO同步避免亞穩(wěn)態(tài)問題。5.2 Testbench設(shè)計與仿真觀測點Testbench是整個工程調(diào)試的第一道防線。我寫tb的時候重點不是把所有信號都拉出來看而是盯幾個關(guān)鍵節(jié)點發(fā)射端的原始數(shù)據(jù)、編碼輸出、調(diào)制波形接收端的混頻I/Q波形、環(huán)路誤差信號、定時誤差信號、軟信息輸出、Viterbi譯碼輸出。在Vivado Simulator里跑完仿真直接把發(fā)射端原始數(shù)據(jù)和接收端Viterbi譯碼后數(shù)據(jù)做逐位比對統(tǒng)計出誤碼率。仿真里加噪聲是必要測試項。我在發(fā)射端中頻輸出處疊加高斯白噪聲模塊用Box-Muller法生成高斯隨機數(shù)噪聲功率按SNR設(shè)定換算。不同SNR下跑誤碼率曲線可以驗證編碼增益是否正常。BPSK卷積碼(2,1,3)在10dB以上基本零誤碼8dB左右會有少量誤碼這個結(jié)果和理論曲線對得上說明鏈路實現(xiàn)正確。如果發(fā)現(xiàn)誤碼率明顯偏大優(yōu)先查定時同步是否鎖定準確其次查Costas誤差符號是否正確。5.3 板級調(diào)試經(jīng)驗板級調(diào)試最大的問題不是算法本身而是如何高效觀察內(nèi)部信號。建議優(yōu)先把ILA核掛在三個位置混頻后I路、Costas誤差信號、Viterbi處理前的軟信息。這三個點能快速判斷載波同步是否鎖定、定時同步后的眼圖是否張開、軟信息幅度是否正常。VIO核用來動態(tài)調(diào)整環(huán)路系數(shù)和復位信號省去每次改參數(shù)都要重新綜合的麻煩調(diào)試效率提升非常明顯。另外一點自環(huán)模式下發(fā)射和接收都在同一塊FPGA里不考慮空口衰減和多徑板子能跑通只代表功能正確不代表真實信道性能。如果需要逼近實際信道場景可以在中頻自環(huán)路徑上加可調(diào)衰減器或者人為加噪聲讓接收端實際感受到信號幅度變化再觀察AGC和同步環(huán)路的表現(xiàn)。如果要在兩個板卡之間做無線收發(fā)測試那就要額外考慮射頻前端和天線的匹配問題這個工程里暫時沒有包含。6. 常見問題與排錯經(jīng)驗6.1 載波同步鎖不死的調(diào)試Costas環(huán)鎖不定的現(xiàn)象是星座點在I/Q平面上始終旋轉(zhuǎn)或者鎖定之后相位抖動很大。排查順序一般是先看NCO頻率字初值是否準確再看環(huán)路濾波器系數(shù)是否合理最后檢查誤差信號極性。誤差極性反了的話負反饋會變正反饋環(huán)路必然發(fā)散。常見原因是在寫sign(I)的時候把符號邏輯寫反排查方法很簡單把環(huán)路斷開手動給一個固定相偏看誤差信號能否收斂到零點附近。6.2 相位模糊與誤碼統(tǒng)計自環(huán)狀態(tài)下如果收發(fā)同源相位模糊往往不明顯因為發(fā)射端和接收端默認同相。一旦鏈路里出現(xiàn)模擬器件或者真實空口相位模糊就會顯現(xiàn)。排查技巧是看Viterbi譯碼前的硬判決比特流是否整體取反如果誤碼率接近50%大概率是180度相位翻轉(zhuǎn)。解決方法就是前面提到的差分編碼或獨特字檢測。用獨特字檢測時要注意幀同步狀態(tài)機的穩(wěn)定性別把誤碼引起的假獨特字當成真同步否則幀同步會反復跳變誤碼統(tǒng)計結(jié)果完全不可信。6.3 時序收斂與資源優(yōu)化整套工程在Artix-7上跑16MHz時鐘沒有壓力但如果把采樣率抬高到100MSps以上FIR濾波器和Viterbi回溯路徑就需要認真做流水線設(shè)計。我的建議有兩條一是所有跨模塊信號統(tǒng)一遵守AXI-Stream握手在長組合邏輯路徑中間插寄存器二是FIR濾波器系數(shù)用對稱結(jié)構(gòu)乘法器數(shù)量減半。Viterbi譯碼如果資源緊張可以把并行ACS改成時分復用用一個ACS單元串行處理所有狀態(tài)用更高時鐘頻率換面積這個思路對未來擴展更高速率的卷積碼很有用。還有一個容易被忽略的點RRC成型濾波器輸出位寬裁剪。濾波器增益會帶來二進制位增長如果直接截掉低位信號量化噪聲會明顯增加如果保留過多低位后續(xù)乘法器和加法器位寬全被撐大。正確做法是仿真觀察濾波輸出信號峰峰值確定有效位范圍后裁位并補上直流偏置防止信號削波。6.4 調(diào)試順序建議最后分享一個老套但非常有效的調(diào)試順序。先驗證環(huán)回鏈路把發(fā)射端調(diào)制部分直接接到接收端解調(diào)部分不經(jīng)過同步環(huán)路確認卷積編碼和Viterbi譯碼功能完全正確再加入載波同步不加定時同步確認Costas環(huán)能穩(wěn)定鎖定再加入定時同步確認Gardner環(huán)正確工作最后把AGC、幀同步這些完整功能打開做全鏈路聯(lián)合調(diào)試。每加一個模塊就回歸一次誤碼率問題出現(xiàn)時大概率就集中在最后一次新增的模塊里。按照這個順序調(diào)試這套BPSK卷積碼工程一共花了兩天中間踩的最大的坑反而是仿真時忘記給復位信號做同步釋放導致仿真波形前幾百拍全是無效狀態(tài)。把復位同步器加上之后一切都順了。工程源碼里保留了完整的約束文件和仿真腳本拿到直接跑能看到一個從編碼到譯碼全通的自環(huán)演示。這里也提醒一句仿真通過只是第一步上板調(diào)試時時鐘約束一定要如實填寫否則時序收斂問題會掩蓋算法問題到時候查起來會非常頭疼。本文還有配套的精品資源點擊獲取