欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-22 23:05:28
...

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

简介

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

算法描述

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

均匀量化

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

准均匀量化

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

  1. 该量化方法的均匀量化阶段与一般均匀量化有一点不同,当(N1)mN1-(N-1) \leq m \leq N-1时完全等同于一般均匀量化,而此后有一段长为dNΔNΔ+Δ2d N \Delta-N \Delta+\frac{\Delta}{2}的区间需将mm强制量化为NN
  2. 在非均匀量化阶段,当输入值x>0时,[r1,,rq1][\mathrm{r}_{1},\ldots,\mathrm{r}_{q-1}]表示值r1r-1;当输入值x<0时,[r1,,rq1][\mathrm{r}_{1},\ldots,\mathrm{r}_{q-1}]表示值r+1r+1。如设q=3q=3QΔ,q(x)=0011Q_{\Delta, q}^{*}(x)=0011表示r=2r=2QΔ,q(x)=1011Q_{\Delta, q}^{*}(x)=1011表示r=2r=-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)算法,其效果如图一种高效的q+1准均匀量化(quasi-uniform quantization)方法及MATLAB实现可见效果是惊人的,有效的降低了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.