CSD编码就是将‘11’变成‘10(-1)’,其中最高位的1为向前一位的进位(注意:编码前后数值不变)
先将滤波器的系数整理一下:
fid1 = fopen(‘hb_filter_b1_b2.txt‘,‘w‘);
fprintf(fid1,‘b1 = \n‘);
for i = 1:L1
fprintf(fid1,‘%2.24f‘,b1(i));
fprintf(fid1,‘\n‘);
end
fprintf(fid1,‘b2 = \n‘);
for i = 1:L2
fprintf(fid1,‘%2.24f‘,b2(i));
fprintf(fid1,‘\n‘);
end
fclose(fid1);
将(半带)滤波器系数b1导出到文档中,然后做一下量化,我们把输出小数位数定为24bit
b1 = x(2^24) 24bit小数 CSD编码
-0.031394965341144054000000 526720 -(0000 1000 0000 1001 1000 0000?) -(0000 1000 0000 1001 1000 0000?) 连续的‘1’不多,所以不编码用原值
0.000000000000000000000000
0.281394519027249990000000 4721016 0100 1000 0000 1001 0111 1000? 0100 1000 0000 1001 1000 (-1)000?
0.500000000000000000000000 8388608 1000 0000 0000 0000 0000 0000? 1000 0000 0000 0000 0000 0000?
0.281394519027249990000000
0.000000000000000000000000
-0.031394965341144054000000
b2 =
-0.031834594252995910000000 534095 -(0000 1000 0010 0110 0100 1111?) -(0000 1000 0010 0110 0101 000(-1)?)
0.000000000000000000000000
0.281827409659883290000000 4728279 0100 1000 0010 0101 1101 0111? 0100 1000 0100 0110 00-10 -100-1
0.500000000000000000000000 8388608 1000 0000 0000 0000 0000 0000? 1000 0000 0000 0000 0000 0000
0.281827409659883290000000
0.000000000000000000000000
-0.031834594252995910000000
eg. 0.3086=2^(-2) + 2^(-4) - 2^(-8)
0.3086x=2^(-2)x + 2^(-4)x - 2^(-8)x 其中产生了x右移8bit
=2^(-2)( x + 2^(-2)( x - 2^(-4)x ) ) 其中最多x右移4bit
(平均右移数从4.6bit降低至2.6bit)
故,带来的好处是1、降低了舍入噪声;2、减少了总共所需位移长度,降低加法运算量
-(0000 1000 0000 1001 1000 0000?)
5 13 16 17
所以,b1(1)x=-0.031394965341144054x = - ( 2^(-5)x + 2^(-13)x + 2^(-16)x + 2^(-17)x )
= - ((( (2^(-5)x + x)2^(-8) + x )2^(-3) + x )2^(-1)
assign b11‘ = (((din>>5 + din) >>8 +din) >>3 +din )>>1 ;
assign b11 = (~b11‘) + 1;
原文:https://www.cnblogs.com/gmh1996/p/12926097.html