CSD(Canonic signed digit)正则有符号数

来源:互联网 发布:车辆数据 编辑:程序博客网 时间:2024/06/07 01:51

CSD的全称是Canonic signed digit,这是一种很有意思的数,下面我先举一个CSD数的例子让大家有个直观的印象


例如我们想用12位二进制数表示(-1,1)范围内的数,比如0.9985这个数,如果用12位的二进制数表示是:011111111101(第一是符号位,小数点在第一位到第二位之间)


那么0.9985的CSD数是100000000(-1)01


好了,0.9985的二进制表示大家都懂,就不用多说了,但是100000000(-1)01是个什么gui呢?算一下就知道了

100000000(-1)01 = 1-2^(-9)+2^(-11),这样就清楚了,第一位带表1,第九位是-1,带表-2^(-9),第十一位是1带表+2^(-11)

------------------------------------------------------------------------------------------------------------------------------------------------------------------

问:CSD这种表示引入了-1这种比较另类的值,有什么作用呢?

这里引用一段话 “In 1961, Avizienis  described the signed digit number system (used since the 1950s  in order to improve speed in arithmetic computation. The Canonical Signed Digit (CSD) number system is a signed digit number system that minimize the number of non-zero digits and thus can reduce the number of partial product additions in a hardware multiplier.”--《CANONICAL SIGNED DIGIT REPRESENTATION FOR FIR DIGITAL FILTERS 》

大概意思就是CSD码可以降低非0数的个数,对比上面的一个例子,同样表示0.9985,用二进制表示一共需要10个1,尔使用CSD码只需要2个非0数。 更据理论计算,使用二进制表示的数大约有1/2的非零值,使用CSD表示的数大约有1/3的非零值。


问:非零值少有什么好处呢?

在FPGA的设计中,乘法器的设计往往非常重要,如果乘数是确知的一组数的话,那么可以不使用全规模的乘法器转而设计专用乘法器,这里举一个例子

B=A乘01100001(有符号的补码数)

B=A左移6位+A左移5位+A

可以看出非零值越少,需要做的操作也相应的变少。


问:既然怎么好,那怎么求CSD数呢?

引用eetop论坛的网友“skytang007”的回答

正则数编码,很简单
从低位到高位,  如果发现"11"(两个连续的"1"),就用10(-1)表示。因为11 = 100 -001。
这样,你就把“11”用0(-1)来替换,10(-1)中的最高位“1”就进位到高位去,后面以此类推。
例如 001010101101110
      =0010101011100(-1)0
      =0010101100(-1)00(-1)0
      =0010110(-1)00(-1)00(-1)0
      = 00110(-1)0(-1)00(-1)00(-1)0
     =  010(-1)0(-1)0(-1)00(-1)00(-1)0





0 0
原创粉丝点击