Этот пример показывает, как вычислить и сравнить статистику ошибки квантования сигнала при использовании различных методов округления.
Во-первых, случайный сигнал создается, который порождает линейную оболочку столбцов квантизатора.
Затем, сигнал квантуется, соответственно, с округлением методов 'фиксируют', 'ставят в тупик', 'перекрывают', 'самый близкий', и 'конвергентный', и статистические данные сигнала оцениваются.
Теоретическая функция плотности вероятности ошибки квантования будет вычислена с 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);
Заметьте, что с округлением 'фиксации', функция плотности вероятности вдвое более широка, чем другие. Поэтому отклонение в четыре раза больше чем это других.
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
Пол, округляющийся, часто называется усечением, когда используется с целыми числами и числами фиксированной точки, которые представлены в дополнении two. Это - наиболее распространенный режим округления процессоров DSP, потому что это требует, чтобы никакое оборудование не реализовало. Пол не производит квантованные значения, которые являются как близко к истинным значениям, когда 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
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. раунда
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')