📄 quantexpofn.m
字号:
function quantexpofn(action, datastruct)if nargin < 1 action='init';endname = mfilename;figname = [name(1:end-2) '_fig'];f=findobj('Tag',figname);handles = get(f,'UserData');switch action case 'help' display_help(figname); case 'init' setdefaults; movegui(f,'center'); reset(handles.pdfplot); reset(handles.quantplot); makepdfplot(handles); makequantplot(handles); [x,y,D,H] = findquantize(handles); handles.quant.x = x; handles.quant.y = y; handles.quant.D = D; handles.quant.H = H; updatepdfplot(handles); updatequantplot(handles); case 'resize' movegui(f,'onscreen'); case 'updateall' [x,y,D,H] = findquantize(handles); handles.quant.x = x; handles.quant.y = y; handles.quant.D = D; handles.quant.H = H; updatepdfplot(handles); updatequantplot(handles); case 'updatequant' case 'printlevels' disp(handles.quant.x) disp(handles.quant.y) disp(['Distortion = ' num2str(handles.quant.D)]) disp(['SQNR = ' num2str(10*log10(str2num(get(handles.pdfvar,'String'))/handles.quant.D))]) case 'apply' handles.audiodata = load_audiodata; if ~isfield(handles.audiodata, 'filenamepath') return; end if (size(handles.audiodata.data,2) > 1) handles.audiodata.data = normalize(to_mono(handles.audiodata.data)); end handles.qaudiodata = handles.audiodata; [handles.qaudiodata.data, D] = quantizedata(handles.audiodata.data, ... handles.quant.x, handles.quant.y); set(handles.play_orig,'Visible','on'); set(handles.play_quant,'Visible','on'); case 'play_orig' if isfield(handles,'audiodata') play_audiodata(handles.audiodata); end case 'play_quant' if isfield(handles,'audiodata') play_audiodata(handles.qaudiodata); end case 'show' updatepdfplot(handles); case 'print' print_figure(f); case 'close' close_figure(f,figname(1:end-4)); return;endset(f,'UserData',handles);% --------------------------------------------------------------------function makepdfplot(handles);axes(handles.pdfplot);set(handles.pdfplot,'XLim',[-2 2],'YLim',[-0.1 1],'YTick',[]);xlabel('x');ylabel('Density');function makequantplot(handles);axes(handles.quantplot);set(handles.quantplot,'XLim',[-2 2],'YLim',[-2 2]);xlabel('Input');ylabel('Quantization');% --------------------------------------------------------------------function updatepdfplot(handles) sig2 = str2num(get(handles.pdfvar,'String')); pdftype = get(handles.pdfmenu,'String'); [fx,x] = getpdf(lower(pdftype{get(handles.pdfmenu,'Value')}),sig2); axes(handles.pdfplot); cla; plot(x,fx,'LineWidth',2); hold on; line([-300*sqrt(sig2) 300*sqrt(sig2)],[0 0]); if get(handles.showL,'Value') plot(handles.quant.y,zeros(1,length(handles.quant.y)),'ko','MarkerSize',8); end if get(handles.showR,'Value') for i=1:length(handles.quant.y)+1 line([handles.quant.x(i) handles.quant.x(i)],[-1 1], ... 'Color','k','LineStyle','--'); end end yq = handles.quant.y; axis([-max(3*sqrt(sig2), 1.2*yq(end)) max(3*sqrt(sig2), 1.2*yq(end)) ... -0.1 max(0.5,max(fx))]); set(handles.pdfplot,'YTick',[]); xlabel('x'); ylabel('Density'); distype = get(handles.distmenu,'String'); switch lower(distype{get(handles.distmenu,'Value')}) case 'squared error' title(['Distortion = ' num2str(handles.quant.D) ' SQNR = ' ... num2str(10*log10(sig2/handles.quant.D)) ' dB Entropy = ' ... num2str(handles.quant.H)]); otherwise N = str2num(get(handles.nlevels,'String')); pdftype = get(handles.pdfmenu,'String'); if rem(N,2) == 0 x = handles.quant.x(N/2+1:end); y = handles.quant.y(N/2+1:end); else x = handles.quant.x((N+1)/2+1:end); y = handles.quant.y((N+1)/2:end); end No = getNoisePower(x,y,sig2, ... lower(pdftype{get(handles.pdfmenu,'Value')})); title(['Distortion = ' num2str(handles.quant.D) ' SQNR = ' ... num2str(10*log10(sig2/No)) ' dB Entropy = ' ... num2str(handles.quant.H)]); endfunction updatequantplot(handles); N = str2num(get(handles.nlevels,'String')); sig2 = str2num(get(handles.pdfvar,'String')); xq = handles.quant.x; yq = [handles.quant.y handles.quant.y(end)]; xq(find(abs(xq)==Inf)) = 1000*sign(xq(find(abs(xq)==Inf))); axes(handles.quantplot); cla; stairs(xq,yq); hold on; line([1.1*yq(1) 1.1*yq(N)],[0 0],'Color','k','LineStyle','--'); line([0 0],[1.1*yq(1) 1.1*yq(N)],'Color','k','LineStyle','--'); axis([1.1*yq(1) 1.1*yq(N) 1.1*yq(1) 1.1*yq(N)]); set(handles.quantplot,'XTick',xq,'YTick',yq(1:end-1)); grid on; function [fx,x] = getpdf(type,var) switch type case 'uniform' V = sqrt(3*var); x = [-6*V:0.01:6*V]; fx = zeros(1,length(x)); fx(find(abs(x)<=V)) = 1/(2*V); case 'gaussian' x = [-6*sqrt(var):0.01:6*sqrt(var)]; fx = 1/(sqrt(2*pi*var))*exp(-x.^2/(2*var)); case 'laplacian' l = sqrt(2/var); x = [-60/l:0.01:60/l]; fx = (l/2)*exp(-l*abs(x)); endfunction [x,y,D,H] = findquantize(handles) N = str2num(get(handles.nlevels,'String')); var = str2num(get(handles.pdfvar,'String')); sig = sqrt(var); quantype = get(handles.quantmenu,'String'); pdftype = get(handles.pdfmenu,'String'); distype = get(handles.distmenu,'String'); switch lower(pdftype{get(handles.pdfmenu,'Value')}) case 'uniform' [x,y,D,H] = quniform(N,var, ... lower(quantype{get(handles.quantmenu,'Value')}), ... lower(distype{get(handles.distmenu,'Value')})); case 'gaussian' [x,y,D,H] = qgauss(N,var, ... lower(quantype{get(handles.quantmenu,'Value')}), ... lower(distype{get(handles.distmenu,'Value')})); case 'laplacian' [x,y,D,H] = qlaplace(N,var, ... lower(quantype{get(handles.quantmenu,'Value')}), ... lower(distype{get(handles.distmenu,'Value')})); end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -