www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/models/modelexpofn.m

    %
function modelexpofn(action,datastruct)
    if nargin < 1
        action='init';
    end

	name = mfilename;
    figname = [name(1:end-2) '_fig'];
    f=findobj('Tag',figname);
    handles = get(f,'UserData');

	% If main window closes, close all other window

    switch action
		case 'help'
			display_help(figname);
        case 'init'
			setdefaults('menu');
            movegui(f,'center');
		case 'draw'
			imgsize = str2double(get(handles.imgsize,'String'));
			imgdata.data = zeros(imgsize,imgsize);
			imgdata.map = colormap('gray');

			if get(handles.twostate,'Value'),
				bits = 8;
				prev_val = round(rand*(2^bits-1));
				p = str2double(get(handles.p,'String'));
				q = str2double(get(handles.q,'String'));

				if ~get(handles.animate,'Value')
					h = waitbar(0,'Computing...');
					for i=1:imgsize,
						for j=1:imgsize,
							% Roll dice
							dice = rand;
							if prev_val == 0,
								if dice < p
									imgdata.data(i,j) = 2^bits-1;
								else
									imgdata.data(i,j) = 0;
								end
							else
								if dice < q
									imgdata.data(i,j) = 0;
								else
									imgdata.data(i,j) = 2^bits-1;
								end
							end
							prev_val = imgdata.data(i,j);
						end
						%prev_val = imgdata.data(i,1);
						waitbar(i/imgsize,h);
					end
					close(h);
					%imgdata.data = uint8(imgdata.data);
					handles.figwin = showimage(imgdata,0);
				else
					handles.figwin = showimage(imgdata,0);
					for i=1:imgsize,
						for j=1:imgsize,
							imgdata.data(i,j) = 2^bits-1;
							showimage(imgdata,0);
							% Roll dice
							dice = rand;
							if prev_val == 0,
								if dice < p
									imgdata.data(i,j) = 2^bits-1;
								else
									imgdata.data(i,j) = 0;
								end
							else
								if dice < q
									imgdata.data(i,j) = 0;
								else
									imgdata.data(i,j) = 2^bits-1;
								end
							end
                            drawnow;
							showimage(imgdata,0);
							prev_val = imgdata.data(i,j);
						end
					end
				end
				handles.imagedata = imgdata;
	            
			elseif get(handles.ar,'Value'),
				bits = 8;
				prev_val = 2^bits-1;
				alpha = str2double(get(handles.alpha,'String'));
				stdev = str2double(get(handles.std,'String'));
				meanval = (2^bits)/2-1;
				scale = get(handles.scale,'Value');
				if ~get(handles.animate,'Value')
					h = waitbar(0,'Computing...');
					for i=1:imgsize,
						for j=1:imgsize,
							pixel_val = round(prev_val*alpha + ...
								randn*stdev*(2^bits-1));
							if pixel_val > 2^bits-1,
								pixel_val = 2^bits-1;
							elseif pixel_val < 0
								pixel_val = 0;
							end
							%imgdata.data(i,j) = pixel_val+meanval;
							imgdata.data(i,j) = pixel_val;
							prev_val = pixel_val;
						end
						waitbar(i/imgsize,h);
					end
					close(h);
					handles.figwin = showimage(imgdata,scale);
				else
					handles.figwin = showimage(imgdata,scale);
					for i=1:imgsize,
						for j=1:imgsize,
							imgdata.data(i,j) = 2^(bits-1);
							showimage(imgdata,scale);
							pixel_val = round(prev_val*alpha + ...
								randn*stdev*(2^bits-1));
							if pixel_val > 2^bits-1,
								pixel_val = 2^bits-1;
							elseif pixel_val < 0
								pixel_val = 0;
							end
							%imgdata.data(i,j) = pixel_val+meanval;
							imgdata.data(i,j) = pixel_val;
                            drawnow;
							showimage(imgdata,scale);
							prev_val = pixel_val;
						end
					end
				end
			elseif get(handles.us,'Value'),
				bits = str2num(get(handles.bits,'String'));
				prev_val = 2^bits-1;
				alpha = str2double(get(handles.us_a,'String'));
				stdev = str2double(get(handles.us_std,'String'));
				contents = get(handles.distribution,'String');
				distribution = lower(contents{get(handles.distribution,'Value')});
				meanval = (2^bits-1)/2;
				scale = get(handles.us_scale,'Value');
				if ~get(handles.animate,'Value')
					h = waitbar(0,'Computing...');
					for i=1:imgsize,
						for j=1:imgsize,
							switch distribution,
								case 'gaussian'
									pixel_val = round(prev_val*alpha + ...
										randn*stdev*(2^bits-1)/2+meanval);
								case 'uniform'
									pixel_val = round(prev_val*alpha + ...
										rand*(2^bits-1));
							end
							if pixel_val > 2^bits-1,
								pixel_val = 2^bits-1;
							elseif pixel_val < 0
								pixel_val = 0;
							end
							imgdata.data(i,j) = pixel_val;
							prev_val = pixel_val;
						end
						waitbar(i/imgsize,h);
					end
					close(h);
					handles.figwin = showimage(imgdata,scale);
				else
					handles.figwin = showimage(imgdata,scale);
					for i=1:imgsize,
						for j=1:imgsize,
							imgdata.data(i,j) = 2^(bits-1);
							showimage(imgdata,scale);
							switch distribution,
								case 'gaussian'
									pixel_val = round(prev_val*alpha + ...
										randn*stdev*(2^bits-1)+meanval);
								case 'uniform'
									pixel_val = round(prev_val*alpha + ...
										rand*(2^bits-1));
							end
							if pixel_val > 2^bits-1,
								pixel_val = 2^bits-1;
							elseif pixel_val < 0
								pixel_val = 0;
							end
							imgdata.data(i,j) = pixel_val;
                            drawnow;
							showimage(imgdata,scale);
							prev_val = pixel_val;
						end
					end
				end
			end
			handles.imagedata = imgdata;
			handles.entropy = calc_entropy(imgdata.data, bits);
			axes(get(handles.figwin,'Children'));
			title(['Entropy = ' num2str(handles.entropy)]);
		case 'scale'
			if get(handles.ar,'Value')
				scale = get(handles.scale,'Value');
			elseif get(handles.us,'Value')
				scale = get(handles.us_scale,'Value');
			end
			if isfield(handles,'figwin')
				axes(get(handles.figwin,'Children'));
				showimage(handles.imagedata,scale);
				title(['Entropy = ' num2str(handles.entropy)]);
			end
		case 'save'
			save_imagedata(handles.imagedata);
		case 'print'
			print_figure(f);
		case 'close'
			close_figure(f,figname(1:end-4));
			if isfield(handles, 'figwin'),
				close_figure(handles.figwin);
			end
            return;
	end
	set(f,'UserData',handles);

function entropy = calc_entropy(data, bits);
	[m,n] = size(data);
	% for each level find probability
	entropy = 0;
	for i=0:2^bits-1,
		A = data==i;
		p = sum(sum(A))/(m*n);
		if p > 0
			entropy = entropy - p*log2(p);
		end
	end

function figwin = showimage(imagedata, varargin)

	if nargin < 2
		scale = 1;
		inverse = 0;
		fignum = 2;
	elseif nargin < 3
		scale = varargin{1};
		inverse = 0;
		fignum = 2;
	elseif nargin < 4
		scale = varargin{1};
		inverse = varargin{2};
		fignum = 2;
	else
		scale = varargin{1};
		inverse = varargin{2};
		fignum = varargin{3};
	end
    figwin = figure(fignum);
	cla;
    set(figwin,'MenuBar','none','DoubleBuffer','on','Units','Pixels');
	if ~isempty(imagedata.map)
		cmap = colormap(imagedata.map);
	else
		cmap = colormap('gray');
	end

	if inverse,
		colormap(flipud(cmap));
	end

	if scale,
		imagesc(imagedata.data);
	else
		image(imagedata.data);
	end
	axis image;