function urepet
% Get screen size screen_size = get(0,ScreenSize);
% Create the figure window object_figure = figure(& Visible,off,& Position,[screen_size(3:4)/4+1,screen_size(3:4)/2],& Name,Main Screen,& NumberTitle,off,& MenuBar,none,& RequestCloseFunction,@figureRequestCloseFunction);
% create tool bar custom_tool_bar = uitoolbar(object_figure);
% media play icons icon_media_play = playicon; icon_media_stop = stopicon;
% Create main buttons media_button_open = uipushtool(custom_tool_bar,& CData,iconread(file_open.png),& TooltipString,Open Item,& Enable,on,& ClickedCallback,@openButtonClickedCallBackFunction); %#ok<*NASGU> media_button_save = uipushtool(custom_tool_bar,& CData,iconread(file_save.png),& TooltipString,Save Item,& Enable,off); media_button_play = uipushtool(custom_tool_bar,& CData,icon_media_play,& TooltipString,Play Item,& Enable,off,& UserData,struct(PlayIcon,icon_media_play,StopIcon,icon_media_stop));
% Pointer, oom, toggle buttons media_button_select = uitoggletool(custom_tool_bar,& Separator,On,& CData,iconread(tool_pointer.png),& TooltipString,Select This,& Enable,off,& ClickedCallBack,@SelectCLickedCallBackFunction); media_button_zoom = uitoggletool(custom_tool_bar,& CData,iconread(tool_zoom_in.png),& TooltipString,Zoom,& Enable,off,& ClickedCallBack,@ZoomClickedCallbackFunction); media_button_pan = uitoggletool(custom_tool_bar,& CData,iconread(tool_hand.png),& TooltipString,Pan,& Enable,off,& ClickedCallBack,@panClickedCallBackFunction);
% Create window, parameters main_button_urepet = uipushtool(custom_tool_bar,& Separator,On,& CData,main_icon,& TooltipString,uREPET Button,& Enable,off); main_button_background = uitoggletool(custom_tool_bar,& CData,iconread(tool_font_bold.png),& TooltipString,Background Button,& Enable,off,& ClickedCallBack,@BackGroundClickedCallBackFunction); media_undo_icon = iconread(tool_rotate_3d.png); media_undo_icon(6:12,6:12,:) = NaN; media_undo_button = uipushtool(custom_tool_bar,& CData,media_undo_icon,& TooltipString,Undo Operation,& Enable,off);
% axes for signals and spectrum axes_signal = axes(& OuterPosition,[0,0.9,1,0.1],& Visible,off); axes_spectrogram = axes(& OuterPosition,[0,0,1,0.9],& Visible,off);
% x-axis limits linkaxes([axes_signal,axes_spectrogram],x)
% change mouse on spectrogram EnterKeyFunction = @(figure_handle,currentPoint) set(figure_handle,Pointer,ibeam); iptSetPointerBehavior(axes_signal,EnterKeyFunction); iptPointerManager(object_figure);
% mouse over media EnterKeyFunction = @(figure_handle,currentPoint) set(figure_handle,Pointer,arrow); iptSetPointerBehavior(object_figure,EnterKeyFunction) iptSetPointerBehavior(axes_spectrogram,EnterKeyFunction) iptPointerManager(object_figure);
% initialize player media_player_audio = audioplayer(0,80);
% figure = visible object_figure.Visible = on;
% call back function for open button function openButtonClickedCallBackFunction(~,~) % dialog box to open files [audio_file_name,audio_file_path] = uigetfile({*.mp32;*.wav},& MP3 or WAV audio files); if isequal(audio_file_name,0) || isequal(audio_file_path,0) return end % Remove figures to allow creation of other objects object_figure.RequestCloseFunction = ; % busy pointer object_figure.Pointer = watch; drawnow % stop playing audio media if isplaying(media_player_audio) stop(media_player_audio) end % Clearaxes cla(axes_signal) axes_signal.Visible = off; cla(axes_spectrogram) axes_spectrogram.Visible = off; drawnow % Build name of file full_file_audio = fullfile(audio_file_path,audio_file_name); % audio and rate (Hz) [audio_file_signal,audio_file_sample_rate] = audioread(full_file_audio); % channels and samples [number_of_samples,number_of_channels] = size(audio_file_signal); % plot audio signal. disable mouse clicks plot(axes_signal,& 1/audio_file_sample_rate:1/audio_file_sample_rate:number_of_samples/audio_file_sample_rate,& audio_file_signal,& PickableParts,none); % Update axes properties axes_signal.XLim = [1,number_of_samples]/audio_file_sample_rate; axes_signal.YLim = [-1,1]; axes_signal.XGrid = on; axes_signal.Title.String = audio_file_name; axes_signal.Title.Interpreter = None; axes_signal.XLabel.String = Time (s); axes_signal.Layer = top; axes_signal.UserData.PlotXLim = [1,number_of_samples]/audio_file_sample_rate; axes_signal.UserData.SelectXLim = [1,number_of_samples]/audio_file_sample_rate; drawnow % Add the CQT toolbox folder to the search path addpath(CQT_toolbox_2013) % Min & max Hz, number of channels resolution_of_octave = 24; min_freq_value = 27.5; max_freq_value = audio_file_sample_rate/2; % Initialize the CQT object and the spectrogram cqt_audio_cell = cell(1,number_of_channels); audio_spectrogram = []; % Compute the CQT ,spectrogram for all channel for index_of_channel = 1:number_of_channels %#ok<*FXUP> cqt_audio_cell{index_of_channel}& = cqt(audio_file_signal(:,index_of_channel),resolution_of_octave,audio_file_sample_rate,min_freq_value,max_freq_value); audio_spectrogram = cat(3,audio_spectrogram,abs(cqt_audio_cell{index_of_channel}.c)); end % Number of frequency channels and time frames [frequency_number,number_of_times,~] = size(audio_spectrogram); % Update the maximum frequency in Hz max_freq_value = min_freq_value*2.^((frequency_number-1)/resolution_of_octave); % Time range in seconds media_play_time_range = [1,number_of_times]/number_of_times*number_of_samples/audio_file_sample_rate; % Display the audio spectrogram imagesc(axes_spectrogram,& media_play_time_range,& [(min_freq_value*2*frequency_number+max_freq_value)/(2*frequency_number+1),& (max_freq_value*2*frequency_number+min_freq_value)/(2*frequency_number+1)],& db(mean(audio_spectrogram,3)),& PickableParts,none); % Update spectrogram axes properties axes_spectrogram.YScale = log; axes_spectrogram.YDir = normal; axes_spectrogram.XGrid = on; axes_spectrogram.Colormap = jet; axes_spectrogram.Title.String = Log-spectrogram; axes_spectrogram.XLabel.String = Time (s); axes_spectrogram.YLabel.String = Frequency (Hz); axes_spectrogram.ButtonDownFcn = @SpectrogramAxesButtonCallFunction; drawnow % Color limits screen_color_limits = axes_spectrogram.CLim; % playing audio object media_player_audio = audioplayer(audio_file_signal,audio_file_sample_rate); % play line selectline(axes_signal) PlayLineOnAxis(axes_signal,media_player_audio,media_button_play); % click button call back function media_button_play.ClickedCallback = {@PlayButtonClickedCallBackFunction,media_player_audio,axes_signal}; % Add key-press call back function object_figure.KeyPressFcn = @keyPressedCallBackFunction; % uREPET button call back function main_button_urepet.ClickedCallback = @UrepetButtonClickedCallBackFunction; % rectagle object rect_obj = gobjects(0); % convert Hz to indices hertz_to_frequency = @(value_of_frequency) round(resolution_of_octave*log2(value_of_frequency/min_freq_value)+1); seconds_to_time = @(value_of_time) round(value_of_time/(number_of_samples/audio_file_sample_rate)*number_of_times); % Enable buttons media_button_play.Enable = on; media_button_select.Enable = on; media_button_zoom.Enable = on; media_button_pan.Enable = on; main_button_urepet.Enable = on; main_button_background.Enable = on; main_button_background.State = on; % activate select button media_button_select.State = on; % update mouse pointer object_figure.Pointer = arrow; drawnow % close request function object_figure.RequestCloseFunction = @figureRequestCloseFunction; % Key-press callback function to the figure function keyPressedCallBackFunction(~,~) % if escape character if ~strcmp( ,object_figure.CurrentCharacter) return end % if any media is playing if isplaying(media_player_audio) % stop stop(media_player_audio) else % camples and sample rate audio_file_sample_rate = media_player_audio.SampleRate; number_of_samples = media_player_audio.TotalSamples; % Plot data on axes limits_of_plots = axes_signal.UserData.PlotXLim; selected_limits = axes_signal.UserData.SelectXLim; % calculate sample rate for audio if selected_limits(1) == selected_limits(2) % If select line range_of_samples = [round((selected_limits(1)-limits_of_plots(1))*audio_file_sample_rate)+1,number_of_samples]; else % If select region range_of_samples = round((selected_limits-limits_of_plots(1))*audio_file_sample_rate+1); end % Play audio with given rates play(media_player_audio,range_of_samples) end end % Mouse-click function (spectrogram) function SpectrogramAxesButtonCallFunction(~,~) % mouse location current_mouse_pointer_location = axes_spectrogram.CurrentPoint; % if mouse is outside the axes if current_mouse_pointer_location(1,1) < media_play_time_range(1) || current_mouse_pointer_location(1,1) >media_play_time_range(2) ||& current_mouse_pointer_location(1,2) < min_freq_value || current_mouse_pointer_location(1,2) >max_freq_value return end % If left click if strcmp(object_figure.SelectionType,normal) % Delete rectangle object delete(rect_obj) % Draw RIO from specified point rect_obj = images.roi.Rectangle(Parent,axes_spectrogram,& DrawingArea,[media_play_time_range(1),min_freq_value,diff(media_play_time_range),max_freq_value-min_freq_value]); beginDrawingFromPoint(rect_obj,current_mouse_pointer_location(1,1:2)); end end % Clicked callback function for the uREPET button function UrepetButtonClickedCallBackFunction(~,~) % If rectangle not valid or empty if isempty(rect_obj) || ~isvalid(rect_obj) return end % Position of ROI position_of_rectangle = rect_obj.Position; %width=heithg=0 if all(~position_of_rectangle(3:4)) return end % Remove close request call back. Allows creation of other objects object_figure.RequestCloseFunction = ; % update pointer to busy object_figure.Pointer = watch; drawnow % stop playing audio player if isplaying(media_player_audio) stop(media_player_audio) end % add original audio to undo audio_file_signal0 = audio_file_signal; cqt_audio_cell0 = cqt_audio_cell; % Frequency & time indices indices_of_frequencies = hertz_to_frequency(position_of_rectangle(2)+[0,position_of_rectangle(4)]); indeces_of_time = seconds_to_time(position_of_rectangle(1)+[0,position_of_rectangle(3)]); % rectangle from spectrogram audio_from_rectangle = audio_spectrogram(indices_of_frequencies(1):indices_of_frequencies(2),& indeces_of_time(1):indeces_of_time(2),:); size_of_rectangle = size(audio_from_rectangle); % 2-D cross-correlation correlation_of_audios = normxcorr2(mean(audio_from_rectangle,3),mean(audio_spectrogram,3)); % Remove zero padding parts correlation_of_audios = correlation_of_audios(size_of_rectangle(1):end-size_of_rectangle(1)+1,& size_of_rectangle(2):end-size_of_rectangle(2)+1); correlation_size = size(correlation_of_audios); % Max repetitions, min freq number_of_repetitions = 10; separation_of_Frequencies = 1; separation_of_time = 1; separation_of_Frequencies = separation_of_Frequencies*resolution_of_octave; separation_of_time = seconds_to_time(separation_of_time); correlation_of_audios(max(indices_of_frequencies(1)-separation_of_Frequencies,1):min(indices_of_frequencies(1)+separation_of_Frequencies,correlation_size(1)),& max(indeces_of_time(1)-separation_of_time,1):min(indeces_of_time(1)+separation_of_time,correlation_size(2))) = 0; % Loop over repetitions for repet_index = 2:number_of_repetitions % Frequency,time indices of the min repetition [~,maximum_index] = max(correlation_of_audios(:)); [frequency_index,time_index] = ind2sub(correlation_size,maximum_index);
correlation_of_audios(max(frequency_index-separation_of_Frequencies,1):min(frequency_index+separation_of_Frequencies,correlation_size(1)),& max(time_index-separation_of_time,1):min(time_index+separation_of_time,correlation_size(2))) = 0; audio_from_rectangle = cat(4,audio_from_rectangle,& audio_spectrogram(frequency_index:frequency_index+size_of_rectangle(1)-1,& time_index:time_index+size_of_rectangle(2)-1,:)); end % rectangles mask audio_rectangle_mask = (min(median(audio_from_rectangle,4),audio_from_rectangle(:,:,:,1))+eps)./(audio_from_rectangle(:,:,:,1)+eps); % If the background button is off, invert the mask if strcmp(main_button_background.State,off) audio_rectangle_mask = audio_rectangle_mask-1; end % Apply the mask to the CQT and spectrogram audio_file_signal = zeros(number_of_samples,number_of_channels); for index_of_channel = 1:number_of_channels cqt_audio_cell{index_of_channel}.c(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2))& = audio_rectangle_mask(:,:,index_of_channel).*cqt_audio_cell{index_of_channel}.c(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2)); audio_spectrogram(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2),index_of_channel)& = audio_rectangle_mask(:,:,index_of_channel).*audio_spectrogram(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2),index_of_channel); audio_file_signali = icqt(cqt_audio_cell{index_of_channel}); audio_file_signal(:,index_of_channel) = audio_file_signali(1:number_of_samples); end % Update the signal axes index_of_channel = number_of_channels; for child_index = 1:numel(axes_signal.Children) if numel(axes_signal.Children(child_index).YData) == number_of_samples axes_signal.Children(child_index).YData = audio_file_signal(:,index_of_channel); index_of_channel = index_of_channel-1; end end drawnow % Update the spectrogram axes axes_spectrogram.Children(end).CData(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2))& = db(mean(audio_spectrogram(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2),:),3)); axes_spectrogram.CLim = screen_color_limits; drawnow % Update the audio player media_player_audio = audioplayer(audio_file_signal,audio_file_sample_rate); PlayLineOnAxis(axes_signal,media_player_audio,media_button_play); media_button_play.ClickedCallback = {@PlayButtonClickedCallBackFunction,media_player_audio,axes_signal}; media_button_save.ClickedCallback = @SaveButtonClickedCallBackFunction; media_undo_button.ClickedCallback = @UndoButtonClickedCallBackFunction; % Enable nuttons media_button_save.Enable = on; media_undo_button.Enable = on; object_figure.RequestCloseFunction = @figureRequestCloseFunction; % Change pointer object_figure.Pointer = arrow; % Clicked callback function for the save button function SaveButtonClickedCallBackFunction(~,~) % Open dialog box to save file [audio_file_name,audio_file_path] = uiputfile(*.wav*,& Save Audio as WAVE File,urepet_file.wav); if isequal(audio_file_name,0) || isequal(audio_file_path,0) return end % file name full_file_audio = fullfile(audio_file_path,audio_file_name); % write audio file audiowrite(audio_file,audio_file_signal,audio_file_sample_rate) end % undo button call back function function UndoButtonClickedCallBackFunction(~,~) % Disable button media_undo_button.Enable = off; audio_file_signal = audio_file_signal0; cqt_audio_cell = cqt_audio_cell0; audio_spectrogram = []; for index_of_channel = 1:number_of_channels audio_spectrogram = cat(3,audio_spectrogram,abs(cqt_audio_cell{index_of_channel}.c)); end % Update axes index_of_channel = number_of_channels; for child_index = 1:numel(axes_signal.Children) if numel(axes_signal.Children(child_index).YData) == number_of_samples axes_signal.Children(child_index).YData = audio_file_signal(:,index_of_channel); index_of_channel = index_of_channel-1; end end drawnow % Update spectrogram axes axes_spectrogram.Children(end).CData(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2))& = db(mean(audio_spectrogram(indices_of_frequencies(1):indices_of_frequencies(2),indeces_of_time(1):indeces_of_time(2),:),3)); axes_spectrogram.CLim = screen_color_limits; drawnow % Update the audio player media_player_audio = audioplayer(audio_file_signal,audio_file_sample_rate); PlayLineOnAxis(axes_signal,media_player_audio,media_button_play); media_button_play.ClickedCallback = {@PlayButtonClickedCallBackFunction,media_player_audio,axes_signal}; end end end
% Clicked callback function for the select button function SelectCLickedCallBackFunction(~,~) % update button status media_button_select.State = on; media_button_zoom.State = off; media_button_pan.State = off; zoom off pan off end
% Clicked callback function for the zoom button function ZoomClickedCallbackFunction(~,~) % update buttons media_button_select.State = off; media_button_zoom.State = on; media_button_pan.State = off; % enable zoom zoom_object = zoom(object_figure); zoom_object.Enable = on; % zoom x axes only setAxesZoomConstraint(zoom_object,axes_signal,x); %update pan pan off end
% pan clicked call back function function panClickedCallBackFunction(~,~) % update buttons media_button_select.State = off; media_button_zoom.State = off; media_button_pan.State = on; zoom off pan_object = pan(object_figure); pan_object.Enable = on; % set pan for x axis only setAxesPanConstraint(pan_object,axes_signal,x); end
% Clicked callback function for the background button function BackGroundClickedCallBackFunction(~,~) % change mouse depending on what is happening if strcmp(main_button_background.State,on) main_button_background.TooltipString = Background; elseif strcmp(main_button_background.State,off) main_button_background.TooltipString = Foreground; end end
% Close call back function function figureRequestCloseFunction(~,~) % stop playing life if isplaying(media_player_audio) stop(media_player_audio) end % close dialog box user_answer = questdlg(Close window?,& Close window,Yes,No,Yes); switch user_answer case Yes delete(object_figure) case No return end end
end
% Read imatlab icon function image_function_data = iconread(icon_name)
[image_function_data,~,image_transparency]& = imread(fullfile(matlabroot,toolbox,matlab,icons,icon_name),PNG);
%image to double precision image_function_data = im2double(image_function_data);
% Convert the 0 to NaNs image_function_data(image_transparency==0) = NaN;
end
% play icon function image_function_data = playicon
% upper half play triangle image_function_data = [nan(2,16);[nan(6,3),kron(triu(nan(6,5)),ones(1,2)),nan(6,3)]];
% whole black play triangle image image_function_data = repmat([image_function_data;image_function_data(end:-1:1,:)],[1,1,3]);
end
% stop icon function image_function_data = stopicon
% black stop square image_function_data = nan(16,16); image_function_data(4:13,4:13) = 0;
% black stop square image_function_data = repmat(image_function_data,[1,1,3]);
end
% Create project icon function image_function_data = main_icon
image_function_data = nan(16,16,1);
% black letters image_function_data(4:7,2) = 0; image_function_data(7:8,3) = 0; image_function_data(4:8,4:5) = 0;
image_function_data(2:8,7:8) = 0; image_function_data([2,3,5,6],9) = 0; image_function_data([3:5,7:8],10) = 0;
image_function_data(2:8,12:13) = 0; image_function_data([2,3,5,7,8],14) = 0; image_function_data([2,3,7,8],15) = 0;
image_function_data(10:16,2:3) = 0; image_function_data([10,11,13,14],4) = 0; image_function_data(11:13,5) = 0;
image_function_data(10:16,7:8) = 0; image_function_data([10,11,13,15,16],9) = 0; image_function_data([10,11,15,16],10) = 0;
image_function_data(10:11,12:15) = 0; image_function_data(12:16,13:14) = 0;
% Make the image image_function_data = repmat(image_function_data,[1,1,3]);
end
% select line for axes function selectline(axes_signal)
% select line as an array for graphic objects initialization line_selection = gobjects(3,1);
% mouse call back functions axes_signal.ButtonDownFcn = @SignalAxesButtonDownFunction;
% Mouse-click callback function for the signal axes function SignalAxesButtonDownFunction(~,~) % mouse pointer location current_mouse_pointer_location = axes_signal.CurrentPoint; % plot limits limits_of_plots = axes_signal.UserData.PlotXLim; % return if point is out of limits if current_mouse_pointer_location(1,1) < limits_of_plots(1) || current_mouse_pointer_location(1,1) >limits_of_plots(2) ||& current_mouse_pointer_location(1,2) < -1 || current_mouse_pointer_location(1,2) >1 return end % handle current figure object_figure = gcf; % lect mouse type type_of_mouse_selection = object_figure.SelectionType; % left click if strcmp(type_of_mouse_selection,normal) % replace selected item if ~isempty(line_selection) delete(line_selection) end %first line on audio singnal value_1_colour = 0.5*[1,1,1]; line_selection(1) = line(axes_signal,& current_mouse_pointer_location(1,1)*[1,1],[-1,1],& Color,value_1_colour,& ButtonDownFcn,@SelectLineButtonFunction); % second_line color_value_2 = 0.75*[1,1,1]; line_selection(2) = line(axes_signal,& current_mouse_pointer_location(1,1)*[1,1],[-1,1],& Color,color_value_2,& ButtonDownFcn,@SelectLineButtonFunction); uistack(line_selection(2),bottom) line_selection(3) = patch(axes_signal,& current_mouse_pointer_location(1,1)*[1,1,1,1],[-1,1,1,-1],color_value_2,& LineStyle,none,& PickableParts,none); uistack(line_selection(3),bottom) % Change the pointer when the mouse moves EnterKeyFunction = @(figure_handle, currentPoint) set(figure_handle,Pointer,hand); iptSetPointerBehavior(line_selection(1),EnterKeyFunction); iptSetPointerBehavior(line_selection(2),EnterKeyFunction); iptSetPointerBehavior(axes_signal,EnterKeyFunction); iptSetPointerBehavior(object_figure,EnterKeyFunction); iptPointerManager(object_figure); object_figure.WindowButtonMotionFcn = {@FigureWindowButtonCallBackFunction,line_selection(1)}; object_figure.WindowButtonUpFcn = @FigureWindowButtonUpFunction; % Update the select limits axes_signal.UserData.SelectXLim = current_mouse_pointer_location(1,1)*[1,1]; % right click elseif strcmp(type_of_mouse_selection,alt) % replace menu if ~isempty(line_selection) delete(line_selection) end % Update the select limits axes_signal.UserData.SelectXLim = limits_of_plots; end % Mouse-click callback function function SelectLineButtonFunction(object_handle,~) % type of selection type_of_mouse_selection = object_figure.SelectionType; % If click left mouse button if strcmp(type_of_mouse_selection,normal) % Change the pointer when the mouse moves EnterKeyFunction = @(figure_handle, currentPoint) set(figure_handle,Pointer,hand); iptSetPointerBehavior(axes_signal,EnterKeyFunction); iptSetPointerBehavior(object_figure,EnterKeyFunction); iptPointerManager(object_figure); % Add window button motion object_figure.WindowButtonMotionFcn = {@FigureWindowButtonCallBackFunction,object_handle}; object_figure.Windo
Need help with assignments?
Our qualified writers can create original, plagiarism-free papers in any format you choose (APA, MLA, Harvard, Chicago, etc.)
Order from us for quality, customized work in due time of your choice.
Click Here To Order Now
|