量子化誤差の計算
この例では、さまざまな丸め手法を使用する場合に、信号の量子化誤差の統計値を計算および比較する方法を説明します。
まず、量子化器の範囲内にランダム信号が作成されます。
次に、fix、floor、ceil、nearest、convergent といった丸め手法で信号が量子化されて、信号の統計値が推測されます。
量子化誤差の論理的確率密度関数は、ERRPDF を使用して計算されます。量子化誤差の理論的平均値は、ERRMEAN を使用して計算されます。また、量子化誤差の理論的分散は、ERRVAR で計算されます。
一様分布ランダム信号
まず、これから見る固定小数点量子化器の -1 ~ 1 の領域に及ぶ一様分布ランダム信号を作成します。
q = quantizer([8 7]);
r = realmax(q);
u = r*(2*rand(50000,1) - 1); % Uniformly distributed (-1,1)
xi=linspace(-2*eps(q),2*eps(q),256);
Fix: ゼロ方向への丸め
fix 丸めでは、確率密度関数は、他と比べて幅が 2 倍であることに注意してください。このため、分散は他の 4 倍となります。
q = quantizer('fix',[8 7]); err = quantize(q,u) - u; f_t = errpdf(q,xi); mu_t = errmean(q); v_t = errvar(q); % Theoretical variance = eps(q)^2 / 3 % Theoretical mean = 0 fidemo.qerrordemoplot(q,f_t,xi,mu_t,v_t,err)
Estimated error variance (dB) = -46.8586 Theoretical error variance (dB) = -46.9154 Estimated mean = 7.788e-06 Theoretical mean = 0
Floor: 負の無限大方向への丸め
floor 丸めは、2 の補数で表される固定小数点数や整数と共に使用される場合は切り捨てと呼ばれます。実装にハードウェアが必要ないため、DSP プロセッサの丸めモードでは最も一般的です。floor は、ROUND ほどには実際値に近い量子化された値を生成しませんが、同じ分散になります。また、符号が異なる小さな信号を検出します。Round ではそれらは失われるのに対して符号が異なる同じ信号が検出されます。
q = quantizer('floor',[8 7]); err = quantize(q,u) - u; f_t = errpdf(q,xi); mu_t = errmean(q); v_t = errvar(q); % Theoretical variance = eps(q)^2 / 12 % Theoretical mean = -eps(q)/2 fidemo.qerrordemoplot(q,f_t,xi,mu_t,v_t,err)
Estimated error variance (dB) = -52.9148 Theoretical error variance (dB) = -52.936 Estimated mean = -0.0038956 Theoretical mean = -0.0039062
Ceil: 正の無限大方向への丸め
q = quantizer('ceil',[8 7]); err = quantize(q,u) - u; f_t = errpdf(q,xi); mu_t = errmean(q); v_t = errvar(q); % Theoretical variance = eps(q)^2 / 12 % Theoretical mean = eps(q)/2 fidemo.qerrordemoplot(q,f_t,xi,mu_t,v_t,err)
Estimated error variance (dB) = -52.9148 Theoretical error variance (dB) = -52.936 Estimated mean = 0.0039169 Theoretical mean = 0.0039062
Round: 最も近い整数への丸め。等距離では、最も大きい方向への丸め
round は floor より正確ですが、eps(q) より小さい値はすべてゼロに丸められ、失われます。
q = quantizer('nearest',[8 7]); err = quantize(q,u) - u; f_t = errpdf(q,xi); mu_t = errmean(q); v_t = errvar(q); % Theoretical variance = eps(q)^2 / 12 % Theoretical mean = 0 fidemo.qerrordemoplot(q,f_t,xi,mu_t,v_t,err)
Estimated error variance (dB) = -52.9579 Theoretical error variance (dB) = -52.936 Estimated mean = -2.212e-06 Theoretical mean = 0
Convergent: 最も近い整数への丸め。等距離では、偶数方向への丸め
convergent 丸めは、等距離を常に同じ方向へ丸める通常の「丸め」によって生じるバイアスを除去します。
q = quantizer('convergent',[8 7]); err = quantize(q,u) - u; f_t = errpdf(q,xi); mu_t = errmean(q); v_t = errvar(q); % Theoretical variance = eps(q)^2 / 12 % Theoretical mean = 0 fidemo.qerrordemoplot(q,f_t,xi,mu_t,v_t,err)
Estimated error variance (dB) = -52.9579 Theoretical error variance (dB) = -52.936 Estimated mean = -2.212e-06 Theoretical mean = 0
Nearest と Convergent の比較
プロットを見ただけでは、偶数丸め誤差と最も近い正の整数方向への丸めの確率密度関数を区別するのは困難です。
最も近い偶数方向への丸め誤差 p.d.f. は、
f(err) = 1/eps(q), for -eps(q)/2 <= err <= eps(q)/2, and 0 otherwise
最も近い整数方向への丸め誤差の確率密度関数 (p.d.f.) は、
f(err) = 1/eps(q), for -eps(q)/2 < err <= eps(q)/2, and 0 otherwise
最も近い整数方向への丸めは正の方向へわずかにバイアスがありますが、最も近い偶数方向への丸め誤差 p.d.f. は対称的です。
唯一の違いは、等距離における丸めの方向です。
x=(-3.5:3.5)'; [x convergent(x) nearest(x)]
ans = -3.5000 -4.0000 -3.0000 -2.5000 -2.0000 -2.0000 -1.5000 -2.0000 -1.0000 -0.5000 0 0 0.5000 0 1.0000 1.5000 2.0000 2.0000 2.5000 2.0000 3.0000 3.5000 4.0000 4.0000
プロット補助関数
この例でプロットの生成に使用された補助関数を以下にリストします。
type(fullfile(matlabroot,'toolbox','fixedpoint','fidemos','+fidemo','qerrordemoplot.m')) %#ok<*NOPTS>
function qerrordemoplot(q,f_t,xi,mu_t,v_t,err) %QERRORDEMOPLOT Plot function for QERRORDEMO. % QERRORDEMOPLOT(Q,F_T,XI,MU_T,V_T,ERR) produces the plot and display % used by the example function QERRORDEMO, where Q is the quantizer % whose attributes are being analyzed; F_T is the theoretical % quantization error probability density function for quantizer Q % computed by ERRPDF; XI is the domain of values being evaluated by % ERRPDF; MU_T is the theoretical quantization error mean of quantizer Q % computed by ERRMEAN; V_T is the theoretical quantization error % variance of quantizer Q computed by ERRVAR; and ERR is the error % generated by quantizing a random signal by quantizer Q. % % See QERRORDEMO for examples of use. % Copyright 1999-2014 The MathWorks, Inc. v=10*log10(var(err)); disp(['Estimated error variance (dB) = ',num2str(v)]); disp(['Theoretical error variance (dB) = ',num2str(10*log10(v_t))]); disp(['Estimated mean = ',num2str(mean(err))]); disp(['Theoretical mean = ',num2str(mu_t)]); [n,c]=hist(err); figure(gcf) bar(c,n/(length(err)*(c(2)-c(1))),'hist'); line(xi,f_t,'linewidth',2,'color','r'); % Set the ylim uniformly on all plots set(gca,'ylim',[0 max(errpdf(quantizer(q.format,'nearest'),xi)*1.1)]) legend('Estimated','Theoretical') xlabel('err'); ylabel('errpdf')