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

📄 xsynthexpofn.m

📁 非常好的数字处理教程
💻 M
字号:
function xsynthfn(action)	if nargin < 1		action='init';	end	% Fix LPC	% Linked zoom?    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;			reset(handles.sig_1_spec);            reset(handles.sig_2_spec);            reset(handles.sig_3_spec);            reset(handles.sig_1_time);            reset(handles.sig_2_time);            reset(handles.sig_3_time);			handles.fileopen = {false, false, false};			set(handles.freqzoom,'Value',1);		case 'loadsound'			signum = handles.signum;			handles.audio{signum} = load_audiodata;			if ~isfield(handles.audio{signum}, 'filenamepath')                return;            end			if (size(handles.audio{signum}.data,2) > 1)                handles.audio{signum}.data = to_mono(handles.audio{signum}.data);            end			handles.fileopen{signum} = true;			contents = get(handles.fftsize,'String');			fftsize = str2double(contents{get(handles.fftsize,'Value')});			contents = get(handles.window,'String');			shape = contents{get(handles.window,'Value')};			[handles.audio{signum}.spectrum,...			 handles.audio{signum}.bin,...			 handles.audio{signum}.st] = ...				spectrogram(handles.audio{signum}, fftsize, shape);			set(f,'UserData',handles);			loadSpecPlot(handles, signum);			loadTimePlot(handles, signum);			linkedzoom([handles.sig_1_time, handles.sig_1_spec,...                handles.sig_3_time, handles.sig_3_spec],'onx');			xsynthexpofn 'freqzoom';			if signum == 1	            handles.xlim_orig = get(handles.sig_1_time,'XLim');			end		case 'loadworkspace'			handles = loadworkspace(handles);			set(f,'UserData',handles);			for signum=1:3,				if (handles.fileopen{signum})					loadSpecPlot(handles, signum);					loadTimePlot(handles, signum);				end			end		case 'saveworkspace'			saveworkspace(handles);		case 'write_soundfile'			if (handles.fileopen{3})				save_audiodata(handles.audio{3});			end		case 'play'			signum = handles.signum;			if (handles.fileopen{signum})				timeplot = eval(['handles.sig_' num2str(signum) '_time']);                samples = round(get(timeplot,'XLim').*handles.audio{signum}.Fs+1);                if samples(1) <= 0                    samples(1) = 1;                elseif samples(2) > length(handles.audio{signum}.data)                    samples(2) = length(handles.audio{signum}.data);                end                audiodata.data = handles.audio{signum}.data(samples(1):samples(2));                audiodata.Fs = handles.audio{signum}.Fs;                eval(['playbutton = handles.s' num2str(signum) '_play;']);                play_audiodata(audiodata, playbutton);			end		case {'fftsize','window'}			for signum = 1:3				if (handles.fileopen{signum})					contents = get(handles.fftsize,'String');					fftsize = str2double(contents{get(handles.fftsize,'Value')});					contents = get(handles.window,'String');					shape = contents{get(handles.window,'Value')};					[handles.audio{signum}.spectrum,...					 handles.audio{signum}.bin,...					 handles.audio{signum}.st] = ...						spectrogram(handles.audio{signum}, fftsize, shape);					loadSpecPlot(handles, signum);				end			end			xsynthexpofn 'freqzoom';		case {'db','colormap','inverse','interpolate'}			for signum = 1:3				if (handles.fileopen{signum})					eval(['timeplot = handles.sig_' num2str(signum) '_time;']);                    xlim = get(timeplot,'XLim');                    eval(['spectrumplot = handles.sig_' num2str(signum) '_spec;']);                    loadSpecPlot(handles, signum);                    set(spectrumplot,'XLim',xlim);				end			end			xsynthexpofn 'freqzoom';		case 'convolution'			handles = convolution(handles);			set(f,'UserData',handles);			signum = 3;			loadTimePlot(handles, signum);			loadSpecPlot(handles, signum);			xsynthexpofn 'freqzoom';		case 'ampenv'			handles = ampenv(handles);			set(f,'UserData',handles);			signum = 3;			loadTimePlot(handles, signum);			loadSpecPlot(handles, signum);			xsynthexpofn 'freqzoom';		case 'lpc'			handles = lpcresynth(handles);			set(f,'UserData',handles);			signum = 3;			loadTimePlot(handles, signum);			loadSpecPlot(handles, signum);			xsynthexpofn 'freqzoom';		case 'freqzoom'			val = get(handles.freqzoom,'Value');			if val == 0,				val = 0.001;			end			for signum = 1:3				specplot = eval(['handles.sig_' num2str(signum) '_spec']);				if (handles.fileopen{signum})					Fs = handles.audio{signum}.Fs;					set(specplot,'YLim',[0 val*Fs/2])				end            end		case 'zoomreset'            if isfield(handles,'xlim_orig')                for signum=[1,3]                    timeplot = eval(['handles.sig_' num2str(signum) '_time']);                    specplot = eval(['handles.sig_' num2str(signum) '_spec']);                    set(timeplot,'XLim',handles.xlim_orig);                    set(specplot,'XLim',handles.xlim_orig);                end            end		case 'print'			print_figure(f);		case 'close'			close_figure(f,figname(1:end-4));            return;	end	set(f,'UserData',handles);% --------------------------------------------------------------------function loadTimePlot(handles, signum)	Fs = handles.audio{signum}.Fs;	t = [0:1/Fs:(length(handles.audio{signum}.data)-1)/Fs];	eval(['timeplot = handles.sig_' num2str(signum) '_time;']);	axes(timeplot)    plot(t,handles.audio{signum}.data)    maxtime = length(t)/Fs;    set(timeplot,'XLim',[0 maxtime]);    set(timeplot,'YLim',[-1.0 1.0]);	if (signum ~= 1)		set(timeplot,'YTickLabel',['']);	end    grid;    xlabel('time (s)');    % --------------------------------------------------------------------function loadSpecPlot(handles, signum)	Fs = handles.audio{signum}.Fs;	eval(['spectrumplot = handles.sig_' num2str(signum) '_spec;']);    axes(spectrumplot);    handles.pos = get(gca,'Position'); % Save axes position    if (get(handles.interpolate,'Value'))        if (get(handles.dB,'Value'))            pcolor(handles.audio{signum}.st,handles.audio{signum}.bin,...				20*log10(abs(handles.audio{signum}.spectrum)));        else            pcolor(handles.audio{signum}.st,handles.audio{signum}.bin,...				abs(handles.audio{signum}.spectrum));        end        shading interp;    else        if (get(handles.dB,'Value'))            imagesc(handles.audio{signum}.st,handles.audio{signum}.bin,...				20*log10(abs(handles.audio{signum}.spectrum)));        else            imagesc(handles.audio{signum}.st,handles.audio{signum}.bin,...				abs(handles.audio{signum}.spectrum));        end    end    axis xy;	ylabel('Frequency (Hz)');	if (signum ~= 1)		ylabel('');		set(spectrumplot,'YTickLabel',['']);	end	contents = get(handles.colormap,'String');    cmap = colormap(lower(contents{get(handles.colormap,'Value')}));	if (get(handles.inverse,'Value'))		cmap = flipud(cmap);	end	colormap(cmap);    set(spectrumplot,'XTickLabel',['']);	info = sprintf(['Filename: %s\n Duration: %s seconds\n Fs: %s Hz'], ...		handles.audio{signum}.filenamepath, ...		num2str(length(handles.audio{signum}.data)/Fs), ...		num2str(Fs));	eval(['set(handles.text' num2str(signum) ',''String'', info);']);% --------------------------------------------------------------------function handles = convolution(handles)	if (handles.fileopen{1} & handles.fileopen{2})		signal_1 = handles.audio{1}.data;		signal_2 = handles.audio{2}.data;		% Slow brute-force convolution		% signal_3 = conv(signal_1,signal_2);		% Fast overlap add convolution!!!        % Find which is longest one:		if (length(signal_1) > length(signal_2))			signal_1 = [signal_1; zeros(length(signal_2),1)];		    audiodata = fftfilt(signal_2,signal_1);		else			signal_2 = [signal_2; zeros(length(signal_1),1)];		    audiodata = fftfilt(signal_1,signal_2);		end		filename = 'Convolution';		Fs = max(handles.audio{1}.Fs,handles.audio{2}.Fs);		handles.audio{3}.filenamepath = filename;		handles.audio{3}.Fs = Fs;        if (max(abs(audiodata)) > 1.0)            audiodata = normalize(audiodata);        end		handles.audio{3}.data = audiodata;		signum = 3;		contents = get(handles.fftsize,'String');		fftsize = str2double(contents{get(handles.fftsize,'Value')});		contents = get(handles.window,'String');		shape = contents{get(handles.window,'Value')};		[handles.audio{signum}.spectrum,...		 handles.audio{signum}.bin,...		 handles.audio{signum}.st] = ...			spectrogram(handles.audio{signum}, fftsize, shape);		handles.fileopen{3} = true;	else		warndlg('You must open two files to perform cross-synthesis!',...			'Error');	end% --------------------------------------------------------------------function handles = ampenv(handles)	if (handles.fileopen{1} & handles.fileopen{2})		% Make amplitude envelope of signal_1		window_size = 512;		window_skip = window_size;		amp_env = makeampenv(handles.audio{1}.data, length(handles.audio{2}.data), ...			window_size, window_skip);		% Now multiply		audiodata = amp_env'.*handles.audio{2}.data;		filename = 'amplitude';		Fs = max(handles.audio{1}.Fs,handles.audio{2}.Fs);		handles.audio{3}.filenamepath = filename;		handles.audio{3}.Fs = Fs;		% Normalize        if (max(abs(audiodata)) > 1.0)            audiodata = normalize(audiodata);        end		handles.audio{3}.data = audiodata;		signum = 3;		contents = get(handles.fftsize,'String');		fftsize = str2double(contents{get(handles.fftsize,'Value')});		contents = get(handles.window,'String');		shape = contents{get(handles.window,'Value')};		[handles.audio{signum}.spectrum,...		 handles.audio{signum}.bin,...		 handles.audio{signum}.st] = ...			spectrogram(handles.audio{signum}, fftsize, shape);		handles.fileopen{3} = true;	else		warndlg('You must open two files to perform cross-synthesis!',...			'Error');	end% --------------------------------------------------------------------function handles = lpcresynth(handles)	if (handles.fileopen{1} & handles.fileopen{2})		signal_1 = handles.audio{1}.data;		signal_2 = handles.audio{2}.data;		% LPC analysis of signal_1.		[a,g,e] = lpcfit(signal_1,12);		% Model excited by signal_2.		audiodata = lpcsynth(a,g,signal_2,128);		if (length(audiodata) > length(signal_1))			audiodata = audiodata(1:length(signal_1));		end		filename = 'LPC';		Fs = max(handles.audio{1}.Fs,handles.audio{2}.Fs);		handles.audio{3}.t = [0:1/Fs:(length(audiodata)-1)/Fs];		handles.audio{3}.filenamepath = filename;		handles.audio{3}.Fs = Fs;		% Normalize        if (max(abs(audiodata)) > 1.0)            audiodata = audiodata./max(abs(audiodata)+0.1);        end		handles.audio{3}.data = audiodata;		signum = 3;		contents = get(handles.fftsize,'String');		fftsize = str2double(contents{get(handles.fftsize,'Value')});		contents = get(handles.window,'String');		shape = contents{get(handles.window,'Value')};		[handles.audio{signum}.spectrum,...		 handles.audio{signum}.bin,...		 handles.audio{signum}.st] = ...			spectrogram(handles.audio{signum}, fftsize, shape);		handles.fileopen{3} = true;	else		warndlg('You must open two files to perform cross-synthesis!',...			'Error');	end% --------------------------------------------------------------------function handles = loadworkspace(handles)	[file, path] = uigetfile({'*.mat','MATLAB datafile'}, 'Open');	load([path file]);	set(handles.colormap,'Value',graphprops{1});	set(handles.window,'Value',graphprops{2});	set(handles.fftsize,'Value',graphprops{3});	set(handles.inverse,'Value',graphprops{4});	set(handles.dB,'Value',graphprops{5});	set(handles.interpolate,'Value',graphprops{6});	for signum=1:3,		if (openfiles{signum})			handles.fileopen{signum} = true;			handles.audio{signum} = audio{signum};		end	end% --------------------------------------------------------------------function saveworkspace(handles)	[file, path] = uiputfile({'*.mat','MATLAB datafile'}, 'Save as');    % Save these variables	audio = handles.audio;	openfiles = handles.fileopen;	graphprops = {get(handles.colormap,'Value'), ...				get(handles.window,'Value'),...				get(handles.fftsize,'Value'),...				get(handles.inverse,'Value'),...				get(handles.dB,'Value'),...				get(handles.interpolate,'Value')};    save([path file], 'audio','openfiles','graphprops');

⌨️ 快捷键说明

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