FPGA读书相关(二)

1.频域/时域/同态滤波

时域滤波主要是根据信号和噪声之间的统计特性差异完成滤波的。在观测信号的过程中,真实信号往往会受到加性噪声的干扰,而加性噪声的频谱很宽,所以需要的信号频谱和噪声频谱会产生重叠,甚至当需要的信号比较弱时,其频谱甚至会被噪声频谱淹没,这时仅能在时域将噪声消除。时域滤波一般基于最小二乘法,又称为波形估计。

当信号没受到加性噪声的干扰时,往往还会因为乘积运算从失真信号中滤出真实信号,这个过程叫做同态滤波。

图像的同态滤波原理及实现:https://blog.sciencenet.cn/blog-425437-1052070.html

时域滤波的比较:https://blog.csdn.net/tianzhaixing2013/article/details/8877171

FPGA中的数字运算

2.莱布尼茨

"10,一切数字的神奇渊源。……这是造物的秘密美妙的典范,因为,一切无非都来自上帝。"而且莱布尼茨自己写给若阿基姆·布韦的信中说:"第一天的伊始是1,也就是上帝。第二天的伊始是2,……到了第七天,一切都有了。所以,这最后的一天也是完美的。因为,此时世间的一切都已经被创造出来了。因此它被写作'7',也就是'111'(二进制中的111等于十进制的7),而且不包含0。只有当我们仅仅用01来表达这个数字时,才能理解,为什么第七天才完美,为什么7是神圣的数字。特别值得注意的是它(第七天)的特征(写作二进制的111)与三位一体的关联。"

莱布尼茨:https://blog.sciencenet.cn/blog-3032375-1364833.html

3.定点数与浮点数

任意一个二进制数,均可以由B个整数位和b个小数位组成,即:

考虑作为符号位,则为最高位,为最低位。

假定D为十进制数,则其原码表示为,对于正数,其反补码同原码;而对于负数,反码=原码除符号位外所有位取反,补码=反码最低位+1。原码的计算:乘除方便,符号位直接判决结果正负;但做加法,须比较符号位是否相同(不同则视为减法);做减法,比较符号位正负及两个数的绝对值大小。
例:原码 A-B=①比较A,B的绝对值大小②大数减小数③对数据符号位判断减法结果做合并处理
补码则加法方便,无论正负,符号位参与计算,如果符号位发生进位,则将进位去掉,余下即为结果。(可以将减法看为加法)

  • 定点数:是指小数点在数中位置是固定不变的二进制数

十进制数同二进制数的转换,存在量化误差,其取决于二进制的位数:

D=0.25;%十进制小数(绝对值≤1)
B=9;%二进制小数的位数

T_code=dec2bin(round(abs(D)*2^(B-1))+(2^(B-1))*(D<0),B)% 0.25的原码
D=-0.25;%十进制小数
C_code=dec2bin(round(D*2^(B-1))+2^B*(D<0),B)% -0.25的补码

  • 浮点数:是有理数中某特定子集的数字表示,在计算机中用来近似表示任意某个具体实数,实现以有限的位来反映无限的实数集合。

不难发现,定点数表达法的缺点就在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。因此,最终绝大多数现代的计算机系统都采纳了所谓的浮点数表达法

一个浮点数可以表示为

其中:符号位S(Sign)决定数是正数(s=0)还是负数(s=1),而对于数值0符号位解释则作为特殊情况处理。有效数字位M(Significand)是二进制小数,它的取值范围为,或者为非格式化值,此时有两个优势:第一,它提供了一种表示数值 0 的方法;第二,它表示那些非常接近于 0.0 的数。具体见下方链接一内)。它也被称为尾数位(Mantissa)、系数位(Coefficient),甚至还被称作"小数"。指数位 E(Exponent)是 2 的幂(可能是负数),它的作用是对浮点数加权。
舍入误差是指运算得到的近似值和精确值之间的差异。大家知道,由于计算机的字长有限,因此在进行数值计算的过程中,对计算得到的中间结果数据要使用相关的舍入规则来取近似值,而这导致计算结果产生误差。在浮点数的舍入问题上,IEEE 浮点格式定义了 4 种不同的舍入方式。

为什么要采用向偶数舍入这样的舍入策略,而不直接使用我们已经习惯的"四舍五入"呢?(链接中,从统计无差的角度给了一个结果,即若是每次都满5进位,则1,2,3,4舍,5,6,7,8,9进,进舍不均,容易增大误差,而根据靠向偶数,则就较为均衡了一些)
IEEE 754浮点数标准详解:http://c.biancheng.net/view/314.html

