首页 > 编程知识 正文

数字信号处理基础教程,数字信号处理内容

时间:2023-05-04 05:16:34 阅读:124860 作者:4031

前面写的正文是本系列的第一篇,参考杜勇老师的数字滤波器MATLAB和Verilog的实现和几个网络博客,更新顺序参考杜勇老师的书目。 本文主要介绍有关数字信号的一些基础知识。

定点数的数字既包含整数,也包含小数,但小数的精度范围比整数大得多,所以如果计算机可以同时表示整数和小数,该小数点如何表示就很重要了。 因此,提出了一种叫做约定计算机中小数点的位置的方法。 而且,这个位置是一定的,小数点前面和后面的数字分别用二进制表示。 然后,可以组合起来将这个数字存储在计算机中。 该表示方法称为“定点”表示法,用该方法表示的数字称为“定点数”。 也就是说,“定”是固定的意思,“点”是指小数点,来源于小数点位置固定即定点数的名称。

在计算机上,数据的小数点通常固定在数据的顶部或底部之后。 前者称为定点小数,后者称为定点整数。定点小数为纯小数,约定小数点位置在码位之后,有效数值部分的最高位之前。 如果数据x的格式为x=x0.x1x2…xn (其中x0是符号位,x1到xn是数字的有效部分,也称为尾数,x1是最高有效位),则计算机上的显示格式如下:

在数字处理中,常数的数量通常限制在- 1到1之间,小数点规定在符号位和数据位之间。 此外,整数位为符号位,正负用0、1表示,数本身只有小数部分,即尾数。 这是因为,只要两个乘数不是小数或整数,经过固定点数的乘法运算后的小数点位置就不确定。 关于加法,小数点的位置是固定的,上图的x0位的编码位,x1~xn是数据位。 运算过程中,所有运算结果的绝对值不得超过1。 如果不超过,就会发生溢出。 在实际问题中,处理运算的过程中结果可能超过1。 为了正确进行运算,通常在运算时乘以比例因子,避免溢出现象。

定点数的3个表示方法带定点符号的数据在计算机内的4个表示方法是原符号、补数、反码。 在FPGA处理中,比较常用。

原码表示

最高位是码位,0是正数,1是负数,剩下的位是数值位。 原码的优点是简单直观,编码位和数值位在运算时区别对待。 0的源代码表示有两种形式。

反码表示

正解码表示与原始代码表示相同。负数的解码表示与该负数对应的原始代码的位没有变化,数值位按位反转。 因此,在反转显示中,最高有效比特保持为已编码比特,0为正,1为负,并且与原始符号相同。 0的反码表示也有两种形式。

补码表示

正补数与原始代码相同。负数的补数表示是将原始代码表示的符号位不变值位反转,将最低有效位加1。 补数中0的表示是唯一的。

浮点数是用于近似表示实数的公式化表示,可以在表示范围和表示精度之间进行权衡(因此称为浮点数)。 计算机可以近似地表示任意实数。 浮点数字通常称为A=MB^E,b是步进码的基数,精度表示为n (存储在几个比特中),e在浮点数字中表示为基指数。 m被称为浮点数的尾数。

浮点数的表示法表示浮点数,一个是给出尾数m的值,通常用定点小数表示,决定浮点数的表示精度,即可以给出的有效数字的位数。 第二种是给出阶号,通常用定点整数形式表示,表示数据中小数点的位置,决定浮点数的显示范围。 因此,在计算机中,浮点数字通常由以下格式:表示: (假设为32位浮点数,基本为2,其中最高有效位为已编码位。)。

一种FPGA处理浮点数格式虽然浮点数的表达范围更广,但实现时消耗的资源更多,实现步骤也更繁琐。 添加浮点数需要执行以下操作:

对层操作:比较指数大小,移位指数小的操作数,完成尾数对层操作。 尾数加法:对步骤后的尾数进行加减操作。 规范化:将有效位规范化,并根据移位方向和位数修改最终阶数。 浮点乘法操作通常需要执行以下操作:

指数加法:完成两个操作数的指数加法运算。 尾数调整:将尾数m调整为1.M的补数形式。 尾数乘法:完成操作数的尾数乘法。 规范化:根据尾数运算结果调整指数位,对尾数进行舍入操作,将输出结果规范化。 浮点数的运算速度主要由FPGA内部集成的硬件乘法器决定。 大多数FPGA芯片内部的乘法器为18bitX18bit。 这里以7系列的xilinx为例。 DSP48内部的乘法器为25X18,如下图所示。

进行24位乘法运算时,需要使用4个18bitX18bit乘法器,2个18位整数乘法运算操作只占用1个18bitX18bit乘法器。 通过FPGA寄存器资源的设计,尾数可以直接以补数的形式表示。 可以消除舍入运算,减少一个阶段的流水操作。

