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

145 阅读2分钟

1.算法仿真效果

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

b4e3871c3c1fcb731f9603c7196bd0cf_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png   991844d902a7b8ff42ab465e94d5c173_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

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

 

29289960b8238ba4fb67f99194f53a50_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

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

        FFT傅里叶变换是一种高效的频谱分析方法,可以将时域信号转换为频域信号,用于频偏估计。FFT傅里叶变换是一种将时域信号转换为频域信号的方法,可以将信号的频谱信息展现出来。对于基带信号,通过FFT可以分析信号的频谱分布,从中获得频偏的估计。FFT傅里叶变换的数学原理如下:

 

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

 

8efff55c9668eb43c366987e0da405ce_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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

 

38c17bb856653a887a233422c76cdb18_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

        综上所述,基于FFT傅里叶变换的256qam基带信号频偏估计和补偿算法的实现过程主要包括64QAM调制、信号传输、接收、FFT傅里叶变换、频偏估计和频偏补偿等步骤。   

 

3.Verilog核心程序 ``timescale 1ns / 1ns

module TEST;

 

reg clk;

reg i_clkSYM;

reg rst;

reg start;

 

    wire  [7:0] parallel_data;

    wire [15:0]sin;

    wire [15:0]cos;

wire signed[19:0]  I_com;

wire signed[19:0]  Q_com;

    wire signed[15:0]o_Ifir_T;

    wire signed[15:0]o_Qfir_T;

 

 

// DUT

tops_256QAM_mod  top(

   .clk(clk),

   .rst(rst),

   .start(start),

   .parallel_data(parallel_data),

   .sin(sin),

   .cos(cos),

   .I_com(I_com),

   .Q_com(Q_com),

   .I_comcos(o_Ifir_T),

   .Q_comsin(o_Qfir_T)

   );

   

   

wire [15: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;

//256相位估计和补偿

tops_256QAM_Fre_est tops_256QAMU(

.i_clk  (clk),

.i_rst  (~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)

);

 

   

 

initial begin

clk = 0;

rst = 0;

start = 1;

#10;

rst = 1;

end

always #5

clk <= ~clk;

 

 

reg writeen;

initial

begin

    writeen = 1'b0;

 

    i_clkSYM=1'b1;

 

    

    #100

    writeen = 1'b1;

end

 

always #80 i_clkSYM=~i_clkSYM;

initial

begin

 

    #14400000

    

    $stop();

end

//显示发射端带相位旋转的星座图

integer fout1;

integer fout2;

initial begin

 fout1 = $fopen("It.txt","w");

 fout2 = $fopen("Qt.txt","w");

end

always @ (posedge clk)

 begin

     if(writeen==1)

     begin

     $fwrite(fout1,"%d\n",o_Ifir_T);

 $fwrite(fout2,"%d\n",o_Qfir_T);

 end

end

//显示接收端相位估计和补偿之后的星座图

integer fout3;

integer fout4;

initial begin

 fout3 = $fopen("Ir.txt","w");

 fout4 = $fopen("Qr.txt","w");

end

always @ (posedge clk)

 begin

     if(writeen==1)

     begin

     $fwrite(fout3,"%d\n",o_Ifir);

 $fwrite(fout4,"%d\n",o_Qfir);

 end

end

 

endmodule`