(IEEE 754标准)一个简单的计算例子:https://blog.csdn.net/u012184539/article/details/88020956

4.FPGA中的四则运算

    • 两个二进制数加法

      对于两个B bit的二进制数,采用B+1位存储计算结果,其结果一定不会溢出
      B bit的二进制数,有/无符号数,使得数的表示范围不一样
      符号数与无符号数的人为规定性:一个数是有符号还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。1000010000001110 若规定为无符号数,即 132146146D 。若规定为有符号数,则为 -124+14-110,而[-110]补=10010010。解释:10000100 -124 的补码,0001110 14 的补码,在机器中运算后得出的结果是 [-110] 的补码。机器中的有符号数运算一般就是补码运算。
      补码加减法运算:计算机中,当确定为有符号数运算时,符号数一律用补码表示,运算时符号位和数字位一起参加运算。运算结果也用补码表示。FPGA中利用signed声明加以区别。

    • 多个二进制数的加法

更多位数用于确保数据不溢出,则需要更多的资源(如寄存器),而实际中,如对3~4个B bit数据加法,确保不溢出,根据上边所说,需要 B+2位作为数据输出,然实际数据可能导致部分高位没有用上(或者中间变量用上了),实际输出的位数总小于B+2位(有效数据位)。

这时,有一般性结论:当多个数进行加法运算时,如果最终的运算结果需要B比特数来表示,则整个运算过程,包括中间的运算结果均用B bit 表示,不需要考虑中间变量的溢出问题。(还没确定)

随机尝试1(补码):7(0111)+2(0010)+(-3)(1101)
第一步:7(0111)+2(0010)=(-1)(1001)
不考虑溢出,意思是直接保留?
第二步:(-1)(1001)+(-3)(1101)=6(0110)正确
随机尝试2(补码): (-5)(1011)+(-3)(1101)+4(0100)
第一步:(-5)(1011)+(-3)(1101)=11000直接保留四位=(-1)1000
第二步:(-1)1000+4(0100)=-4(1100)正确

  • 乘法器

使用门电路、加法器、触发器等基本逻辑单元实现乘法运算不是一件容易的事情,例如存在专用的乘法器IP(Intellectual Property,知识产权)核。

此外,在FPGA设计中,乘法运算可以分为信号乘信号与信号乘常数两类,对于后一类,可以通过移位、加法、减法运算来实现,如:

如上方法称为移位相加法实现加法器,此外,在verilog中,实现除法,指数,求模,求余也面临着相似的困难,除采用IP核外,其实现也复杂。

类比于乘法,除法(除数为常数)可以用移位相加法以近似实现,如下:

除数为常数,则不可避免存在误差,此外,利用分解方法的除法运算,当分解运算的项数越多,则计算精度越高,这点由FPGA的有限字长效应所引起。.

对于乘法器(乘数采用补码表示-有符号二进制数)有:

  1. 位宽为M,N的两数相乘,输出须为M+N位以获取准确结果
  2. 对于乘法,无需采用扩展位数来对其小数点位置Δ
  3. 当乘数为小数时,乘法结果的等于两个乘数的小数位数之和
  4. 对乘法进行截位,保留高位,即相当于降低了运算精确度
  5. 仅在两乘数均为其所能表示的最小负数(最高位为1,其余为0)时,结果才会出现最高位(符号位)同次高位不同的情况,即仅在此状况下,需要M+N位以获取准确结果,其他情况下,最高两位均一致,仅需要M+N-1位数来存放即可。

实际工程中,如知道最小负值不出现,则可以节省这一位(bit)资源。
乘加运算中的有效数据位:FIR滤波器+乘法系数(滤波器系数)为常量,最终结果的有效数据位需根据常量大小计算。例如确定输入数据为N位,滤波器常数系数绝对值之和由二进制表示需要M位,则最终滤波器的输出需要M+N位。

5.有限字长效应

定义:https://baike.baidu.com/item/有限字长效应

在A/D转化器,滤波器系数,FFT运算等具体模块中,一旦涉及到计算,定点数的加法不会改变字长(存在数据溢出,需考虑数据动态范围),而定点数的乘法,涉及到截位和舍入,则存在有限字长效应;而浮点数的运算,则进一步加重了有限字长效应。

一点一点,坚持不懈,方能成功!