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;