m基于uw导频序列和cordic算法的基带数据帧频偏估计和补偿FPGA实现,包含testbench

发布时间 2023-09-15 22:40:08作者: 我爱C编程

1.算法仿真效果

本系统进行了Vivado2019.2平台的开发,测试结果如下:

 

 

 

       我们可以看到,带有频偏的基带信号o_I_freo_Q_fre得到了有效的频偏补偿,其补偿后的数据o_Iro_Qr和原始的基带数据基本一致。

 

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

     基带数据帧频偏估计和补偿是一种用于纠正数字通信系统中频率偏差的技术。在数字通信系统中,发送端将信号进行调制后发送到信道中,接收端接收到信号后需要进行解调,以便恢复出原始信号。然而,由于发送端和接收端的频率偏差,可能会导致解调后的信号出现误差。因此,需要进行频偏估计和补偿,以减小这种误差。

 

       基于uw导频序列和CORDIC算法的基带数据帧频偏估计和补偿是一种常用的技术。下面我们将详细介绍其原理、数学公式和实现方法。

 

        基于uw导频序列的频偏估计和补偿技术是一种利用导频序列来估计和校正频率偏差的方法。在数字通信系统中,通常会在信号中插入一些导频序列,以便接收端能够利用这些导频序列估计出系统的频率偏差。

 

       具体来说,uw导频序列是一种常用的导频序列,其形式为

 

u(w)=N1​​∑n=0N1u(n)exp(jN2πnw)

 

       其中u(n)为原始信号,N为序列长度。这种导频序列具有良好的自相关性和互相关性,能够有效地估计出系统的频率偏差。

 

        CORDIC算法是一种高效的计算反正切和平方根的算法,其基本思想是通过一系列简单的移位和加减运算来逼近反正切和平方根的计算。在基带数据帧频偏估计和补偿中,可以利用CORDIC算法来计算uw导频序列的自相关性和互相关性,从而估计出系统的频率偏差。

 

       基于uw导频序列和CORDIC算法的基带数据帧频偏估计和补偿的数学公式如下:

 

 

 

基于uw导频序列和CORDIC算法的基带数据帧频偏估计和补偿的实现方法如下:

 

生成uw导频序列。根据uw导频序列的公式生成长度为Nuw导频序列。

接收基带数据帧。从接收端接收基带数据帧,并将其与uw导频序列进行互相关运算。同时,将接收到的基带数据帧与uw导频序列进行自相关运算。

利用CORDIC算法计算自相关性和互相关性的相位差。将自相关性和互相关性的结果输入到CORDIC算法中,计算出自相关性和互相关性的相位差。

计算频率偏差。根据自相关性和互相关性的相位差计算出系统的频率偏差。

计算补偿因子。利用CORDIC算法计算出补偿因子。

对接收到的基带数据进行补偿。将接收到的基带数据与补偿因子相乘,得到补偿后的基带数据。

将补偿后的基带数据进行解调,恢复出原始信号。

3.Verilog核心程序

 

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/07/24 21:34:11
// Design Name: 
// Module Name: PN_1_sycn
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
 
 
module UW_1_sycn(
                                 i_clk,
								 i_rst,
								 o_I_base,
								 o_Q_base,
								 o_I_fre,
								 o_Q_fre,
								 o_pkI,
								 o_pkQ,
								 o_Md,
								 o_phase,
								 o_Ir,
								 o_Qr
	                     );
 			
input i_clk;
input i_rst;
output signed[11:0]o_I_base;
output signed[11:0]o_Q_base;
output signed[23:0]o_I_fre ;
output signed[23:0]o_Q_fre ;
output signed[31:0]o_pkI;
output signed[31:0]o_pkQ;
output signed[31:0]o_Md;
output signed[31:0]o_phase;
output signed[23:0]o_Ir;
output signed[23:0]o_Qr;  
 
//发射
Transmitter uu1(
.i_clk     (i_clk),
.i_rst     (i_rst),
.o_I_base  (o_I_base),
.o_Q_base  (o_Q_base),
.o_I_fre   (o_I_fre),
.o_Q_fre   (o_Q_fre) 
);
 
 
//通过帧延迟做共轭相乘,计算频偏
Receiver uu2(
.i_clk     (i_clk),
.i_rst     (i_rst),
.i_I_base  (o_I_fre[17:6]),
.i_Q_base  (o_Q_fre[17:6]),
.o_Md      (o_Md),
.o_pkI     (o_pkI),
.o_pkQ     (o_pkQ),
.o_phase   (o_phase),
.o_Ir      (o_Ir),
.o_Qr      (o_Qr)
);
 
endmodule