目錄
1.算法仿真效果
2.算法涉及理論知識概要
2.1 16QAM調制解調原理
2.2 幀同步
3.Verilog核心程序
4.完整算法代碼文件獲得
1.算法仿真效果
vivado2019.2仿真結果如下(完整代碼運行后無水印):
設置SNR=12db
將FPGA數據導入到MATLAB顯示星座圖:
設置SNR=16db
將FPGA數據導入到MATLAB顯示星座圖:
設置SNR=25db
將FPGA數據導入到MATLAB顯示星座圖:
仿真操作步驟可參考程序配套的操作視頻。
2.算法涉及理論知識概要
? ? ? 16QAM全稱正交幅度調制是英文Quadrature Amplitude Modulation的縮略語簡稱,意思是正交幅度調制,是一種數字調制方式。產生的方法有正交調幅法和復合相移法。16QAM是指包含16種符號的QAM調制方式。
2.1 16QAM調制解調原理
? ? ? ?16QAM 是用兩路獨立的正交 4ASK 信號疊加而成,4ASK 是用多電平信號去鍵控載波而得到的信號。它是 2ASK 調制的推廣,和 2ASK 相比,這種調制的優點在于信息傳輸速率高。正交幅度調制是利用多進制振幅鍵控(MASK)和正交載波調制相結合產生的。16進制的正交振幅調制是一種振幅相位聯合鍵控信號。16QAM 的產生有 2 種方法:
(1)正交調幅法,它是有 2 路正交的四電平振幅鍵控信號疊加而成;
(2)復合相移法:它是用 2 路獨立的四相位移相鍵控信號疊加而成。
這里采用正交調幅法。 ? ? ??
? ? ? ?數字信號是通過FPGA的輸出端口生成的。在16QAM調制中,每個符號包含4個比特,因此需要一個4位二進制計數器來生成數字信號。計數器的輸出被映射到星座圖上的一個點,然后通過數字到模擬轉換器(DAC)轉換為模擬信號。串/并變換器將速率為Rb的二進制碼元序列分為兩路,速率為Rb/2.2-4電平變換為Rb/2 的二進制碼元序列變成速率為RS=Rb/log216 的 4 個電平信號,4 電平信號與正交載波相乘,完成正交調制,兩路信號疊加后產生 16QAM信號.在兩路速率為Rb/2 的二進制碼元序列中,經 2-4 電平變換器輸出為 4 電平信號,即M=16.經 4 電平正交幅度調制和疊加后,輸出 16 個信號狀態,即16QAM.
? ? ? 16QAM信號采取正交相干解調的方法解調,解調器首先對收到的16QAM 信號進行正交相干解調,一路與cosωct 相乘,一路與sinωct相乘。然后經過低通濾波器,低通濾波器LPF濾除乘法器產生的高頻分量,獲得有用信號,低通濾波器LPF 輸出經抽樣判決可恢復出電平信號。
2.2 幀同步
? ? ? ?在數字通信中,信息通常是以幀為單位進行組織和傳輸的。幀同步的目的是確定每一幀的起始位置,以便接收端能夠正確地解調出每幀中的數據。
? ? ? ?設發送的幀結構為:幀同步碼 + 信息碼元序列 。幀同步碼是具有特定規律的碼序列,用于接收端識別幀的起始。
? ? ? ?幀同步的過程就是在接收序列中尋找與幀同步碼匹配的位置,一旦找到匹配位置,就確定了幀的起始位置,后續的碼元就可以按照幀結構進行正確的劃分和處理。
3.Verilog核心程序
T16QAM T16QAMU(
.i_clk (dat_clk),
.i_clksample(i_clk),
.i_rst (i_rst),
.i_en (i_en),
.i_dat (i_dat),
.o_ISET (o_ISET),
.o_clk_3div(),
.o_I16QAM(o_I16QAM),
.o_Q16QAM(o_Q16QAM),
.o_I16QAMs (o_I16QAMs),
.o_Q16QAMs (o_Q16QAMs),
.o_cos (),
.o_sin (),
.o_modc (),
.o_mods (),
.o_mod (o_mod_T)
);//加入信道
awgns awgns_u(.i_clk(i_clk), .i_rst(i_rst), .i_SNR(i_SNR), //這個地方可以設置信噪比,數值大小從-10~50,.i_din(o_mod_T[28:13]), .o_noise(),.o_dout(o_Nmod_T)); 16QAM解調
R16QAM R16QAMU(
.i_clk (dat_clk),
.i_clksample(i_clk),
.i_rst (i_rst),
.o_clk_3div(),
.i_med (o_Nmod_T),
.o_cos (),
.o_sin (),
.o_modc (o_modc_R),
.o_mods (o_mods_R),
.o_Ifir (o_Ifir_R),
.o_Qfir (o_Qfir_R),
.o_wbits(o_wbits),
.o_bits (o_bits),
.o_bits_head(o_bits_head),
.o_peak(o_peak),
.o_en_data(o_en_data),
.o_en_pn(o_en_pn),
.o_frame_start(o_frame_start)
);Error_Chech Error_Chech_u1(.i_clk(dat_clk), .i_rst(i_rst), .i_trans({~i_dat,1'b1}), .i_en_data(o_en_data),.i_rec({~o_bits,1'b1}), .o_error_num(o_error_num), .o_total_num(o_total_num)); 0sj2_068m
4.完整算法代碼文件獲得
V