⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quantexpofn.m

📁 非常好的数字处理教程
💻 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 + -