SoCVista缩放噪声与舍入噪声.doc
《SoCVista缩放噪声与舍入噪声.doc》由会员分享,可在线阅读,更多相关《SoCVista缩放噪声与舍入噪声.doc(38页珍藏版)》请在冰豆网上搜索。
第十一章、缩放噪声与舍入噪声
在数字信号的学习过程中,总是默认所有计算都是无限精度的。
这么做是为了能更专一的学习数字信号的理论知识,但往往也使得我们变得“盲目”;很多同学对量化误差一无所知,或者知道一些,但是却很轻视这些知识。
很多教科书,虽然都有专门的章节来讲解量化误差的内容,但往往过于“理想化”,总是很难起到实际的指导作用。
KKParhi教授从硬件实现的角度来阐述这一问题,真正做到:
看懂,就能给出优秀实现!
对于硬件数字系统,其计算是离散且有限精度。
任何一种实现都存在两种基本类型的量化效应:
1)传输函数系数的有限精度量化,这种量化往往会使传递函数特性“变坏”;2)信号的舍入,包括系统内部的中间信号。
传递函数系数的量化不在我们讨论范围,大家可以从期刊文章上找到各种系数量化优化的方法,操作也不是很复杂,推荐看看这篇文章:
AFilterCoefficientQuantizationMethodWithGeneticAlgorithm,IncludingSimulatedAnnealing
信号的舍入误差是本章的研究内容。
以数字滤波器为例说明信号的舍入,如图1的一阶IIR滤波器,
图1 一阶IIR滤波器结构
假设输入x(n)和a均W位有符号定点数表示:
你可知道如何安排寄存器D和乘法器和加法器的字长?
最后y(n)的字长有应该是多少位?
从最坏的情况来考虑,为了保证无损计算,每次累加输出变量y(n)都要增加位长,从而乘法器的位长也相应增加,如此形成“恶性循环”。
但系统最终是要实现到硬件上的,这就不得不考虑以下这个问题:
如何选择合理的位长?
选择合理的位长,牵涉到两个问题:
1)计算溢出,在迭代过程中,某些计算结果可能会溢出,从而导致严重系统错误!
这种错误往往是不可接受的;
2)计算舍入,比如表示范围内的小数,如果位长是有限的,就会产生舍入误差。
因为计算溢出会导致严重系统错误,所以往往是优先考虑的因素。
要避免计算溢出,可以采用缩放操作,
图2
比如图2(a)的系统,为了保证w节点处的值发生溢出,可以对进行恰当缩放,同时注意,为了保证系统功能不变,必须对进行相应的调整,结果图2(b)所示。
理解缩放并不难,难在应该决定缩放程度。
下面先介绍两种典型的缩放模式,然后结合实例来介绍如何对系统进行缩放,并讨论不同程度缩放对舍入误差的影响。
为了便于讨论,我们假设所有信号的取值范围都在之间。
对图2系统,假设输入幅度在之间,并希望中间结果也在之间。
对于图2(a),由于增益不合适,可能导致的溢出,为了避免溢出,可对进行如下缩放:
1)缩放,最强程度的缩放,可完全避免溢出,
(1)
其中为的单位脉冲响应,可以证明
(2)
也就是说,只可能在之间取值,故而用对进行缩放之后,取值必在之间。
。
当然,如果用一个稍微大于的数进行缩放,那么取值就限制在之间,不包括1。
2)缩放,利用统计得出的信号标准偏差值进行缩放,以很高的概率保证计算不发生溢出(不能绝对保证)
(3)
其中为正数,作为调节因子。
对比缩放的定义和公式(3),有点让人摸不着头脑,,全过程是这样的,我们想确定信号的标准差,然后用该标准差对进行缩放。
的标准差可用如下公式计算,也可以用数值方法统计出来,,实际要处理的信号各式各样,不妨令其为均值为0方差为1的随机变量;对于限制在之间的,最坏的方差就是1,
(4)
(5)
公式(4)求出均值为0;公式(5)不是的方差,只是表明方差小于而已。
由公式(5)进一步得到标准差的关系
(6)
一般用对进行缩放不能严格保证不会发生溢出,只是说很大概率上不会溢出,回顾一下公式(3),增加一个调节因子,当且越大,溢出概率就越小,当时,缩放就等同于缩放,在增大就没有意义了。
代码1 缩放示例
clearall
closeall
clc
b=[1,2,1];
a=[1,-1.143,0.4128];
H=freqz(b,a);
x=1.99*(rand(1,10000)-0.5);
%%使用幅频曲线最大幅度值进行缩放
Hmax=max(abs(H));
b1=b/Hmax;
y=filter(b1,a,x);
figure;
hist(y,-5.5:
1:
5.5);
disp(Hmax);
disp(max(y));
%%使用课本l_1缩放
Hmax=sum(abs(impz(b,a)));
b2=b/Hmax;
y=filter(b2,a,x);
figure;
hist(y,-5.5:
1:
5.5);
disp(Hmax);
disp(max(y));
%%使用课本l_2缩放
Hmax=sqrt(var(filter(b,a,(2*rand(1,10000)-1)./sqrt(1/3))));
%方差为1的均匀白噪声(2*rand(1,10000)-1)./sqrt(1/3)
b3=b/Hmax;
y=filter(b3,a,x);
figure;
hist(y,-5.5:
1:
5.5);
disp(Hmax);
disp(max(y));
14.8258
0.8047
16.3837
0.7282
6.6128
1.8041
从输出数据的取值统计直方图可以看出,缩放不能完全保证不溢出,只是溢出概率比较小而已。
对比代码1中不同的三个缩放值14.8258、16.3837和6.6128。
前两个缩放比缩放要强得多,这也意味着它们的舍入噪声要比缩放严重,正如公式(3)所示,可以稍微增大一下缩放幅度,以限制溢出概率小到一定程度即可,如代码2所示。
clearall
closeall
clc
b=[1,2,1];
a=[1,-1.143,0.4128];
H=freqz(b,a);
x=1.99*(rand(1,10000)-0.5);
%%
Hmax=sqrt(sum((impz(b,a,100).^2)));
b3=b/Hmax;
y=filter(b3,a,x);
figure;
hist(y,-5.5:
1:
5.5);
disp(Hmax);
disp(max(y));
disp(sum(abs(y)>=1)/length(y));
6.8623
1.9028
0.0826
对比代码2和代码1最后一种缩放的结果,可以再次体会公式(6)所表示的意义。
现比较和缩放,从代码1和代码2的结果可以看出:
缩放系数为,而缩放系数为。
虽然缩放可完全避免溢出,但是其缩放程度远大于,“注意”缩放越大舍入噪声也越多;实际应用推荐使用缩放,而不是缩放。
缩放能保证91.74%的概率不溢出,如果系统是稳定的,那么溢出造成的影响就只会持续有限时间。
。
总而言之滤波器实现推荐使用缩放,除非真的要求100%不溢出,才需要缩放。
使用缩放,又需要保证低舍入噪声,就不得不使用更大的位长,下面分析位长和舍入噪声的关系!
!
以一阶IIR节为例,
图3 位长与舍入噪声
如课本上所说,舍入噪声的分析是非常复杂的;但如果舍入噪声满足以下三个假定,那么就可以按照线性理论进行分析:
1)是均匀分布白噪声;
2)是一个广义静态随机过程,也就是说,的均值和方差都独立于时间标记;
3)与所有其他信号都不相关。
一般可以认为舍入噪声满足以上三个条件。
假设加法器的位长为W位,默认为如下格式(其他格式也采用类似分析),
如果采用截断位的做法,那么舍入噪声取值为
(7)
图4 误差概率密度函数
如此,可计算的均值和方差为
(8)
(9)
从公式(9)进一步得出舍入噪声的标准差为
(10)
,因此,每增加1比特位长,可减小2倍舍入噪声幅度。
在仔细分析图3的结构可知,产生大舍入噪声主要因为乘法器,所以说乘法器是舍入噪声的根源。
。
往往在乘法器之后会进行舍入操作!
更进一步,可以观察对的影响,因为
(11)
也就是说
图5 舍入噪声对输出的影响
因为
(12)
所以
(13)
(14)
(15)
公式(15)表明了实际输出信号中包含的噪声分量标准差大小,除了与字长有关,还与传递函数有关,一般增加字长可以减少舍入误差。
线性时不变离散时间系统的基本输入输出关系是
(16)
或者
(17)
,不论是在时域还是频域,这种描述都是用表征整个系统的外部特性,而不涉及系统的内部结构。
因此,LSI系统的输入输出描述法是一种“黑盒子”的方法。
但在实现LSI系统的过程中,工程师不得不深入考虑到具体的系统结构,甚至深入到每一个节点每一条支路。
由此,我们希望能用系统内部的变量来表征系统特性,从而能对系统内部结构进行研究和优化——状态变量描述法就是这么一种工具,能将你所关心的内部结构反映出来,让你观察到你所想观察的变化。
从数学形式看,状态变量描述法是线性系统的矩阵描述,不仅仅是描述单输入单输出系统,也可以描述多输入多输出系统。
说白了,状态变量描述法就是两个矩阵方程:
1)状态更新方程,2)输出方程。
更多细节请阅读《现代控制系统》相关书籍!
下面只做简单介绍:
线性时不变系统(LSI)总可以表示为如下多输入多输出(MIMO)模型,
图6 MIMO模型示意图
其中,
l为输入向量,
l为输出向量,
l为状态变量。
同时,该MIMO系统也可表示为一阶差分矩阵方程,如下
(18)
分别为状态更新方程和输出方程,A/B/C/D均为矩阵。
根据公式(18),又可画出状态变量的信号流图如下
图7 状态变量的信号流图
以一个2阶IIR节为例说明如何得出系统的状态变量描述
图8 2阶IIR直接II型结构
根据信号处理知识可知,图8为公式(19)的直接II型结构,对应传递函数如下
(19)
对于图8,选择寄存器的内容作为状态变量,也就是
(20)
写出状态变量更新方程,就是和的关系,即公式(18)第一式,如下示
(21)
定义
(22)
且
(23)
且
(24)
再写出输出方程,如下示
(25)
定义
(26)
且
(27)
,,大家如何对照着课本看,可能会觉得迷惑!
!
其实一个系统的状态变量描述并不唯一,只要能正确表征系统即可,而状态变量的选取更是由实际应用来决定,不是千篇一律的。
以下就以公式(21)和公式(25)作为图8二阶IIR系统描述。
首先来研究如何缩放以保证状态变量不会溢出;在前面的一阶IIR例子(见图1)中,已经讨论给出了缩放和缩放的定义,现以缩放为例来讨论。
正式讨论前,请大家记住两点:
l状态变量的方差K用于对状态变量进行缩放,以大概率保证内部计算不会溢出;
l输出的方差W用于衡量系统内部信号的舍入对系统输出的影响。
走题一下,从结构上看LSI系统的状态变量描述可以用框图表示为(类似Mealy状态机,2段式)
图9 将LSI的状态变量描述框图类比于2段式Mealy状态机
在图7中,黄色所表示的状态变量是我们所关心的;而且迭代过程中有可能会溢出,必须对其进行恰当缩放。
为了看得更清楚,简化图7,只保留与