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

📄 lpcexpofn.m

📁 非常好的数字处理教程
💻 M
字号:
%function lpcexpofn(action,datastruct)if nargin < 1	action='init';end% Analysis size text entry% Synthesis window, size, skip parameters% Option to apply specific amplitude envelope to synthesis%	such as RMS of original% Options to substitute particular binsname = 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.timeplot1);		reset(handles.timeplot2);		reset(handles.resplot);		set(handles.excite_text,'Visible','off');		set(handles.excite_freq,'Visible','off');		linkedzoom([handles.timeplot1,handles.timeplot2, handles.resplot],'onxy');		cola_check(handles);	case 'loadsound'		audiodata = load_audiodata;		if isempty(audiodata)			return		end		if (max(abs(audiodata.data)) > 1.0)			audiodata.data = normalize(audiodata.data);		end		handles.audiodata = audiodata;		makeTimePlot(handles.audiodata, handles.timeplot1);		place_header(f,handles);	case 'readinput'		handles.audiodata = datastruct;		clear datastruct;		handles.audiodata.filenamepath = '';		handles.audiodata.nBits = 16;		handles.audiodata.channels = size(handles.audiodata.data,2);		setdefaults;		reset(handles.timeplot1);		reset(handles.timeplot2);		reset(handles.resplot);		makeTimePlot(handles.audiodata, handles.timeplot1);		place_header(f,handles);	case 'analyze'		if isfield(handles,'audiodata')			windowsize = str2double(get(handles.analwindowsize,'String'));			windowskip = str2double(get(handles.analwindowskip,'String'));			windowshapecontents = get(handles.analwindowshape,'String');			windowshape = windowshapecontents{get(handles.analwindowshape,'Value')};			order = str2num(get(handles.order,'String'));			[handles.analysisdata, handles.residual] = analyze(handles.audiodata, windowsize, ...				windowskip, windowshape, order);			% Get and plot residual% 			handles.residual = get_residual(handles.analysisdata, ...% 				handles.audiodata, windowsize, windowskip, windowshape);			[m,n] = size(handles.audiodata.data);			handles.residual.data = handles.residual.data(1:m,1:n);			makeTimePlot(handles.residual, handles.resplot);		end	case 'synthesize'		if isfield(handles,'analysisdata')			windowsize = str2double(get(handles.analwindowsize,'String'));			windowskip = str2double(get(handles.analwindowskip,'String'));			windowshapecontents = get(handles.analwindowshape,'String');			windowshape = windowshapecontents{get(handles.analwindowshape,'Value')};						excitecontents = get(handles.excite_menu,'String');			switch lower(excitecontents{get(handles.excite_menu,'Value')})				case 'residual'					excitation = handles.residual;				case 'noise'					[m,n] = size(handles.residual.data);					excitation.data = 1-2*rand(m,n);					excitation.Fs = handles.residual.Fs;				case 'pulses'					[m,n] = size(handles.residual.data);					freq = str2num(get(handles.excite_freq,'String'));					per = round(handles.residual.Fs/freq);					excitation.data = zeros(m,n);					excitation.data(1:per:end,1:n) = 1;					excitation.Fs = handles.residual.Fs;				case 'other'					% Load soundfile					excitation = load_audiodata;					[m,n] = size(handles.residual.data);					[me,ne] = size(excitation.data);					if (me > m)						excitation.data = excitation.data(1:m,:);					elseif (me < m)						while me < m							excitation.data = [excitation.data; excitation.data];							[me,ne] = size(excitation.data);						end					end					if (ne == 2 & n == 1)						excitation.data = to_mono(excitation.data);					elseif (ne == 1 & n == 2)						excitation.data = [excitation.data, ...							excitation.data];					end			end			handles.synthdata = synthesize(handles.analysisdata, excitation, ...				windowsize, windowskip, windowshape);			[m,n] = size(handles.audiodata.data);			handles.synthdata.data = handles.synthdata.data(1:m,1:n);			%if length(handles.synthdata.data) > length(handles.audiodata.data)			%	handles.synthdata.data = ...			%		handles.synthdata.data(1:length(handles.audiodata.data),:);			%end			if (max(abs(handles.synthdata.data)) > 1.0)				handles.synthdata.data = normalize(handles.synthdata.data);			end			makeTimePlot(handles.synthdata, handles.timeplot2);		end	case 'normalize'		if isfield(handles,'synthdata')			handles.synthdata.data = normalize(handles.synthdata.data);			xlim = get(handles.timeplot1,'XLim');			makeTimePlot(handles.synthdata, handles.timeplot2);			set(handles.timeplot2,'XLim',xlim);		end	case 'norm_residual'		if isfield(handles,'residual')			handles.residual.data = normalize(handles.residual.data);			xlim = get(handles.resplot,'XLim');			makeTimePlot(handles.residual, handles.resplot);			set(handles.resplot,'XLim',xlim);		end	case {'playsound1','playsound2'}		audiodata = {};		times = get(handles.timeplot1,'XLim');		switch action			case 'playsound1'				if isfield(handles,'audiodata')					audiodata = handles.audiodata;					playbutton = handles.play1;				end			otherwise				if isfield(handles,'synthdata')					audiodata = handles.synthdata;					playbutton = handles.play2;				end		end		if ~isempty(audiodata)			samples = round(times*audiodata.Fs);			if (samples(1) <= 0)				samples(1) = 1;			end			if (samples(2) > length(audiodata.data))				samples(2) = length(audiodata.data);			end			audiodata.data = audiodata.data(samples(1):samples(2));			play_audiodata(audiodata, playbutton);		end	case 'play_residual'		audiodata = {};		times = get(handles.timeplot1,'XLim');		if isfield(handles,'residual')			audiodata = handles.residual;			playbutton = handles.play_residual;		end		if ~isempty(audiodata)			samples = round(times*audiodata.Fs);			if (samples(1) <= 0)				samples(1) = 1;			end			if (samples(2) > length(audiodata.data))				samples(2) = length(audiodata.data);			end			audiodata.data = audiodata.data(samples(1):samples(2));			play_audiodata(audiodata, playbutton);		end	case {'orig_fourier','orig_sonogram'}		if isfield(handles,'audiodata'),			audiodata = handles.audiodata;			if size(audiodata.data,2) > 1				audiodata.data = to_mono(audiodata.data);			end			switch action				case 'orig_fourier'					fourierexpogui(audiodata);				case 'orig_sonogram'					sonoexpogui(audiodata);			end		end	case {'synth_fourier','synth_sonogram'}		if isfield(handles,'synthdata'),			audiodata = handles.synthdata;			if size(audiodata.data,2) > 1				audiodata.data = to_mono(audiodata.data);			end			switch action				case 'synth_fourier'					fourierexpogui(audiodata);				case 'synth_sonogram'					sonoexpogui(audiodata);			end		end	case 'saveresynth'		if isfield(handles, 'synthdata')			save_audiodata(handles.synthdata);		end	case 'colacheck'		cola_check(handles);	case 'print'		print_figure(f);	case 'close'		close_figure(f,figname(1:end-4));		return;endset(f,'UserData',handles);function makeTimePlot(audiodata, axesnum);if max(max(audiodata.data)) > 1	audiodata.data = normalize(audiodata.data);endaxes(axesnum)t = [0:1/audiodata.Fs:(length(audiodata.data)-1)/audiodata.Fs];plot(t,audiodata.data)maxtime = length(t)/audiodata.Fs;set(axesnum,'XLim',[0 maxtime]);set(axesnum,'YLim',[-1.0 1.0]);grid;xlabel('time (s)');% --------------------------------------------------------------------function updateTimePlot(handles)axes(handles.timeplot)plot(handles.t,handles.audiodata)set(handles.timeplot,'XLim',handles.xlim_timeplot);set(handles.timeplot,'YLim',handles.ylim_timeplot);xlabel('time (s)');grid;% --------------------------------------------------------------------function [analysis,residual] = analyze(audiodata, windowsize, windowskip, windowshape, order);% Perform LPC analysis of audiodataanalysis.Fs = audiodata.Fs;analysis.windowsize = windowsize;%analysis.windowskip = windowskip;windowskip = windowsize/4;analysis.windowskip = windowskip;analysis.windowshape = windowshape;windowdata = get_windowdata(windowsize,windowshape);num_channels = min(size(audiodata.data));num_windows = floor(length(audiodata.data)/windowskip);if (num_windows-1)*windowskip+windowsize > size(audiodata.data,1)	rem_samples = ((num_windows-1)*windowskip+windowsize) - size(audiodata.data,1);	audiodata.data = [audiodata.data; zeros(rem_samples,1)];endresidual.data = zeros(size(audiodata.data,1),num_channels);residual.Fs = audiodata.Fs;Zf = zeros(1,order);%bat = figure;h = waitbar(0, 'Analyzing ...');for i=1:num_windows, % For each window	for k = 1:num_channels % For each channel		start_sample = (i-1)*windowskip + 1;		end_sample = start_sample + windowsize-1;		sig = audiodata.data(start_sample:end_sample,k);% 		R = xcorr(frame,'coeff');% 		R = R(windowsize:end);% 		R = R(1:order+1);% 		Rt = toeplitz(R(1:end-1));% 		alpha = inv(Rt)*R(2:end);% 		analysis.data{i,k} = [1 -alpha'];		a = lpc(windowdata.*sig,order);		analysis.data{i,k} = a;				% now find residual in first parts of window		[estimate,Zf] = filter([0 -a(2:end)],1,sig,Zf);% 		b = residual.data(start_sample+windowskip:end_sample-windowskip);% 		c = sig(windowskip:end-windowskip-1);% 		whos		% 		residual.data(start_sample+windowskip:end_sample-windowskip+1) = ...% 			sig(windowskip:end-windowskip) - estimate(windowskip:end-windowskip);			residual.data(start_sample+windowskip-1:end_sample-2*windowskip) = ...				sig(windowskip:end-2*windowskip) - estimate(windowskip:end-2*windowskip);	% 		figure(bat);% 		hold on;% 		n = [windowskip:3*windowskip-1];% 		%plot([start_sample:end_sample],sig,'k');% 		plot([start_sample+windowskip:start_sample+3*windowskip-1], ...% 			estimate(windowskip:end-windowskip-1),'b');% % 		plot(n+start_sample-1,residual.data(start_sample+windowskip:end_sample-windowskip),'r');% 		% 		if i==2% 			stop% 		end		% 		if i==10% 			a = lpc(frame,order)% 			figure;% 			freqz(1,[1 -a(2:end)])		% 			stop% 		end	end	waitbar(i/num_windows,h);endclose(h);% --------------------------------------------------------------------function audiodata = synthesize(analysis, excitation, windowsize, windowskip, windowshape)audiodata.Fs = analysis.Fs;num_channels = min(size(excitation.data));num_windows = length(analysis.data);audiodata.data = zeros(size(excitation.data,1),num_channels);windowdata = get_windowdata(windowsize,windowshape);order = length(analysis.data{1,1})-1;orig_length=size(excitation.data,1);windowskip = windowsize/4;add_samples = num_windows*windowskip + windowsize - size(excitation.data,1);if add_samples > 0	excitation.data = [excitation.data; zeros(add_samples,1)];	audiodata.data = [audiodata.data; zeros(add_samples,1)];endZf = zeros(1,order);h = waitbar(0, 'Synthesizing ...');% for i=1:num_windows% 	for k=1:num_channels% 		start_sample = (i-1)*windowskip + 1;% 		end_sample = start_sample + windowsize-1;% 		a = analysis.data{i,k};% % 		[sig,Zf] = filter(1,a,excitation.data(start_sample:end_sample,k),Zf);% 		audiodata.data(start_sample+windowskip-1:end_sample-2*windowskip) = ...% 			sig(windowskip:end-2*windowskip);% 		% % 		if i==10% % 			figure;% % 			plot(audiodata.data);% % 			stop% % 		end% 		% % 		audiodata.data(start_sample:end_sample,k) = ...% % 			audiodata.data(start_sample:end_sample,k) + sig(1:windowsize);% 	end% 	waitbar(i/num_windows,h);% end% Try long waysfor i=1:num_windows	for k=1:num_channels		start_sample = i*windowskip;		end_sample = start_sample + windowskip-1;		a = analysis.data{i,k};		for j=start_sample:end_sample			audiodata.data(j,k) = -a(2:end)*audiodata.data(j-1:-1:j-order,k) + ...				excitation.data(j,k);		end			end	waitbar(i/num_windows,h);endclose(h);function cola_check(handles)if get(handles.analcola,'Value')	winsize = str2double(get(handles.analwindowsize,'String'));	% if windowshape = ...	set(handles.analwindowskip,'String',num2str(ceil(winsize/2)));	set(handles.analwindowskip,'Enable','inactive');else	set(handles.analwindowskip,'Enable','on');end

⌨️ 快捷键说明

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