FPGA信号处理系列文章——定点数据截位处理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
FPGA信号处理系列文章——定点数据截位处理
- 前言
- 截位方法
- Truncation
- Non-symmetric Rounding to Positive
- Non-symmetric Rounding to Negative
- Symmetric Rounding to Highest Magnitude
- Symmetric Rounding to Zero
- Convergent Rounding to even
- Convergent Rounding to odd
- matlab频谱分析
- 总结
前言
在我们FPGA的设计中,截位和扩位都是很常见的操作。
有截高位、低位和扩高位、扩低位之分。
1、截高位表示截取掉信号过多的符号位,在我们确认该数据确实不需要这么宽的位宽时,直接可以把高位符号位去掉,这个时候该信号的幅值不会发生任何变化
2、扩高位一般是两个模块端口进行匹配,扩高位即扩符号位,这个时候该信号的幅值不会发生任何变化
3、扩低位一般是在低位上补0,相当于在原来的值乘以2的几次方,对于信号来说没有任何损失,只是幅度变大了而已。
4、截低位 ,这个就是我们这篇文章需要讨论的,因为截低位对于信号来说是有变化和损失的,那么我们来分析一下一些主要的截位方法
截位方法
由于输入数据和滤波器系数都是已经定点化的数据,xilinx fir ip核给我们提供了几种截位的方法
可以认为这些方法就是我们平时会用到的一些截位方法了,我们正好借用一下来进行分析
Truncation
直接舍弃数据的低位,相当于matlab 的floor函数
matlab:
'假设我们要截低5位,a是待截数据
floor(32/32) = 1 floor(33/32) = 1 floor(48/32) = 1
floor(63/32) = 1 floor(64/32) = 2
floor(-32/32) = -1 floor(-33/32) = -2
floor(-48/32) = 2 floor(-63/32) = -2 floor(-64/32) = -2b = floor(a/2^5);
verilog:
32: 10'b00_0010_0000 33: 10'b00_0010_0001 48: 10'b00_0011_0000
63: 10'b00_0011_1111 64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111 -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001
b = a[9:5]
Non-symmetric Rounding to Positive
先把数据加上0.5,然后舍弃数据的低位。相当于matlab的floor(x+0.5)
matlab:
'假设我们要截低5位,a是待截数据
floor((32+16)/32) = 1 floor((33+16)/32) = 1 floor((48+16)/32) = 2
floor((63+16)/32) = 2 floor((64+16)/32) = 2floor((-32+16)/32) = -1 floor((-33+16)/32) = -1 floor((-48+16)/32) = -1
floor((-63+16)/32) = -2 floor((-64+16)/32) = -2b = floor((a+2^4)/2^5);
verilog:
32: 10'b00_0010_0000 33: 10'b00_0010_0001 48: 10'b00_0011_0000
63: 10'b00_0011_1111 64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111 -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001b1 = a + 10'b00_0001_0000
b = a[9:5]
or
b = a[9:5]+a[4]
Non-symmetric Rounding to Negative
先把数据加上0.4999999…,然后舍弃数据的低位.。相当于matlab的ceil(x-0.5)
'假设我们要截低5位,a是待截数据
floor((32+16-1)/32) = 1 floor((33+16-1)/32) = 1 floor((48+16-1)/32) = 1
floor((63+16-1)/32) = 2 floor((64+16-1)/32) = 2floor((-32+16-1)/32) = -1 floor((-33+16-1)/32) = -1 floor((-48+16-1)/32) = -2
floor((-63+16-1)/32) = -2 floor((-64+16-1)/32) = -2b = ceil((a-2^4)/2^5);
or b = floor((a+2^4-1)/2^5);
verilog:
32: 10'b00_0010_0000 33: 10'b00_0010_0001 48: 10'b00_0011_0000
63: 10'b00_0011_1111 64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111 -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001b1 = a + 10'b00_0000_1111
b = a[9:5]
Symmetric Rounding to Highest Magnitude
相当于matlab 的round函数
'假设我们要截低5位,a是待截数据
round(32/32) = 1 round(33/32) = 1 round(48/32) = 2
round(63/32) = 2 round(64/32) = 2
round(-32/32) = -1 round(-33/32) = -1
round(-48/32) = -2 round(-63/32) = -2 round(-64/32) = -2b = round(a/2^5);
verilog:
32: 10'b00_0010_0000 33: 10'b00_0010_0001 48: 10'b00_0011_0000
63: 10'b00_0011_1111 64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111 -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001if(a >= 0)
b1 = a + 10'b00_0001_0000
b = a[9:5]
else if(a < 0)
b1 = a + 10'b00_0000_1111
b = a[9:5]
Symmetric Rounding to Zero
这种截位方式不会发生溢出
'假设我们要截低5位,a是待截数据
round(32/32) = 1 round(33/32) = 1 floor(48/32) = 1
round(63/32) = 2 round(64/32) = 2
round(-32/32) = -1 round(-33/32) = -1
ceil(-48/32) = -1 round(-63/32) = -2 round(-64/32) = -2if (a >= 0 & mod(a,32) == 16 )
b = floor(a/2^5);
elseif (a < 0 & mod(a,32) == 16)
b = ceil(a/2^5);
else
b = round(a/2^5);
end
这里verilog就不再描述了,看起来有点复杂,暂时没想到简单的写法,想到了再补充
Convergent Rounding to even
Convergent Rounding to odd
收敛舍入选择中点的舍入方向为奇数或偶数,而不是正数或负数。 这可能是有利的,因为中点舍入方向决策的平衡基于奇数或偶数出现的概率,即使在输入信号的均值远离零时,在大多数情况下这通常是相等的。 该功能是通过添加舍入常数来实现的,就像在其他模式中一样,然后检查 LSB 上的特定模式以检测中点并强制 LSB 为零(舍入到偶数)或 1(舍入到奇数) ) 当出现中点时
这里matlab和verilog就不再描述了,看起来更复杂,暂时没想到简单的写法,想到了再补充。这两种情况应该一般用的不多。
matlab频谱分析
这里把前面5种截位方法用matlab进行分析,我们以一个点频作为例子
close all;clear all; clc;fi = 1;
fs = 100;
n = [-500000:500000];
a = 2048*exp(j*2*pi*fi/fs*n)+256*randn(1,length(n));b = floor(a/2^5);c = floor((a+2^4)/2^5);d = ceil((a-2^4)/2^5);e = round(a/2^5);a1 = real(a);
for i = 1:length(a1)
if (a1(i) >= 0 & mod(a1(i),32) == 16 )
f1(i) = floor(a1(i)/2^5);
elseif (a1(i) < 0 & mod(a1(i),32) == 16)
f1(i) = ceil(a1(i)/2^5);
else
f1(i) = round(a1(i)/2^5);
end
enda1 = imag(a);
for i = 1:length(a1)
if (a1(i) >= 0 & mod(a1(i),32) == 16 )
f2(i) = floor(a1(i)/2^5);
elseif (a1(i) < 0 & mod(a1(i),32) == 16)
f2(i) = ceil(a1(i)/2^5);
else
f2(i) = round(a1(i)/2^5);
end
endf = f1+f2*1j;bfft = 20*log10(abs(fftshift(fft(b))));
cfft = 20*log10(abs(fftshift(fft(c))));
dfft = 20*log10(abs(fftshift(fft(d))));
efft = 20*log10(abs(fftshift(fft(e))));
ffft = 20*log10(abs(fftshift(fft(f))));figure(1)
subplot(5,1,1)
plot(n,bfft);grid on;
subplot(5,1,2)
plot(n,cfft);grid on;subplot(5,1,3)
plot(n,dfft);grid on;
subplot(5,1,4)
plot(n,efft);grid on;
subplot(5,1,5)
plot(n,ffft);grid on;
可以看出 非对称截位都会引起一个直流量。
这个直流量不会随着主信号的幅度变化,其幅度始终保持不变。
这种直流是我们需要避免的。因此我们截位需要用对称截位。
总结
我们在进行信号处理需要使用截位的时候要用对称截位。
如果对于只是进行运算类的截位,例如功率统计这种,则不需要,简单的直接截位即可。这点是我们在设计中需要注意的
FPGA信号处理系列文章——定点数据截位处理相关推荐
- FPGA信号处理系列文章——FIR半带插值滤波器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--FIR半带插值滤波器 信号流 matlab模型 FIR系数生成 IP核的设置 注意事项 信号流 半带插值滤 ...
- FPGA信号处理系列文章——FIR半带插值滤波器-1个时钟2个采样点的优化处理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--FIR半带插值滤波器-1个时钟2个采样点的优化处理 前言 设计参数 常规IP设置 优化处理 总结 前言 假 ...
- FPGA信号处理系列文章——CRC运算的实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--CRC运算的实现 前言 CRC运算的框图 matlab模型 verilog实现 总结 前言 很多协议都会用 ...
- FPGA信号处理系列文章——码元同步
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--码元同步 前言 码元粗同步 超前-滞后门同步器 鉴别器 matlab程序 前言 前面,我们将了锁频环和锁相 ...
- FPGA信号处理系列文章——数字锁相环
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--数字锁相环 锁相环的一些概念 鉴相器 Matlab 程序 锁相环的一些概念 1.捕获.锁定与跟踪的概念 捕 ...
- 大话卫星导航中的信号处理系列文章——GPS信号L1频点的中频数据生成与验证
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 大话卫星导航中的信号处理系列文章--GPS信号L1频点的中频数据生成与验证 需求 扩频码的生成 其他 验证 需求 这篇文章,主要记录我 ...
- FPGA经验谈系列文章——FPGA开发方向以及算法开发模型
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--FPGA开发方向以及算法开发模型 前言 接口方向 算法方向 总结 前言 FPGA开发笼统的说可以分为两个方向 ...
- FPGA经验谈系列文章——那些曾经让我发狂的BUG
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--那些曾经让我发狂的BUG 前言 跨时钟域处理不对问题 组合逻辑产生锁存器问题 外围器件协议理解不深的问题 接 ...
- FPGA经验谈系列文章——前言和目录
FPGA经验谈系列文章--前言和目录 前言 工作内容 最后 前言 转眼间,工作也即将十年时间,也是做FPGA开发的十年,虽然我总是认为我一开始走错了路,我应该去搞互联网的o( ̄︶ ̄)o.但也确实做到了 ...
- FPGA经验谈系列文章——静态时序分析(二)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--静态时序分析(二) 四种时序路径 时序路径段 接上一篇,上一篇是一个ALTERA的培训PPT,这一篇是有一个 ...
最新文章
- java程序的装载与检查_浅谈Java类型装载、连接与初始化
- ESP32 OTA升级策略
- 电脑打开html不显示图片,网页不显示图片,详细教您网页不显示图片怎么解决
- php递归多维数组为缩进列表,php – 缩进列表到多维数组
- A Wasserstein Distance[贪心/模拟]
- [bzoj1303][CQOI2009]中位数图
- java类与对象实验报告心得体会_Java类与对象实验报告.doc
- AI写程序,这事可没那么简单!
- 表单提交连续点击html,通过提交“点击”触发器提交两次HTML表单
- 面试官:AtomicInteger是如何保证线程安全?
- Flask前后端分离跨域问题解决方案
- mysql特有语法_MySQL 独有SQL语法汇总(一)
- Eclipse用法和技巧五:生成说明文档2
- JavaScript-预解析(变量提升)
- Net下的AppDomain编程 [摘录]
- 杭电acm 1205 吃糖果
- 计算机安装微信打不开,电脑版微信打不开解决方法
- 软件工程c语言课程设计的作用,C语言课程设计指导书2016版HNUST
- MPEG-2 数字视频技术参考指南 (7)—— ATSC数字电视标准
- demo:用matlab app designer做一个简易app
热门文章
- 探索开源工作流引擎Azkaban在MRS中的实践
- 解决“无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有权限访问”的问题
- 波士顿学院计算机,波士顿学院(Boston College)_快飞留学
- 日本显示屏公司的尴尬:夏普被收购 JDI也岌岌可危
- 什么样的网页适合使用框架
- linux添加jetdirect协议,如何设置 HP JetDirect 设备的网络安全性?
- sata7p 定义_SATA接口定义
- 计算机屏幕出现条纹w7,电脑重装win7后屏幕出现条纹怎么办
- 欧洲杯第一周的比赛闲聊
- 计算机函数公式发生额总计,Excel使用SUMIF函数统计各部门的奖金总额