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);