1.算法仿真效果
本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:
将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:
2.算法涉及理论知识概要
QPSK(Quadrature Phase Shift Keying)是一种常用的调制方式,它可以在相位和幅度上分别携带两个比特的信息。在无线通信中,由于信号传输过程中可能会受到频偏(Frequency Offset)的影响,导致接收端信号的频率和发送端信号的频率不完全一致。频偏会引起接收信号的相位偏移,从而导致解调错误和误码率的增加。为了减少频偏对通信系统性能的影响,需要进行频偏估计和补偿。本文将详细介绍基于FFT傅里叶变换的QPSK基带信号频偏估计和补偿算法,包括数学原理、实现过程和应用领域。
QPSK调制是一种基带调制方式,它将输入的比特流分为两组,每组两个比特,分别表示实部和虚部。QPSK调制的数学原理如下:
FFT傅里叶变换是一种高效的频谱分析方法,可以将时域信号转换为频域信号,用于频偏估计。FFT傅里叶变换的数学原理如下:
假设输入的时域信号为 x(n),通过FFT傅里叶变换将其转换为频域信号 X(k):
频偏估计和补偿的目标是通过接收到的信号来估计频偏,并在接收端对接收信号进行频偏补偿,使其与发送信号的频率完全一致。基于FFT傅里叶变换的频偏估计和补偿算法的数学原理如下:
综上所述,基于FFT傅里叶变换的QPSK基带信号频偏估计和补偿算法的实现过程主要包括QPSK调制、信号传输、接收、FFT傅里叶变换、频偏估计和频偏补偿等步骤。
3.Verilog核心程序
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2023/05/03 06:21:37 // Design Name: // Module Name: TEST // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module TEST(); reg i_clk; reg i_rst; reg i_clkSYM; reg i_dat; wire o_Idiff; wire o_Qdiff; wire signed[15:0]o_Ifir_T; wire signed[15:0]o_Qfir_T; wire signed[9:0]mcos0; wire signed[9:0]msin0; //QPSK调制 TQPSK TQPSKU( .i_clk (i_clk), .i_rst (i_rst), .i_clkSYM(i_clkSYM), .i_dat (i_dat), .o_Idiff(o_Idiff), .o_Qdiff(o_Qdiff), .o_Ifir (o_Ifir_T), .o_Qfir (o_Qfir_T), .mcos0 (mcos0), .msin0 (msin0) ); wire [31:0]o_freq; wire signed[15:0]o_cos; wire signed[15:0]o_sin; wire signed[15:0]o_Ifir; wire signed[15:0]o_Qfir; wire o_ends; wire o_start; wire o_enable; wire signed[31:0]absy; //QPSK相位估计和补偿 RQPSK_phase_est RQPSKU( .i_clk (i_clk), .i_rst (i_rst), .i_clkSYM(i_clkSYM), .i_I(o_Ifir_T), .i_Q(o_Qfir_T), .o_ends(o_ends), .o_start(o_start), .o_enable(o_enable), .absy (absy), .o_freq(o_freq), .o_cos (o_cos), .o_sin (o_sin), .o_Ifir (o_Ifir), .o_Qfir (o_Qfir) ); reg writeen; initial begin writeen = 1'b0; i_clk = 1'b1; i_clkSYM=1'b1; i_rst = 1'b1; #1600 i_rst = 1'b0; #100 writeen = 1'b1; end always #5 i_clk=~i_clk; always #80 i_clkSYM=~i_clkSYM; initial begin i_dat = 1'b0; #1440 repeat(250) begin #160 i_dat = 1'b1; #160 i_dat = 1'b1; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b1; #160 i_dat = 1'b0; #160 i_dat = 1'b1; #160 i_dat = 1'b1; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b1; #160 i_dat = 1'b1; #160 i_dat = 1'b1; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b1; #160 i_dat = 1'b0; #160 i_dat = 1'b0; #160 i_dat = 1'b1; #160 i_dat = 1'b1; #160 i_dat = 1'b0; end $stop(); end
标签:QPSK,wire,dat,星座图,b0,b1,160,频偏 From: https://www.cnblogs.com/51matlab/p/17609584.html