杜勇老师在他的《多输入浮点加法器算法研究》中提出了浮点数的节点格式,也就是26位宽的数。 2518位表示8位有符号数,170表示18位有符号小数。 浮点数的公式为M=f X 2^e;

数值1的表示法为指数0,尾数为01 _ 1111 _ 1111 _ 1111 _ 1111 _ 1111 _ 1111; 数值0表示指数为-128,尾数为0。 与24位常规浮点运算相比,这种自定义浮点格式

精度有所下降但是可以大大节省乘法器的资源由是个乘法器变为1个,并有效地减少了运算步骤,提高了运算速率(由二级18X18乘法运算减少到一级运算)。

自定义浮点数和实数之间的关系:

FPGA中的运算 加减法运算 小数加减法运算

在Verilog中比较常用的数据类型是wire和reg以及他们的向量形式,在Verilog中,默认将所有的二进制数当做小数处理,也就是说小数点均在最低位的右边。带小数的运算,设计者可以通过隐形规定进行,如,假设规定一个小数运算的小数点在最高位和次高位之间,然后进行小数的加减法运算。和十进制的运算规则相同,在做加减法运算时,参与运算的两个数的小数点必须对齐,并且结果的小数点位置相同。

还有一种比较常用的处理办法是,将小数转换为整数进行运算,处理过程为同时把要运算的数进行乘一个很大的数如1024,即乘一个很大的整数处理掉小数部分,转化为整数,并约定该整数为之前的小数。但是这样处理的弊端也比较明显,相比于直接进行隐形规定小数运算,会消耗更多的资源。

负数加减法

Verilog默认状态都表示的是无符号数,如果要指定某个数为有符号数,要在声明前加入关键字signed,如:wire signed [2:0] data;这里表示data为3bit的有符号数,在运算时自动采用有符号运算。下面引用杜勇老师书上的一个示例,并做略微改动。

有无符号数对比示例:

源文件:

`timescale 1ns / 1psmodule adder_test( data1, data2,sum_signed_out, sum_unsigned_out,compare_signed,compare_unsigned);input[3:0]data1; //输入加数1input[3:0]data2; //输入加数2output [3:0]sum_unsigned_out; //无符号加法输出output signed [3:0] sum_signed_out; //有符号加法输出output [3:0]compare_signed; //有符号数比较输出output [3:0]compare_unsigned; //无符号数比较输出//无符号加法运算assign sum_unsigned_out = data1 + data2;//有符号加法运算wire signed [3:0] s_data1;wire signed [3:0] s_data2;assign s_data1 = data1;assign s_data2 = data2;assign sum_signed_out = s_data1 + s_data2;//比较操作 wire signed [3:0] cons_1 = 4'b1001;assign compare_signed = (sum_signed_out < cons_1)? 1 : 0;assign compare_unsigned = (sum_unsigned_out < cons_1)? 1 : 0; endmodule

测试文件:

`timescale 1ns / 1psmodule tb_adder(); //输入 reg [3:0] data1; reg [3:0] data2; //输出 wire [3:0] sum_unsigned_out; wire [3:0] sum_signed_out ; wire compare_signed ; wire compare_unsigned; //例化 adder_test u_adder_test(.data1 (data1 ),.data2 (data2 ),.sum_unsigned_out (sum_unsigned_out ),.sum_signed_out (sum_signed_out ),.compare_signed (compare_signed ),.compare_unsigned (compare_unsigned )); //测试 initial begin data1 = 0; data2 = 0; repeat(16)begin data1 = data1 + 1; data2 = data2 + 1; #20; end endendmodule

综合的RTL图:

此时的仿真结果为下图:

通过对比可以知道,在进行运算时,有无符号数的运算结果在二进制中查看是相同的,但是表达的数值大小有区别,除此之外,有无符号数的区别也体现在比较运算上。

从下图中,可以看出,对于有无符号数来说,4‘b1001有符号数对应的是-7,无符号数对应的是9,所以两者的结果是不一样的。

比较操作中为何不直接使用(sum_signed_out < 4’b1001)?

这里作为对比,将比较操作语句的cons_1直接改为4’b1001;

//比较操作 //wire signed [3:0] cons_1 = 4'b1001;assign compare_signed = (sum_signed_out < 4'b1001)? 1 : 0;assign compare_unsigned = (sum_unsigned_out < 4'b1001)? 1 : 0;

在vivado的编译仿真器环境下输出结果如下:

从波形可以看出,两个比较操作都是按照无符号数进行比较,这是因为在进行比较操作时,直接把比较数写入4’b1001,编译器会默认该数为无符号数,比较会按照无符号进行比较输出。所以有符号数进行比较时加上signed,即可考虑数值正负,完成正确比较,必须两个都要加signed,否则当作无符号进行比较。否则只会将有符号数看作无符号数进行比较。

