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

    %%%
function reverbexpofn(action, datastruct)

    if nargin < 1
        action='init';
    end

	name = 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;
			set(handles.play_reverb,'Visible','off');
            movegui(f,'center');
			set(handles.timeslider,'Value',0.1);
			reverbexpofn 'update';
        case 'resize'
            movegui(f,'onscreen');
		case 'loadsound'
			handles.audiodata = load_audiodata;
			if ~isfield(handles.audiodata, 'filenamepath')
				return;
			end
			if (size(handles.audiodata.data,2) > 1)
				handles.audiodata.data = to_mono(handles.audiodata.data);
			end
			place_header(f,handles);
			reverbexpofn 'update';
			reverbexpofn 'timeslider';
		case 'readinput'
			handles.audiodata = datastruct;
			clear datastruct;
			handles.audiodata.filenamepath = '';
			handles.audiodata.nBits = 16;
			handles.audiodata.channels = size(handles.audiodata.data,2);
			place_header(f,handles);
			reverbexpofn 'update';
			reverbexpofn 'timeslider';
		case 'playsound'
			if isfield(handles,'audiodata'),
				audiodata = handles.audiodata;
				play_audiodata(audiodata, handles.play);
			end
		case 'preset'
			if isfield(handles,'audiodata'),
				Fs = handles.audiodata.Fs;
			else
				Fs = 44100;
			end

			switch datastruct
				case 'plainecho'
					filters = [1 0 0];
					a = 0.6;
					D = floor(Fs/5);
					type = {'comb'};
					time_extend = 2;
				case 'multiecho'
					filters = [1 1 1];
					a = [0.76 0.6 0.57];
					D = [floor(Fs/9.5) floor(Fs/9.1) floor(Fs/8.3333333)];
					type = {'comb','allpass','allpass'};
					time_extend = 2;
				case 'reverb'
				case 'cavern'
			end

			% set gui values
			for i = 1:length(filters)
					com = ['set(handles.filter' num2str(i) ',''Value'',' ...
						num2str(filters(i)) ')'];
					eval(com);
				if filters(i)
					com = ['set(handles.filter' num2str(i) '_a,''String'',' ...
						num2str(a(i)) ')'];
					eval(com);
					com = ['set(handles.filter' num2str(i) '_D,''String'',' ...
						num2str(D(i)) ')'];
					eval(com);
					switch type{i}
						case 'comb'
							com = ['set(handles.filter' num2str(i) '_type,''Value'', 1)'];
						case 'allpass'
							com = ['set(handles.filter' num2str(i) '_type,''Value'', 2)'];
					end
					eval(com);
				end
			end
			set(handles.time_extend,'String',num2str(time_extend));
			drawnow;
			reverbexpofn 'update';
		case 'playreverb'
			if isfield(handles,'reverbdata'),
				audiodata = handles.reverbdata;
				play_audiodata(audiodata, handles.play);
			end
		case 'reverberate'
			if isfield(handles,'audiodata'),
				set(handles.play_reverb,'Visible','off');
				drawnow;
				reverbdata = handles.audiodata;
				time_extend = str2num(get(handles.time_extend,'String'));
				samples_extend = reverbdata.Fs*time_extend;
				reverbdata.data = [reverbdata.data; zeros(samples_extend,1)];
				if (get(handles.filter1,'Value')),
					contents = get(handles.filter1_type,'String');
					D = str2num(get(handles.filter1_D,'String'));
					a = str2num(get(handles.filter1_a,'String'));
					switch contents{get(handles.filter1_type,'Value')}
						case 'Comb'
							num = [1];
						case 'Allpass'
							num = [-a zeros(1,D-1) 1];
					end
					den = [1 zeros(1,D-1) -a];
					reverbdata.data = filter(num,den,[reverbdata.data; zeros(2*D,1)]);
				end
				if (get(handles.filter2,'Value')),
					contents = get(handles.filter2_type,'String');
					D = str2num(get(handles.filter2_D,'String'));
					a = str2num(get(handles.filter2_a,'String'));
					switch contents{get(handles.filter2_type,'Value')}
						case 'Comb'
							num = [1];
						case 'Allpass'
							num = [-a zeros(1,D-1) 1];
					end
					den = [1 zeros(1,D-1) -a];
					reverbdata.data = filter(num,den,[reverbdata.data; zeros(2*D,1)]);
				end
				if (get(handles.filter3,'Value')),
					contents = get(handles.filter3_type,'String');
					D = str2num(get(handles.filter3_D,'String'));
					a = str2num(get(handles.filter3_a,'String'));
					switch contents{get(handles.filter3_type,'Value')}
						case 'Comb'
							num = [1];
						case 'Allpass'
							num = [-a zeros(1,D-1) 1];
					end
					den = [1 zeros(1,D-1) -a];
					reverbdata.data = filter(num,den,[reverbdata.data; zeros(2*D,1)]);
				end
				handles.reverbdata = reverbdata;
				handles.reverbdata.data = normalize(reverbdata.data);
				set(handles.play_reverb,'Visible','on');
			end
		case 'update'
			if isfield(handles,'audiodata'),
				Fs = handles.audiodata.Fs;
			else
				Fs = 44100;
			end
			De = 0;
			w = 0:Fs/1000:Fs/2;
			H = ones(1,length(w));
			dens = 1;
			nums = 1;
			if (get(handles.filter1,'Value')),
				contents = get(handles.filter1_type,'String');
				D = str2num(get(handles.filter1_D,'String'));
				a = str2num(get(handles.filter1_a,'String'));
				switch contents{get(handles.filter1_type,'Value')}
					case 'Comb'
						num = [1];
					case 'Allpass'
						num = [-a zeros(1,D-1) 1];
				end
				den = [1 zeros(1,D-1) -a];
				dens = conv(dens,den);
				nums = conv(nums,num);
				H = H.*freqz(num,den,w,Fs);
				De = De + D;
			end
			if (get(handles.filter2,'Value')),
				contents = get(handles.filter2_type,'String');
				D = str2num(get(handles.filter2_D,'String'));
				a = str2num(get(handles.filter2_a,'String'));
				switch contents{get(handles.filter2_type,'Value')}
					case 'Comb'
						num = [1];
					case 'Allpass'
						num = [-a zeros(1,D-1) 1];
				end
				den = [1 zeros(1,D-1) -a];
				dens = conv(dens,den);
				nums = conv(nums,num);
				H = H.*freqz(num,den,w,Fs);
				De = De + D;
			end
			if (get(handles.filter3,'Value')),
				contents = get(handles.filter3_type,'String');
				D = str2num(get(handles.filter3_D,'String'));
				a = str2num(get(handles.filter3_a,'String'));
				switch contents{get(handles.filter3_type,'Value')}
					case 'Comb'
						num = [1];
					case 'Allpass'
						num = [-a zeros(1,D-1) 1];
				end
				den = [1 zeros(1,D-1) -a];
				dens = conv(dens,den);
				nums = conv(nums,num);
				H = H.*freqz(num,den,w,Fs);
				De = De + D;
			end
			
			axes(handles.freq);
			plot(w, abs(H));
			grid;
			axis([0 Fs/2 0 1.1*max(abs(H))]);
			title('Magnitude Response');
			xlabel('Frequency (Hz)');
			ylabel('Magnitude');
			h = filter(nums,dens,[1 zeros(1,Fs-1)]);
			n = (0:(length(h)-1))./Fs;
			axes(handles.impulse);
			plot(n,normalize(real(h)));
			grid;
			timeval = get(handles.timeslider,'Value') + 0.01;
			axis([0 timeval -1 1]);
			title('Impulse Response');
			xlabel('Time (s)');
			ylabel('Amplitude');

		case 'timeslider'
			axes(handles.impulse);
			timeval = get(handles.timeslider,'Value') + 0.01;
			axis([0 timeval -1 1]);
        case {'sonoexpo','fourier', 'alias', 'feature', 'firexpo', 'iirexpo', 'formantexpo', 'lpcexpo'}
            if isfield(handles,'reverbdata'),
                audiodata = handles.reverbdata;
			    switch action
				    case 'sonoexpo'
				        sonoexpogui(audiodata);
				    case 'fourier'
				        fourierexpogui(audiodata);
                    case 'alias'
                        aliasexpogui(audiodata);
                    case 'feature'
                        featurexpogui(audiodata);
                    case 'firexpo'
                        firexpogui(audiodata);
                    case 'iirexpo'
                        iirexpogui(audiodata);
                    case 'formantexpo'
                        formantexpogui(audiodata);
                    case 'lpcexpo'
						lpcexpogui(audiodata);
			    end
            end
		case 'close'
			close_figure(f,figname(1:end-4));
			return;
	end
	set(f,'UserData',handles);