注:返回的相位按比例增加512(即,int(θ∗512))

在校正频率偏移时,我们需要估计复数的相位。正确的方法可能是使用CORDIC算法。在OpenOFDM中,我们使用查找表。更具体地说,我们使用arctan函数计算相位。

总体步骤包括:

  1. 将复数投影到[0,π/4]范围,使tan(θ)范围为[0,1]。
  2. 计算arctan(需要除法)
  3. 查找量化arctan表
  4. 将相位重新投影到[−π、 π)范围

这里我们使用量化和查找表技术。

步骤1可以通过以下转换实现:

在步骤3中使用的查找表中,我们使用int(tan(θ)∗256)作为关键,有效地将tan函数的[0.0, 1.0]范围映射到[0 256]的整数范围。换句话说,我们将[0,π/4]象限量化为256个切片。

请注意,我们还放大了arctan值以区分相邻值。这也系统地放大了OpenOFDM中的π。事实上,π被定义为1608=int(π∗512)

openofdm中利用查找表计算相位的代码

`include "common_defs.v"module phase
#(parameter DATA_WIDTH = 32
)
(input clock,input reset,input enable,input signed [DATA_WIDTH-1:0] in_i,input signed [DATA_WIDTH-1:0] in_q,input input_strobe,// [-pi, pi) scaled up by 512output reg signed [15:0] phase,output output_strobe
);
`include "common_params.v"reg [DATA_WIDTH-1:0] in_i_delay;
reg [DATA_WIDTH-1:0] in_q_delay;
reg [DATA_WIDTH-1:0] abs_i;
reg [DATA_WIDTH-1:0] abs_q;
reg [DATA_WIDTH-1:0] max;
reg [DATA_WIDTH-1:0] min;
wire [DATA_WIDTH-1:0] dividend;
wire [DATA_WIDTH-`ATAN_LUT_LEN_SHIFT-1:0] divisor;
assign dividend = (max > 4194304) ? min                                   : {min[DATA_WIDTH-`ATAN_LUT_LEN_SHIFT-1:0], {`ATAN_LUT_LEN_SHIFT{1'b0}}};
assign divisor  = (max > 4194304) ? max[DATA_WIDTH-1:`ATAN_LUT_LEN_SHIFT] :  max[DATA_WIDTH-`ATAN_LUT_LEN_SHIFT-1:0];wire div_in_stb;wire [31:0] quotient;
wire div_out_stb;wire [`ATAN_LUT_LEN_SHIFT-1:0] atan_addr;
wire [`ATAN_LUT_SCALE_SHIFT-1:0] atan_data;assign atan_addr = (quotient>511?511:quotient[`ATAN_LUT_LEN_SHIFT-1:0]);
wire signed [`ATAN_LUT_SCALE_SHIFT:0] _phase = {1'b0, atan_data};reg [2:0] quadrant;
wire [2:0] quadrant_delayed;// 1 cycle for abs
// 1 cycle for quadrant
delayT #(.DATA_WIDTH(1), .DELAY(2)) div_in_inst (.clock(clock),.reset(reset),.data_in(input_strobe),.data_out(div_in_stb)
);// 1 cycle for atan_lut
// 1 cycle for quadrant_delayed
delayT #(.DATA_WIDTH(1), .DELAY(2)) output_inst  (.clock(clock),.reset(reset),.data_in(div_out_stb),.data_out(output_strobe)
);divider div_inst (.clock(clock),.enable(enable),.reset(reset),.dividend(dividend),.divisor({{(`ATAN_LUT_LEN_SHIFT-8){1'b0}}, divisor}),.input_strobe(div_in_stb),.quotient(quotient),.output_strobe(div_out_stb)
);delayT #(.DATA_WIDTH(3), .DELAY(37)) quadrant_inst  (.clock(clock),.reset(reset),.data_in(quadrant),.data_out(quadrant_delayed)
);atan_lut lut_inst (.clka(clock),.addra(atan_addr),.douta(atan_data)
);always @(posedge clock) beginif (reset) beginmax <= 0;min <= 0;abs_i <= 0;abs_q <= 0;in_i_delay <= 0;in_q_delay <= 0;end else if (enable) begin// 1st cycleabs_i <= in_i[DATA_WIDTH-1]? ~in_i+1: in_i;abs_q <= in_q[DATA_WIDTH-1]? ~in_q+1: in_q;in_i_delay <= in_i;in_q_delay <= in_q;// 2nd cycleif (abs_i >= abs_q) beginquadrant <= {in_i_delay[DATA_WIDTH-1], in_q_delay[DATA_WIDTH-1], 1'b0};max <= abs_i;min <= abs_q;end else beginquadrant <= {in_i_delay[DATA_WIDTH-1], in_q_delay[DATA_WIDTH-1], 1'b1};max <= abs_q;min <= abs_i;endcase(quadrant_delayed)3'b000: phase <= _phase;            // [0, PI/4]3'b001: phase <= PI_2 - _phase;     // [PI/4, PI/2]3'b010: phase <= -_phase;           // [-PI/4, 0]3'b011: phase <= _phase - PI_2;     // [-PI/2, -Pi/4]3'b100: phase <= PI - _phase;       // [3/4PI, PI]3'b101: phase <= PI_2 + _phase;     // [PI/2, 3/4PI]3'b110: phase <= _phase - PI;       // [-3/4PI, -PI]3'b111: phase <= -PI_2 - _phase;    // [-PI/2, -3/4PI]endcaseend
endendmodule