乘法运算

对于乘法运算,可以选择使用工具中自带的IP核,也可以使用基本的组件进行设计乘法电路。相比加减法,乘法电路更消耗资源,一般情况下,对于信号和信号(数据)之间的运算,通常调用IP进行实现,而常数和信号直接的乘法运算,可以通过进行移位和加减法实现。例如一个数乘2,等效为这个数左移一位;一个数乘3等效为这个数左移一位+该数本身。

因为乘法运算的结果数据位数比乘数位数多,所以在实现乘法时,要先进行数据位数是扩展,以免出现数据溢出的现象。

除法运算

和乘法类似,可以选择使用工具中自带的IP核实现除法电路。但是除法不可以在Verilog程序中进行直接实现,类比乘法电路的实现方法,可以将除法进行分解成若干右移的小项,然后进行加减运算操作。例如一个数除以2,则可以将该数进行右移一位;一个数除以3,可以将该数(记该数为A)近似分解 为,A右移2位+A右移4位+A右移6位。(相当于该数乘了0.3281),因为该数是无限小数,所以对于分解法只能得到近似的结果,分解的项数越多,精度越高。因为FPGA这些数字信号处理平台不可避免有限字长效应引起的。

有效数据位的计算

在FPGA中,所有的数据都是通过寄存器来存储,使用的寄存器越多,消耗的资源也就越多。所以为了保证硬件资源的有效利用,需要精准掌握运算中的有效数据位的长度,尽可能的减少无效数据位参与运算,浪费资源。有效数据位表示有用的数据位,例如数据范围为0-9,从寄存器的角度来说,只需要4个寄存器进行存储即可枚举所有0-9的状态,如果此时定义了5位的寄存器向量,那么多出来的那一位是无效的,任何时候都不代表任何信息。

加法运算的有效数据位

对于整数加法来说,假设加法中的两个加数最大的位数为N,则加法运算结果需要N+1位 才能保证结果不溢出。

对于小数加法来说,如果采用N+1位的数据表示运算结果,则小数点的位置在数据次高位的右边,如果采用N位数据表示运算结果,则小数点的位置在数据最高位的右边。简而言之就是,小数部分的数据位数是不变的 。为了确保得到N+1位的准确结果,要对参加运算的两个数进行一位符号位的拓展

乘法运算的有效数据位

对于数据长为M和N的数据进行乘法运算时,需要M+N位的数据才能得到准确的结果。对于乘法运算当乘数为小数时,,不需要通过拓展位数类对齐乘数的小数点位置,乘法的结果的小数位数等于两个乘数的小数位数之和。对乘法进行截取时,为了保证结果正确,只能取高位,舍弃低位。只有在两个乘数均能表示最小负数时,才能拿出现最高位和次高位不同情况。(最高位为1,其余为0),只有在这种情况下需要M+N位的数来存放结果,其他情况下,只需要M+N-1位来存放结果。

乘加法运算的有效数据位

在数字信号处理中,通常会遇到乘加运算的情况,一个典型的例子就是有限脉冲响应(Finite Impulse Response,FIR)滤波器的设计。当乘法系数是常量时,最终运算结果的有效数据数据位根据常量的大小来重新计算。假设乘加运算的变量输入是N位的数据,乘加运算的输出有效数据位计算如下:计算所有常数乘数绝对值之和SUM,算出SUM所占用的二进制数据位n,则乘加运算的输出的有效数据位数为N+n。

有限字长效应

数字信号处理的实质是一组数值运算,这些运算可以在计算机上用软件实现,也可以用专门的硬件实现。无论哪种实现方式,数字信号处理系统的一些系数、信号序列的各个数值及运算结果都要以二进制形式存储在有限字长的存储单元中。如果存储的是模拟信号,例如常用的采样信号处理系统,输入的模拟量经过采样和模数转换后,变成有限长的数字信号。有限长的数就是有限精度的数。因此,具体实现中往往难以保证原设计精度而产生误差,甚至导致错误的结果。在数字系统中主要有三种因有限字长而引起误差的因素:

模数转换器把模拟输入信号转换为数字信号时产生的量化效应把系数用有限位二进制表示时产生的量化效应数字运算过程中,为限制位数进行的位数处理和为防止溢出而压缩信号电平的有限字长效应

引起这些误差的根本原因在于寄存器(存储单元)的字长有限。误差的特性与系统的类型、结构形式、数字的表示法、运算方式及字的长短有关。在通用计算机上,字长较长,量化步很小,量化误差不大。但在专用硬件,如FPGA,实现数字系统时,其字长较短,就必须考虑有限字长效应了。

References 什么是定点数?浮点数表示数字滤波器MATLAB和Verilog实现

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。