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

发布时间 2023-09-17 21:34:06作者: 我爱C编程

1.算法仿真效果

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

 

 

 

局部放大之后:

 

 

 

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

 

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

        基于PN导频序列和CORDIC算法的基带数据帧频偏估计和补偿是一种常见的无线通信系统中用于频偏补偿的方法。下面是这个过程的一般步骤:

 

1. PN导频序列的发送和接收:

 

发送端:在发送端,通常会附加一个已知的伪随机(PN)导频序列到待传输的数据帧上。

接收端:在接收端,接收到带有PN导频序列的信号。

在本课题中,每一组基带数据均包括4PN序列构成导频序列。

 

2. 估计频偏:

 

接收端首先需要估计信号的频偏,即接收信号的频率与发送信号的频率之间的差异。

CORDICCoordinate Rotation Digital Computer)算法是一种常用于复数域信号处理的频偏估计算法。它通过迭代旋转操作来估计信号的相位偏移,进而估计频偏。

       将接收端接收到的导频数据做延迟和共轭相乘,然后根据其实部和虚部做cordic算法得到对应的频偏值。

 

3. 频偏补偿:

 

一旦估计出频偏,接收端可以使用相反的频偏来对接收信号进行补偿。这可以通过复数域中的相位旋转来实现。

通过将接收信号与一个相反的复数指数函数相乘,可以将频偏补偿到零。

      需要注意的是,PN导频序列的选择和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 PN_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