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

📄 reverbexpofn.m

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -