Этот пример показывает, как вычислить и сравнить статистику ошибки квантования сигнала при использовании различных методов округления.
Сначала создается случайный сигнал, который охватывает область значений квантователя.
Затем квантуют сигнал, соответственно, с помощью методов округления 'fix', 'floor', 'ceil', 'near' и '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' округлением, функция плотности вероятностей в два раза шире, чем другие. По этой причине отклонение в четыре раза больше, чем у остальных.
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

Округление пола часто называется усечением при использовании с целыми числами и числами с фиксированной точкой, которые представлены в дополнении двойки. Это наиболее распространенный режим округления процессоров DSP, поскольку для его реализации не требуется никакого оборудования. Floor не приводит к квантованным значениям, которые так близки к истинным значениям, как ROUND will, но имеет то же отклонение, и будут обнаружены небольшие сигналы, которые варьируются в знаке, тогда как в 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

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

Раунд более точен, чем этаж, но все значения, меньшие, чем 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

Сходящееся округление устраняет смещение, вызванное обычным «округлением», вызванным всегда округлением галстука в том же направлении.
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

Функцию плотности вероятности ошибки для сходимого округления трудно отличить от функции округления к ближайшему, глядя на график.
Ошибка p.d.f. сходящимся является
f(err) = 1/eps(q), for -eps(q)/2 <= err <= eps(q)/2, and 0 otherwise
в то время как ошибка p.d.f. round есть
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
Функция helper, которая использовалась для генерации графиков в этом примере, приведена ниже.
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')