m基于FFT傅里叶变换的QPSK基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab星座图显示

309 阅读3分钟

1.算法仿真效果

本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:

9b817cd61dbfd8d3d7a5716f2493c29b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:

234f2abee92dfc963a2510c8b5419342_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

2.算法涉及理论知识概要

       QPSK(Quadrature Phase Shift Keying)是一种常用的调制方式,它可以在相位和幅度上分别携带两个比特的信息。在无线通信中,由于信号传输过程中可能会受到频偏(Frequency Offset)的影响,导致接收端信号的频率和发送端信号的频率不完全一致。频偏会引起接收信号的相位偏移,从而导致解调错误和误码率的增加。为了减少频偏对通信系统性能的影响,需要进行频偏估计和补偿。本文将详细介绍基于FFT傅里叶变换的QPSK基带信号频偏估计和补偿算法,包括数学原理、实现过程和应用领域。

 

       QPSK调制是一种基带调制方式,它将输入的比特流分为两组,每组两个比特,分别表示实部和虚部。QPSK调制的数学原理如下:

 

141fd2df72d5aa7360184d3726c07df8_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

      FFT傅里叶变换是一种高效的频谱分析方法,可以将时域信号转换为频域信号,用于频偏估计。FFT傅里叶变换的数学原理如下:

 

6e7127057ee1a004054d7ec310c77c51_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

       假设输入的时域信号为 x(n),通过FFT傅里叶变换将其转换为频域信号 X(k):

 

 

       频偏估计和补偿的目标是通过接收到的信号来估计频偏,并在接收端对接收信号进行频偏补偿,使其与发送信号的频率完全一致。基于FFT傅里叶变换的频偏估计和补偿算法的数学原理如下:

 

02969613830415ccf1bda2632ecfbb20_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

 

    综上所述,基于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`