Matlab GUI程序設計入門——信號發生器+時域分析


背景:學習matlab gui編程入門,完成一個基於GUIDE的圖形化界面程序,結合信號生成及分析等。

操作步驟:

1、新建程序

新建一個GUIDE程序

 這里選擇第一個選項,即創建一個空白的GUIDE模板(下面的三個選項為matlab自帶的3個guide模板,可以嘗試使用,但是空白模板更靈活一些)。

創建完成后,將會得到這樣一個面板,這就是進行matlab進行guide圖形化編程界面,在這里我們可以添加我們需要的各種控件到面板中。

可以看到上圖中的,左側有7行2列共14個常用的控件,添加時直接拖動即可,右側的帶油柵格的面板就是完成guide變成后,程序運行時的圖形化界面。

7行2列控件分別為:

普通按鈕 滑動條
單選按鈕 復選按鈕
可編輯文本 靜態文本
彈出式菜單 列表框
切換按鈕
坐標軸 面板
按鈕組 ActiveX控件

其中常用的控件包括:普通按鈕、滑動條、可編輯文本、靜態文本、坐標軸等。

2、圖形化界面編程

首先可以根據預計生成的面板的大小,拉伸編程面板。

然后將需要的控件拖拽到編程面板中,並進行布局。這里可以使用上方工具欄的“對其對象”工具,進行布局。如:

完成布局后可以雙擊各個控件,修改其屬性,控件的屬性面板如下:(以滑動條為例)

下面,對幾個比較重要的屬性進行介紹:

字體屬性:

滑動條變量取值范圍:

標注文字(String)&標簽(Tag):標簽是最重要的屬性,在代碼中對每一個控件進行操作時,都是以其tag作為索引。

單位(Units)&初始值(Value):單位一般會選擇charaters(絕對單位)和normalized(相對單位),選擇characters則輸出值為設定的最大最小值之間的實際值,選擇normalized則輸出值為歸一化后的0~1之間的值。

其他各個控件的屬性會有一些區別,和各個控件自身的特性有關,基本可以直接根據各個屬性的字面意思理解。

完成控件的添加、布局和屬性設定后,即可得到一個如下的界面圖:

3、m文件編程:

完成上述圖形編程后,點擊保存,則會自動根據我們的設定,生成一個m文件模板。

模板中主要有以下幾個部分:

1、程序初始化

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @signal_generator_OpeningFcn, ...
                   'gui_OutputFcn',  @signal_generator_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

注意,這部分自動生成的初始化代碼,一般不要修改!

2、程序open founction

% --- Executes just before signal_generator is made visible.
function signal_generator_OpeningFcn(hObject, eventdata, handles, varargin)

 這部分代碼會在完成圖形界面控件的創建后,首先運行,一般可以在這里添加一些自定義變量的初始化代碼等。

3、控件回調函數 callback

% --- Executes on button press in noise.
function noise_Callback(hObject, eventdata, handles)

這部分函數會分別對應於我們在圖形編程界面添加的每一個控件,當某一個控件發生操作時,程序對自動調用它對應的回調函數(類似於中斷回調函數)。

4、我們在生成的m文件中,自行添加自定義函數,完成我們需要執行的任務。將自定義函數在控件的回調函數中國調用即可。

 

以下為我完成的信號發生+時域分析 GUI程序的m文件代碼,僅供參考:(文件可以在我的博客中下載)

function varargout = signal_generator(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @signal_generator_OpeningFcn, ...
                   'gui_OutputFcn',  @signal_generator_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before signal_generator is made visible.
function signal_generator_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
global t;
global run;
% text windos init 
set(handles.fre_text,'string',get(handles.fre_slider,'value'));
set(handles.amp_text,'string',get(handles.amp_slider,'value'));
% x axes data 
%handles.x = linspace(0,0.03,441*3);
handles.x = linspace(0,1.5,44100*1.5);
% wave shape data
handles.shape = 2;
% data init
t = 0;
run = 0;
handles
guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = signal_generator_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;

function my_callback(handles)
global sound_y;
global plot_y;
global plot_x;
global t;
x = handles.x;
fre = get(handles.fre_slider,'value');
amp = get(handles.amp_slider,'value');
% white noise 
if handles.shape == 1
	sound_y = 0.5*amp*wgn(1,44100*1.5,1);
% sin singal
elseif handles.shape == 2
	sound_y = amp*sin(2*pi*fre*x);
% square singal
elseif handles.shape == 3
	sound_y = amp*square(2*pi*fre*x);
% trangle singal
elseif handles.shape == 4
	sound_y = amp*sawtooth(2*pi*fre*x,0.5);
end
plot_x = x(:,(1+t):(3*441+t));
plot_y = sound_y(:,(1+t):(3*441+t));
plot(handles.monitor,plot_x,plot_y);
set(handles.monitor,'ylimmode','manual');
set(handles.monitor,'ylim',[-2000,2000]);
% get peak value
peak_max = max(plot_y);
peak_min = min(plot_y);
peak_value = peak_max - peak_min;
set(handles.peak,'string',num2str(peak_value));
% get mean value
mean_value = mean(plot_y);
set(handles.mean,'string',num2str(mean_value));
% get rms value
rms_value = rms(plot_y);
set(handles.rms,'string',num2str(rms_value));
% % get frequency value
% fre_value = fft(plot_y);
% aaa = abs(fre_value);
% [m,p] = max(aaa);
% set(handles.std,'string',num2str(p));
% get std error value
std_value = std(plot_y);
set(handles.std,'string',num2str(std_value));


% --- Executes on button press in noise.
function noise_Callback(hObject, eventdata, handles)
handles.shape = 1;
guidata(hObject, handles);
my_callback(handles);

% --- Executes on button press in square.
function square_Callback(hObject, eventdata, handles)
handles.shape = 3;
guidata(hObject, handles);
my_callback(handles);

% --- Executes on button press in trangle.
function trangle_Callback(hObject, eventdata, handles)
handles.shape = 4;
guidata(hObject, handles);
my_callback(handles);

% --- Executes on button press in sin.
function sin_Callback(hObject, eventdata, handles)
handles.shape = 2;
guidata(hObject, handles);
my_callback(handles);

% --- Executes on slider movement.
function fre_slider_Callback(hObject, eventdata, handles)
set(handles.fre_text,'string',get(handles.fre_slider,'value'));
my_callback(handles);

% --- Executes during object creation, after setting all properties.
function fre_slider_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

function fre_text_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function fre_text_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on slider movement.
function amp_slider_Callback(hObject, eventdata, handles)
set(handles.amp_text,'string',get(handles.amp_slider,'value'));
my_callback(handles);

% --- Executes during object creation, after setting all properties.
function amp_slider_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

function amp_text_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function amp_text_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in run.
function run_Callback(hObject, eventdata, handles)
global t;
global run;
run = 1;
while run == 1
	t = t+2;
	my_callback(handles);
	set(handles.monitor,'xlimmode','manual');
	set(handles.monitor,'xlim',[(1+t)*0.000022,(3*441+t)*0.000022]);
	pause(0.01);
end

% --- Executes on button press in stop.
function stop_Callback(hObject, eventdata, handles)
global run;
run = 0;

% --- Executes on button press in play.
function play_Callback(hObject, eventdata, handles)
global sound_y;
sound(sound_y,44100); 

% --- Executes on button press in clear.
function clear_Callback(hObject, eventdata, handles)
delete(allchild(handles.monitor));



function peak_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function peak_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function mean_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function mean_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function rms_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function rms_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function std_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function std_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

——cloud over sky

 ——2020/3/23

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM