📄 lpcexpofn.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 + -