利用Verilog计算IQ信号相位的一种方法相关推荐

  1. 手机在信号好的地方一直无服务器,解决手机信号不好的几种方法

    原标题:解决手机信号不好的几种方法 手机信号不好其实几乎所有人都遇到过,例如家住比较偏远地方的,在城中村的,或者在高楼大厦的地下室,在这些地方都有可能遇到手机信号不好的问题.主要是由于您家的地里位置偏 ...

  2. js获取classname值_利用js获取元素class值的两种方法

    我们有时为了达到某种效果,需要以元素的class值为条件做判断. 我们如何利用JavaScript获取元素class的值?我们先看下面代码: x=document.getElementsByTagNa ...

  3. 查询计算机上可用端口的两种方法

    在设备远程控制中,经常需要搜索设备上已安装端口号,例如在"计算机"→"设备"能看到的端口(COM和LPT).本文介绍的两种方法都是通过访问注册表实现的. 方法一 ...

  4. python 条形图填充疏密_教你利用Python玩转histogram直方图的五种方法

    直方图 直方图是一个可以快速展示数据概率分布的工具,直观易于理解,并深受数据爱好者的喜爱.大家平时可能见到最多就是 matplotlib,seaborn 等高级封装的库包,类似以下这样的绘图. 本篇博 ...

  5. 计算两个数平均值的三种方法

    第一种方法: 思路:两数相加求和再除2 代码 int a=10;int b=20;int avg=0;avg=(a+b)/2;//平局值//或者avg=(a+b)>>1://右移表示除2, ...

  6. 计算两个数平均数的三种方法

    第一种方法 思路:两数相加然后除以2 参考代码: #include<stdio.h>int main(){ int a = 10;int b = 20;int aver = (a + b) ...

  7. TCGA数据库的利用(三)—做差异分析的三种方法

    今天更新TCGA数据库的利用系列第三篇文章,在对TCGA数据进行挖掘时,通常会筛选出来一些表达量显著异常的基因,作为后续研究的对象,这个筛选过程叫做差异分析:本篇文章将分为三大模块对差异分析进行介绍 ...

  8. 利用opencv实现图像马赛克处理的三种方法

    前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...

  9. iPhone信号差?3种方法告别卡顿

    iPhone信号特别差?最近很多用户向我们这样吐槽iPhone信号问题. 针对这个问题,我们收集了一些果粉在论坛里提供的几种能有效改善信号问题的方法,有需要的小伙伴们可以试一下,必要的时候可以收藏喔! ...

最新文章

  1. vscode插件可以直接复制到_一款可以让代码“跳舞”的 VS Code 插件:Power Mode
  2. 微软这次发布会巨硬:安卓折叠手机、双屏电脑,还有无线耳机和超薄平板
  3. 《memory leak: stackwalk》
  4. 求助:如何获取ueditor的上传路径
  5. python判断正负零_【译】格式字符串语法
  6. 如何在20分钟内批量部署20台ESXi服务器?
  7. 【2021Java最新学习路线】java前端开发
  8. 第十二章_网络搭建及训练
  9. 专利写作规范及如何写一篇专利
  10. TMS VCL UI包功能和特点
  11. 14.C++读入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束
  12. 荣耀MagicOS 7.0正式发布 打造以人为中心的智慧生活解决方案
  13. 直播app源代码,Http方式请求网络
  14. SEO--搜索引擎优化(如何让你的网站排名靠前)
  15. 东风破 苏轼 喜欢的词,方文山的歌词好象就是这样借过来的。
  16. asp.net 页面清除缓存
  17. 茶觉 | 林先生的“岩香”
  18. 语音识别中Chain Model的原理和实践
  19. C#怎样远程连接SQLServer2000数据库?
  20. 《阿里巴巴Java开发手册(正式版)》--编程规约

热门文章

  1. freecodecamp项目---tictactoe
  2. 计算机中真值的概念,【概念辨析】真值、机器数、原码、反码、补码、变形补码、移码...
  3. 什么是真值什么是假值
  4. 解码北京冬奥沉浸式报道黑科技: 阿里云视频云「互动虚拟演播技术」
  5. 英音美音加拿大发音区别大盘点
  6. swift block语法
  7. 名校博士生临近毕业突然离世!去世前一直在熬夜完善毕业论文...
  8. Nginx之父突然离职,程序员巅峰一代落幕
  9. python dataframe创建指定大小_pandas DataFrame创建方法的方式
  10. ACCESS常见的一些问题及解决的方法