一种高效的q+1准均匀量化(quasi-uniform quantization)方法及MATLAB实现
简介
在将算法部署到硬件平台时,使用single或double型数据会占用大量的存储空间,因此一般需要将数据进行合适的量化,减少硬件资源使用同时提高算法效率。而常见的均匀量化出现的溢出现象会降低数据精度,影响部署后的算法性能。这里将介绍一种高效的准均匀量化(quai-uniform quantization)方法,其在均匀量化的基础上加入了一个额外的状态比特位,从而实现了在一定数值范围内实现均匀量化,超出该范围后可实现非均匀量化,大大扩展了量化范围,尽可能的保留了数据精度。该方法的出处见参考文献。
算法描述
首先介绍均匀量化,再进一步得出准均匀量化。
均匀量化
假设量化后结果使用个二进制数表示,总量化数为,设量化间隔为,则对于任意实数,其量化结果为:
令,有,则,量化结果还可表示为,即:
将m用q位二进制数表示,即,为符号位,当为正数是其值为1,负数时其值为0,后位表示。
扩展量化范围一般有两种方式,即增大量化间隔或用更多的二进制位表示数据,前者会损失精度,后者则会带来更多的资源开销和计算复杂度。
准均匀量化
在均匀量化中,待量化数x绝对值大于时会被截断,当的取值范围分布很广时这会造成很大的精度损失。准均匀量化在均匀量化的基础是增加一个比特,即位,用来表示当数据超出一定范围后将采用非均匀量化。
定义参数增长速率,有,当输入值取值在之间时采用均匀量化,量化间隔为;若,则将量化为,相似的,当,将x量化为。上述q+1位的准均匀量化的结果用表示,如下所示:
此时将准均匀量化中的扩展为位比特表示,即,前q位意义不变,,即表示采用均匀量化。x取值超出均匀量化取值范围后,采用非均匀量化,此时将用位比特表示,即,为符号位,表示当前采用非均匀量化。有以下两点需要注意:
- 该量化方法的均匀量化阶段与一般均匀量化有一点不同,当时完全等同于一般均匀量化,而此后有一段长为的区间需将强制量化为。
- 在非均匀量化阶段,当输入值x>0时,表示值;当输入值x<0时,表示值。如设,表示,表示。
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=3时0001表示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=3时1001表示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.