一种高效的q+1准均匀量化(quasi-uniform quantization)方法及MATLAB实现

一种高效的q+1准均匀量化(quasi-uniform quantization)方法及MATLAB实现

简介

在将算法部署到硬件平台时,使用single或double型数据会占用大量的存储空间,因此一般需要将数据进行合适的量化,减少硬件资源使用同时提高算法效率。而常见的均匀量化出现的溢出现象会降低数据精度,影响部署后的算法性能。这里将介绍一种高效的准均匀量化(quai-uniform quantization)方法,其在均匀量化的基础上加入了一个额外的状态比特位,从而实现了在一定数值范围内实现均匀量化,超出该范围后可实现非均匀量化,大大扩展了量化范围,尽可能的保留了数据精度。该方法的出处见参考文献。

算法描述

首先介绍均匀量化,再进一步得出准均匀量化。

均匀量化

假设量化后结果使用 q q q个二进制数表示,总量化数为 2 q − 1 2^{q}-1 2q1,设量化间隔为 Δ \Delta Δ,则对于任意实数 x x x,其量化结果为:
Q Δ ( x ) = sgn ⁡ ( x ) Δ ⌊ ∣ x ∣ Δ + 1 2 ⌋ Q_{\Delta}(x)=\operatorname{sgn}(x) \Delta\left\lfloor\frac{|x|}{\Delta}+\frac{1}{2}\right\rfloor QΔ(x)=sgn(x)ΔΔx+21
N = 2 q − 1 − 1 N=2^{q-1}-1 N=2q11,有 2 N + 1 = 2 q − 1 2 N+1=2^{q}-1 2N+1=2q1,则 max ⁡ ∣ Q Δ ( x ) ∣ = N Δ \max \left|Q_{\Delta}(x)\right|=N \Delta maxQΔ(x)=NΔ,量化结果还可表示为 Q Δ ( x ) = m Δ ( m = − ( 2 q − 1 − 1 ) , − ( 2 q − 1 − 2 ) , … , 0 , … , 2 q − 1 − 1 ) Q_{\Delta}(x)=m \Delta\left(m=-\left(2^{q-1}-1\right),-\left(2^{q-1}-2\right), \dots, 0, \dots, 2^{q-1}-1\right) QΔ(x)=mΔ(m=(2q11),(2q12),,0,,2q11),即:
Q Δ , q ( x ) = { N Δ ,  if  N Δ − Δ 2 ≤ x m Δ ,  if  m Δ − Δ 2 ≤ x < m Δ + Δ 2  for  N > m > 0 0 ,  if  − Δ 2 < x < Δ 2 m Δ ,  if  m Δ − Δ 2 < x ≤ m Δ + Δ 2  for  0 > m > − N − N Δ ,  if  x ≤ − N Δ + Δ 2 Q_{\Delta, q}(x)=\left\{\begin{array}{cc} N \Delta, & \text { if } \quad N \Delta-\frac{\Delta}{2} \leq x \\ m \Delta, & \text { if } \quad m \Delta-\frac{\Delta}{2} \leq x<m \Delta+\frac{\Delta}{2} \\ & \quad \text { for } N>m>0 \\ 0, & \text { if } \quad-\frac{\Delta}{2}<x<\frac{\Delta}{2} \\ m \Delta, & \text { if } \quad m \Delta-\frac{\Delta}{2}<x \leq m \Delta+\frac{\Delta}{2} \\ & \quad \text { for } 0>m>-N \\ -N \Delta, & \text { if } \quad x \leq-N \Delta+\frac{\Delta}{2} \end{array}\right. QΔ,q(x)=NΔ,mΔ,0,mΔ,NΔ, if NΔ2Δx if mΔ2Δx<mΔ+2Δ for N>m>0 if 2Δ<x<2Δ if mΔ2Δ<xmΔ+2Δ for 0>m>N if xNΔ+2Δ
将m用q位二进制数表示,即 binary ⁡ ( m ) = [ m 0 , m 1 , … , m q − 1 ] \operatorname{binary}(\mathrm{m})=\left[\mathrm{m}_{0}, \mathrm{m}_{1}, \ldots, \mathrm{m}_{\mathrm{q}-1}\right] binary(m)=[m0,m1,,mq1] m 0 \mathrm{m}_{0} m0为符号位,当 m m m为正数是其值为1,负数时其值为0,后 q − 1 q-1 q1位表示 ∣ m ∣ |m| m
扩展量化范围一般有两种方式,即增大量化间隔 Δ \Delta Δ或用更多的二进制位表示数据,前者会损失精度,后者则会带来更多的资源开销和计算复杂度。

准均匀量化

在均匀量化中,待量化数x绝对值大于 N Δ N \Delta NΔ时会被截断,当 x x x的取值范围分布很广时这会造成很大的精度损失。准均匀量化在均匀量化的基础是增加一个比特,即 q + 1 q+1 q+1位,用来表示当数据超出一定范围后将采用非均匀量化。
定义参数增长速率 d d d,有 d > 1 d>1 d>1,当输入值 x x x取值在 ( − d N Δ , d N Δ ) (-d N \Delta, d N \Delta) (dNΔ,dNΔ)之间时采用均匀量化,量化间隔为 Δ \Delta Δ;若 x > N Δ x>N\Delta x>NΔ,则将 x x x量化为 d r N Δ , 1 ≤ r ≤ N + 1 d^{r} N \Delta, 1 \leq r \leq N+1 drNΔ,1rN+1,相似的,当 x < − N Δ x<-N\Delta x<NΔ,将x量化为 − d r N Δ , 1 ≤ r ≤ N + 1 -d^{r} N \Delta, 1 \leq r \leq N+1 drNΔ,1rN+1。上述q+1位的准均匀量化的结果用 Q Δ , q ∗ ( x ) Q_{\Delta, q}^{*}(x) QΔ,q(x)表示,如下所示:
Q Δ , q ∗ ( x ) = { d N + 1 N Δ ,  if  d N + 1 N Δ ≤ x d r N Δ ,  if  d r N Δ ≤ x < d r + 1 N Δ  for  N ≥ r ≥ 1 Q Δ , q ( x ) ,  if  − d N Δ < x < d N Δ − d r N Δ ,  if  − d r + 1 N Δ < x ≤ − d r N Δ ,  for  1 ≤ r ≤ N − d N + 1 N Δ ,  if  x ≤ − d N + 1 N Δ Q_{\Delta, q}^{*}(x)=\left\{\begin{array}{ccl}d^{N+1} N \Delta, & \text { if } & d^{N+1} N \Delta \leq x \\ d^{r} N \Delta, & \text { if } & d^{r} N \Delta \leq x<d^{r+1} N \Delta \\ & & \text { for } N \geq r \geq 1 \\ Q_{\Delta, q}(x), & \text { if } & -d N \Delta<x<d N \Delta \\ -d^{r} N \Delta, & \text { if } & -d^{r+1} N \Delta<x \leq-d^{r} N \Delta, \\ & & \text { for } 1 \leq r \leq N \\ -d^{N+1} N \Delta, & \text { if } & x \leq-d^{N+1} N \Delta\end{array}\right. QΔ,q(x)=dN+1NΔ,drNΔ,QΔ,q(x),drNΔ,dN+1NΔ, if  if  if  if  if dN+1NΔxdrNΔx<dr+1NΔ for Nr1dNΔ<x<dNΔdr+1NΔ<xdrNΔ, for 1rNxdN+1NΔ
此时将准均匀量化中的 m m m扩展为 q + 1 q+1 q+1位比特表示,即 binary ⁡ ( m ) = [ m 0 , m 1 , … , m q − 1 , m q ] \operatorname{binary}(\mathrm{m})=\left[\mathrm{m}_{0}, \mathrm{m}_{1}, \ldots, \mathrm{m}_{\mathrm{q}-1},\mathrm{m}_{\mathrm{q}}\right] binary(m)=[m0,m1,,mq1,mq],前q位意义不变, m q = 0 \mathrm{m}_{\mathrm{q}}=0 mq=0,即表示采用均匀量化。x取值超出均匀量化取值范围后,采用非均匀量化,此时将 r r r q + 1 q+1 q+1位比特表示,即 binary ⁡ ( r ) = [ r 0 , r 1 , … , r q − 1 , r q ] \operatorname{binary}(\mathrm{r})=\left[\mathrm{r}_{0}, \mathrm{r}_{1}, \ldots, \mathrm{r}_{\mathrm{q}-1},\mathrm{r}_{\mathrm{q}}\right] binary(r)=[r0,r1,,rq1,rq] r 0 \mathrm{r}_{0} r0为符号位, r q = 1 \mathrm{r}_{q}=1 rq=1表示当前采用非均匀量化。有以下两点需要注意:

  1. 该量化方法的均匀量化阶段与一般均匀量化有一点不同,当 − ( N − 1 ) ≤ m ≤ N − 1 -(N-1) \leq m \leq N-1 (N1)mN1时完全等同于一般均匀量化,而此后有一段长为 d N Δ − N Δ + Δ 2 d N \Delta-N \Delta+\frac{\Delta}{2} dNΔNΔ+2Δ的区间需将 m m m强制量化为 N N N
  2. 在非均匀量化阶段,当输入值x>0时, [ r 1 , … , r q − 1 ] [\mathrm{r}_{1},\ldots,\mathrm{r}_{q-1}] [r1,,rq1]表示值 r − 1 r-1 r1;当输入值x<0时, [ r 1 , … , r q − 1 ] [\mathrm{r}_{1},\ldots,\mathrm{r}_{q-1}] [r1,,rq1]表示值 r + 1 r+1 r+1。如设 q = 3 q=3 q=3 Q Δ , q ∗ ( x ) = 0011 Q_{\Delta, q}^{*}(x)=0011 QΔ,q(x)=0011表示 r = 2 r=2 r=2 Q Δ , q ∗ ( x ) = 1011 Q_{\Delta, q}^{*}(x)=1011 QΔ,q(x)=1011表示 r = − 2 r=-2 r=2

MATLAB代码

minv = -300;
maxv = 300;
global q delta d N;
x = minv + (maxv-minv).*rand; % 生成取值在[minv maxv]之间的数

q = 3;      % 二进制位个数
delta = 1;  % 量化间隔
d = 3;      % 增长速率

N = 2^(q-1)-1;

quq = quasi_uni_quanitization(x);

function quq = quasi_uni_quanitization(x)
   global q delta d N;
   r = 0;
   ssign = sign(x);
   if  x > (-d*N*delta) && x < (d*N*delta)
       quq = uni_quanitization(x);
   elseif x >= d^(N+1)*N*delta
       r = N;
       bin_abs_r = dec2bin(r,q-1);
       quq = strcat('0',bin_abs_r,'1');
   elseif x <= -d^(N+1)*N*delta
       r = -N;
       bin_abs_r = dec2bin(abs(r),q-1);
       quq = strcat('1',bin_abs_r,'1');
   elseif ssign > 0
       while x >= d^(r+1)*N*delta
           r = r+1;
       end
       % 注意当输入x>0时,中间的q-1位比特表示的值是(r-1),如q=30001表示r=1
       bin_abs_r = dec2bin(r-1,q-1);
       quq = strcat('0',bin_abs_r,'1');
   elseif ssign < 0
       while x <= -d^(r+1)*N*delta
           r = r-1;
       end
       % 注意当输入x<0时,中间的q-1位比特表示的值是(r+1),如q=31001表示r=-1
       bin_abs_r = dec2bin(abs(r+1),q-1);
       quq = strcat('1',bin_abs_r,'1');
   end
end
function uq = uni_quanitization(x)
    global q delta N;
    ssign = sign(x);
    m = 0;
    if x < delta/2 && x > -delta/2
        m = 0;
        uq = dec2bin(m,q+1);
    elseif ssign > 0
        while x >= (m*delta + delta/2)
             m = m+1;
        end
        % 注意在准均匀量化中-(N-1)<= m<= N-1这一段才等同于均匀量化,
        % 此后有一段长度为d*N*Δ-N*Δ+Δ/2的区间需进行截断
        % 仅使用均匀量化时注意将以下三行注释掉
        if m > N
            m = N;      
        end
        bin_abs_m = dec2bin(m,q-1); 
        uq = strcat('0',bin_abs_m,'0');
    elseif ssign < 0 
        while x <= (m*delta - delta/2)
            m = m-1;
        end
        % 注意在准均匀量化中-(N-1)<= m<= N-1这一段才等同于均匀量化,
        % 此后有一段长度为d*N*Δ-N*Δ+Δ/2的区间需进行截断
        % 仅使用均匀量化时注意将以下三行注释掉
        if m < -N
            m = -N;
        end
        bin_abs_m = dec2bin(abs(m),q-1); 
        uq = strcat('1',bin_abs_m,'0');
    end   
end

效果

这里粘贴上原文中图4的结果,将该量化方法应用在LDPC译码中的最小和(MS)算法,其效果如图可见效果是惊人的,有效的降低了LDPC译码在较高信噪比时出现的error floor。

参考文献

X. Zhang and P. H. Siegel, “Quantized Iterative Message Passing Decoders with Low Error Floor for LDPC Codes,” in IEEE Transactions on Communications, vol. 62, no. 1, pp. 1-14, January 2014.

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ice&Bing~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值