定点仿真:定点方案未必就真
0赞1 问在之前:你会选择哪款手机?
假若你要买手机,现在放在你面前的有如下2款:
价格 质量
手机一 1000 每3个月通话中断一次
手机二 3000 每5年通话中断一次
这2款手机的其他功能一模一样。你会选哪一个?我们在最后来回答这个问题。
2 问题所在
为什么会问这个问题?因为通话中断的原因很多,其中之一就是信号处理时的定点溢出。这就涉及到本文的主旨:定点仿真,为什么定点方案未必就真?这要从定点仿真的工作原理和随机信号的各态历经性说起。
先来看看定点仿真的过程:
1) 先进行浮点仿真;
2) 根据每个变量的浮点仿真的数据范围进行定点化;
3) 再按照此定点方案进行定点仿真,查看有没有溢出的情况。
问题显现,为什么要进行第3步呢?如果第2步的定点方案已经绝对不会溢出,那第3步就完全没有必要了。原因在于随机信号各态历经的前提:仿真时间足够长。对“足够长”的理解:
- 若信号为有限区间的分布:
-
- 离散分布:可以在某个时间内遍历所有状态
- 连续分布:需要无限长的时间才能遍历各种状态
- 若信号为无限区间的分布:不管是离散分布还是连续分布,都需要无限长的时间才能遍历各种状态
问题就在这,一般情况下我们在有限的仿真时间内是无法遍历信号的所有状态,也就无法确定该信号的最大值和最小值,那怎么敢保证随机信号的数据范围就是其实际的范围呢。因此就不敢保证,当利用一些数据得到的定点方案用在另一些随机数据上时不会溢出。于是才有了第3步,需要回去检查定点方案。
这里可能会有人质疑:为什么要去遍历信号的所有状态呢?只要取得了信号的最大值和最小值不就能确定数据范围从而确定定点方案了么?且听我慢慢道来。信号处理的每个流程都可以看作一个函数,前一级的输入取得最大(小)值时,后一级的输出不一定取得最大(小)值。拿一个简单的二次函数做例子,只有当输入取得一个特定的值时,输出才取得最大(小)值。而往往通信系统中的信号处理比二次函数难分析多了,我们根本没法从理论上从后往前推导出每一个处理流程的输出取得最大(小)时所对应的输入。因此,利用仿真去遍历信号这样一种纯暴力的搜索就成为了我们确定定点方案的下下策。
所以,仿真只是一种验证手段,而非方案提出的方法。
注: 各态历经的物理含义:只要观测的时间足够长,每个样本函数都将经历信号的各个状态,或者说能够遍历信号的全部状态。在实际中我们遇到的信号大都是各态历经的,对于非各态历经的随机过程,不能这样简单地仿真,而要取不同的样本函数,使得这些样本函数中的各种状态能够包含该随机过程的所有状态。
3 解决方案
既然定点方案未必为真,那有没有方法让定点方案变得完美而绝不溢出呢?或者退一步,尽量减小定点溢出的概率?
- 如果想要得到绝不溢出的定点方案,唯一的方法是理论推导信号处理过程中每个随机信号的范围,按照此范围直接确定定点方案(当然,定点仿真还是必须得做,因为定点化带来的另一个问题——精度损失,在理论上更加难以估计,一般的做法都是用定点仿真来确定精度损失到底有多大)。但此方法却有其固有的缺点,即理论推导有时候很繁琐,或者由于公式复杂根本推导不出数据范围,又或者数据范围本身就无穷大。
- 如果系统设计者想得到可能溢出的方案,只须达到溢出的概率尽量小,则可以通过定点仿真的办法。仿真量越大,定点方案溢出的概率就越小。如果用一倍数据量跑浮点仿真来确定定点方案,再用该定点方案去跑十倍数据量,很大可能会出现溢出。同理,用一倍数据量跑浮点仿真来确定定点方案,其溢出的概率肯定比用十倍数据量溢出的概率更大。我们可以用平均无故障时间(Mean Time Between Failure,MTBF)来直观地度量溢出的概率。
- 另外,理论推导和仿真相互融合的方案不失为一个折衷。比如一个大的系统,某部分可能理论推导比较好做,就可以直接推算出其数据范围;而另一部分理论推导不好做,就只有定点仿真了。
4 博弈:绝不溢出 vs. 很小可能溢出
上小节中,说到可能系统设计者想得到可能溢出的方案,那么为什么还有人去设计这并不完美的方案呢?三种原因:一是做不到,二是没必要,三是为了与其它方面折衷。
4.1 做不到
上小节曾经说过,理论推导有其固有的缺点,即由于公式复杂根本推导不出数据范围,又或者数据范围本身就无穷大。比如,OFDM的频域信道估计和均衡器的设计,都涉及到除法,而很有可能除数为0,因此没法得到绝不溢出的定点方案。
4.2 没必要
现在LTE这么火,那就拿来作为例子好了。假设有一个基站,每时每刻都在不停地处理数据,OFDM带宽模式为20MHz(FFT点数2048,子载波个数1200),MIMO采用四天线全开的空分复用,星座调制采用最高阶的64QAM,CP模式采用Normal CP。则1秒就可以处理100*140 = 14000个OFDM符号。一年中处理的OFDM符号的个数为365*24*3600*14000*4,约有1.8*10的12次方,即1.8万亿个OFDM符号,根据OFDM符号PAPR的统计特性,这1.8万亿个OFDM符号的功率最大值为36,那么幅度的最大值就为6。从另一方面考虑, OFDM符号的峰值最大可能是7*sqrt(2)/sqrt(42)*sqrt(1200)=52.9(考虑了功率归一化),但取得这个峰值的概率是多大呢:4*(1/64)^1200(只有当1200个星座点全部取相同的最边角的位置时,OFDM符号才能取得最大的可能值,并且只可能在时域索引0处取得,至于为什么,这里不再赘述)。我们可以来算算要多少年才会出现如此状况。将概率取倒数,可得到2的7198次方个OFDM符号才会出现一次理论最大值,而一年的OFDM符号个数1.8万亿约等于2的40次方,所以要经过2的7158次方这么多年才会出现一次理论最大值。而宇宙也不过是137亿(大约2的34次方)年前诞生而已,如果真要经过2的7158次方这么多年,宇宙都灭亡了吧。
所以,从上面的推算可以看出,如果只要求基站1年发生1次定点溢出,可以把整数位宽定在3,而没有必要为了达到完全不溢出将整数位宽定为6。当然,我并不知道通信设备商到底是怎么要求其自家设备的MTBF的,所以从量上看可能不对,但确定定点位宽所要考虑的原理一定如上所述。
当然,以上的OFDM发射端定点稍显复杂,如果是目前我们正在用的3G或者2G本身属于单载波通信,那发射端的定点方案就实在太简单了。
4.3 折衷——产业界永恒不变的主题
就算我们能设计出绝不溢出的定点方案,也有必要这么做,那么就一定会这样做吗?答案也是否定的。
不管是IC设计商(比如高通、MTK、MARVELL),还是通信设备商(比如华为、爱立信),由于涉及到产品的成本或者硬件指标的限制,有时候不得不以增加定点溢出的概率来换取成本的降低或者硬件指标的提升。而定点溢出的概率虽然提升,但可能只是从非常小的值变到稍微大一点却仍然很小的值,比如从千万分之一上升到百万分之一。这种溢出造成的用户体验的下降基本可以忽略不计。要知道,只要定点位宽多出1位,与之相关的所有运算电路的速度都会受到影响。而在学生时代动不动就加流水这种简单粗暴的做法对于SoC来说还是代价太大,因为流水所在的前馈割集中,路径的数目可能成百上千,难道就要在这成百上千的路径中一一加上流水?我估计这流水还没加完,自己就被炒鱿鱼了吧。
另外,由于IC设计商设计的芯片主要用在终端,而系统设备商的产品主要用在基站或骨干网,两者对于设备成本和可靠性的要求不同。因此,这2类厂商在确定定点方案时会有所差异。
5 建模误差——让定点方案误入歧途
拿一个通信系统来做例子。
发送端的信号的范围可以通过理论推导精确地确定,因为发送端相对简单,都是由一堆比较简单的公式累积而成。
但一旦到接收端,数据范围就会变到无穷宽,为什么?因为我们在噪声建模的时候就是用的AWGN,噪声在每一时刻的分布都是高斯分布。其取值范围从负无穷到正无穷,任何一个值都可取,只不过越偏离期望,取得该值的概率就越小(就算很小很小,但仍然可能取得!)那我们的定点方案岂不是没法做下去了?因为要是按照完全不溢出的原则,我们需要的定点数的量化位数为无穷位!显然不可能。于是出现了3-segma准则。即高斯分布的随机变量,其值落在3倍标准差以内的概率为99.74%已经相当接近100%了,但还是有0.26%的概率落在之外。就因为这,一个采用4-segma准则的定点方案的MTBF肯定会大于采用3-segma准则的方案。那么,就因为噪声的原因,通信系统的接收端就一定不可能做出绝对不溢出的定点方案么?答案在我看来是否定的。原因有2点:
- 噪声建模的问题:AWGN只是现实噪声的数学模型,是对实际噪声的拟合,和实际噪声有偏差。这就好比我们认为一个班级学生的考试成绩服从正态分布,难道考试成绩可以取到正无穷?肯定不可能,这只是对考试成绩的一个近似。同理,AWGN也是种近似,现实中的噪声不可能取到正无穷。
- 射频和中频部分:前面所说的仿真都是纯基带仿真,没有考虑射频和中频部分。发送端的D/A和PA都有其饱和的输出电平,接收端的LNA和A/D也有其饱和的输出电平。所以,虽然噪声可以无穷大,但经过这些器件后,信号幅度已经被限制在一个有限的范围内了。
当然,我并不是批判噪声建模不准,事实上,AWGN作为通信行业普遍的数学模型,自有其准确性和便捷性。我只是认为,作为定点方案的设计人员,有必要对通信系统中的各个流程的数学建模了然于胸,只有这样,当某个流程影响了定点方案的设计时,我们才不会做出错误的判断而妄下结论。
以上只是本人的推断,因为到目前为止本人还从未接触过一个完整的物理层链路(包括RF+IF+BB),如果自己还有考虑不周全的因素,请大虾指教。
6 答在之后:你选择好了么?
回到本文最前面的问题,由于价格差异太大,我想很多人都会选择便宜的手机,但是如果第二款手机的价格不是3000,而是2000或者1500呢?我想很多人就会徘徊了。另一方面,5年不出错对我们来说并没有特别大的意义,打不通或者串音的概率极小,一般都不会影响我们的正常生活,中断了就重打呗。现在我们大家的手机一般都是2年一换,所以一个手机5年一次断话对消费者来说并没有太大的意义。
另外,溢出导致的后果只会表现在没有重传机制的实时业务(基于电路交换的语音,VoIP除外)。对于非实时业务(比如看网页),由于TCP的存在,低层的错误被检测到之后,发送端会重传。所以这种低概率的物理层错误基本上不会对用户体验产生什么影响。而一款好的App也会把可靠性的理念融入软件的设计中,在应用层为用户提供没有差错的体验。

