?? randomarray.m
字號:
%---------------------------------------------------------------
% randomarray.m (last updated 5/24/2005)
% written by Chunwei Jethro Lam, UIUC, jethrolam@gmail.com
%
% An interactive MATLAB GUI platform for realizing the pattern of a narrowband
% beamformer with a random array. User can specify the array geometry,
% directions of incoming signals, noise power, and the type of beamformer.
% Useful for gaining insight about collaborative beamforming in sensor
% networks and random arrays.
%
% Instructions and notes:
% 1. Specify an array on the grid map
% - ADD: select "Add" from list and click on map
% - EDIT: select sensor from list and click on map
% - DELETE: select sensor from list and push Delete button
% - SAVE: save array geometry to loc_data.mat as loc_data (Nx2)
% - LOAD: load array geomtry from loc_data.mat
% * first sensor cannot be deleted or edited
% * unit of measurement: wavelength of the carrier sinusoid
% * example: ULA with half wavelength spacing:
% loc_data = [0.5*ones(N,1); zeros(N,1)]
% 2. Specify the source signal, interference signals, and noise
% - ADD: select "Add Intf" from list and click on map
% - EDIT: select signal from list and click on map
% - DELETE: select signal from list and push Delete button
% * source and interference power are assumed to be 1.0
% * source signal cannot be deleted
% * adjust noise power by slide
% 3. Compute Beamformer based on current array geometry
% - select beamformer type: MATCH, MVDR, MPDR or MMSE
% - push "Compute Beamformer..." button to compute new beamformer
% 4. Display Beampattern, SNR gain, SIR gain
% - Choose polar or semilogy for beampattern plot
% * SNR gain = SNR_out / SNR_in
% * SIR gain = SIR_out / SIR_out
% * SNR = signal-to-noise ratio, SIR = signal-to-interference ratio
%---------------------------------------------------------------
function varargout = randomarray(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @randomarray_OpeningFcn, ...
'gui_OutputFcn', @randomarray_OutputFcn, ...
'gui_LayoutFcn', [], ...
'gui_Callback', []);
if nargin & isstr(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
%----------------------------------------------------
% OPENING FUNCTION
%----------------------------------------------------
function randomarray_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for randomarray
handles.output = hObject;
% Initialize sensor locations
handles.loc = zeros(1,2);
handles.N=1;
handles.tokenN=2; % default next action is ADD
set(handles.loclistbox,'Value',handles.N+1);
% Initialize signals and noise
handles.sig = pi/2;
handles.M=1;
handles.tokenM=1;
handles.sourceM=1;
set(handles.siglistbox,'Value',handles.M);
handles.noisepower=0.1;
% Initialize beamformer and beampattern
handles.wtype = 1; % 1=match, 2=mvdr, 3=mmse
handles.w = 1;
handles.needupdate = 0; % 0=no 1=yes
handles.theta=linspace(-pi,pi,1024);
handles.sincos=[cos(handles.theta); sin(handles.theta)];
handles.displaytype = 1; %1=polar, 2=semilogy
% Display sensors and loclistbox
displaymap(handles);
displayloclistbox(handles);
% Display signals and siglistbox
displaypattern(handles);
displaysiglistbox(handles);
% Display beamformer wlistbox and update button
displayupdate(handles)
displaywlistbox(handles);
% Display noise power
msg = ['Noise power = ',num2str(handles.noisepower,4)];
set(handles.noisemsgbox,'String',msg);
% Add ButtonDnFcn to map
set(handles.map,'ButtonDownFcn','randomarray(''AddEditSensor'',gcbo,[],guidata(gcbo))');
% Add ButtonDnFcn to pattern
set(handles.pattern,'ButtonDownFcn','randomarray(''AddEditSignal'',gcbo,[],guidata(gcbo))');
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes randomarray wait for user response (see UIRESUME)
% uiwait(handles.figure1);
%----------------------------------------------------
% DISPLAY LOCLISTBOX
%----------------------------------------------------
function displayloclistbox(handles)
lbmsg = strcat(num2str((1:handles.N)'),' (',num2str(handles.loc,3),')');
lbmsg = strvcat(lbmsg,'Add') ;
set(handles.loclistbox,'String',lbmsg);
%----------------------------------------------------
% DISPLAY SENSORS on MAP
%----------------------------------------------------
function displaymap(handles)
% Display Sensors on Map
axes(handles.map); cla; hold on; grid on; axis([-5 5 -5 5]);
plot(handles.loc(1:handles.N,1),handles.loc(1:handles.N,2),'bo');
if handles.tokenN <= handles.N
plot(handles.loc(handles.tokenN,1),handles.loc(handles.tokenN,2),'ro');
end
%----------------------------------------------------
% ADD or EDIT Sensors
%----------------------------------------------------
function AddEditSensor(hObject,eventdata,handles)
% Get mouse click position from map
axes(handles.map);
pt = get(gca,'CurrentPoint');
px = pt(1,1); py = pt(1,2);
if handles.tokenN > handles.N
% Add sensor
handles.N = handles.N+1;
handles.loc(handles.N,:)=[px py];
% Next action is ADD
handles.tokenN = handles.tokenN+1;
set(handles.loclistbox,'Value',handles.tokenN);
% Add dummy beamformer and display
handles.w=[handles.w; 0];
% Update beampattern
displaypattern(handles);
else
% Edit sensor indexed by tokenN, first sensor cannot be edited
if handles.tokenN~=1
handles.loc(handles.tokenN,:)=[px py];
end
% Update beampattern
displaypattern(handles);
end
% Turn on needupdate flag
handles.needupdate=1;
displayupdate(handles);
% Display sensors and loclistbox and wlistbox
displaymap(handles);
displayloclistbox(handles);
displaywlistbox(handles);
% Update handles structure
guidata(hObject, handles);
%----------------------------------------------------
% DELETE Sensors
%----------------------------------------------------
function locdelete_Callback(hObject, eventdata, handles)
% Delete sensor indexed by tokenN, first sensor cannot be deleted
if (handles.tokenN ~=1)&&(handles.tokenN<=handles.N)
% Delete sensors
handles.loc(handles.tokenN:(handles.N-1),:) = handles.loc((handles.tokenN+1):handles.N,:);
handles.loc(handles.N,:)=[];
% Delete beamformer weight
handles.w(handles.tokenN:(handles.N-1),:) = handles.w((handles.tokenN+1):handles.N,:);
handles.w(handles.N,:)=[];
% Decrease number of senosr by 1
handles.N = handles.N-1;
% Turn on Need udpate flag
handles.needupdate=1;
displayupdate(handles);
% Display map, Update loclistbox, Display pattern, Display beamformer
displaymap(handles);
displaypattern(handles);
displaywlistbox(handles);
displayloclistbox(handles);
% Update handles structure
guidata(hObject, handles);
end
%----------------------------------------------------
% CREATE LOCLISTBOX
%----------------------------------------------------
function loclistbox_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
%----------------------------------------------------
% LOCLISTBOX CLICK ACTION
%----------------------------------------------------
function loclistbox_Callback(hObject, eventdata, handles)
% Change tokenN according to the selected loclistbox item
handles.tokenN= get(hObject,'Value');
% Synchronize highlight with wtypelistbox
set(handles.wlistbox,'Value',handles.tokenN);
% Displaymap due to color changes
displaymap(handles);
% Update handles structure
guidata(hObject, handles);
%----------------------------------------------------
% SAVE
%----------------------------------------------------
function save_Callback(hObject, eventdata, handles)
% save handles.loc to loc_data.mat
loc_data = handles.loc;
save loc_data loc_data;
%------------------------------------------
% LOAD
%------------------------------------------
function load_Callback(hObject, eventdata, handles)
% load handles.loc from loc_data.mat
load loc_data loc_data;
handles.loc = loc_data;
handles.N = size(loc_data,1);
% next action is ADD by default
handles.tokenN = handles.N+1;
set(handles.loclistbox,'Value',handles.N+1);
% Add dummy beamformer
handles.w=[1; zeros(handles.N-1,1)];
% Turn on Need udpate flag
handles.needupdate=1;
displayupdate(handles);
% Display map, Update loclistbox, Display pattern, Display beamformer
displaymap(handles);
displaypattern(handles);
displayloclistbox(handles);
displaywlistbox(handles);
% Update handles structure
guidata(hObject, handles);
%------------------------------------------
% CREATE WTYPE MENU
%------------------------------------------
function wtype_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
%------------------------------------------
% WTYPE MENU CLICK ACTION
%------------------------------------------
function wtype_Callback(hObject, eventdata, handles)
handles.wtype = get(hObject,'Value');
handles.needupdate=1;
displayupdate(handles);
% Turn on Need udpate flag
handles.needupdate=1;
displayupdate(handles);
% Update handles structure
guidata(hObject, handles);
%------------------------------------------
% CREATE SIGLISTBOX
%------------------------------------------
function siglistbox_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor','white');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -